diff options
author | Jon Santmyer <jon@jonsantmyer.com> | 2024-03-11 21:30:31 -0400 |
---|---|---|
committer | Jon Santmyer <jon@jonsantmyer.com> | 2024-03-11 21:30:31 -0400 |
commit | d1ff7bcc91886626dc9060ec5fb67ee102ab7c1d (patch) | |
tree | 8f0b5cd8aad31089131785dc6e37b659490f9955 /boot/cmdline.c | |
download | jove-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.c | 50 |
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; + } +} |