summaryrefslogtreecommitdiffstats
path: root/boot/cmdline.c
diff options
context:
space:
mode:
authorJon Santmyer <jon@jonsantmyer.com>2024-03-11 21:30:31 -0400
committerJon Santmyer <jon@jonsantmyer.com>2024-03-11 21:30:31 -0400
commitd1ff7bcc91886626dc9060ec5fb67ee102ab7c1d (patch)
tree8f0b5cd8aad31089131785dc6e37b659490f9955 /boot/cmdline.c
downloadjove-kernel-d1ff7bcc91886626dc9060ec5fb67ee102ab7c1d.tar.gz
jove-kernel-d1ff7bcc91886626dc9060ec5fb67ee102ab7c1d.tar.bz2
jove-kernel-d1ff7bcc91886626dc9060ec5fb67ee102ab7c1d.zip
usermode capable kernel with logging syscall
Diffstat (limited to 'boot/cmdline.c')
-rw-r--r--boot/cmdline.c50
1 files changed, 50 insertions, 0 deletions
diff --git a/boot/cmdline.c b/boot/cmdline.c
new file mode 100644
index 0000000..aa6aa05
--- /dev/null
+++ b/boot/cmdline.c
@@ -0,0 +1,50 @@
+#include "cmdline.h"
+#include "boot.h"
+#include "mem/memory.h"
+#include "lib/string.h"
+#include "io/log.h"
+
+static struct HashTable s_cmdline_kernel;
+
+const char*
+cmdline_get(const char *key)
+{
+ const char** value = hashtable_get(&s_cmdline_kernel, key, const char*);
+ if(value == NULL) return NULL;
+ return *value;
+}
+
+void
+cmdline_kernel_setup(void)
+{
+ hashtable_news(&s_cmdline_kernel, const char*);
+ size_t cmdi = 0;
+
+ const char *cmdline = boot_kernel_cmdline;
+ if(cmdline == 0) return;
+
+ while(cmdline[cmdi] != 0)
+ {
+ size_t keyi = cmdi;
+ while(cmdline[keyi] != '=' && cmdline[keyi] != 0) keyi++;
+ if(cmdline[keyi] == 0 || keyi == 0) {
+ klogf("kernel cmdline is empty or malformed; skipping.\n");
+ break;
+ }
+
+ size_t keylen = keyi - cmdi;
+ char *key = mem_alloc(keylen);
+ memcpy(key, &cmdline[cmdi], keylen);
+
+ size_t valuei = keyi + 1;
+ while(cmdline[valuei] != ' ' && cmdline[valuei] != 0) valuei++;
+
+ size_t valuelen = (valuei - keyi) - 1;
+ char *value = mem_alloc(valuelen);
+ if(valuelen != 0) memcpy(value, &cmdline[keyi + 1], valuelen);
+
+ klogf("%s = %s\n", key, value);
+ hashtable_insert(&s_cmdline_kernel, key, &value);
+ cmdi = valuei + 1;
+ }
+}