The following changes since commit 2a9b3cdc47dbde55f9d125fde3e11832ca4c0b91:
Avoid double declarations, integer overflow, and use branch hints (2015-10-30 16:02:29 -0400)
are available in the git repository at:
g...@github.com:dlibenzi/akaros boot_cmdline
for you to fetch changes up to 51b5249fe747f5ecd0a2d4c21da3d33d2c3a7217:
Added support for multiboot protocol command line extraction (2015-11-02 19:14:32 -0800)
----------------------------------------------------------------
Davide Libenzi (1):
Added support for multiboot protocol command line extraction
kern/include/init.h | 11 +++++++++++
kern/include/string.h | 2 +-
kern/src/init.c | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++
kern/src/strstr.c | 4 ++--
4 files changed, 69 insertions(+), 3 deletions(-)
create mode 100644 kern/include/init.h
diff --git a/kern/include/init.h b/kern/include/init.h
new file mode 100644
index 0000000..ee364b5
--- /dev/null
+++ b/kern/include/init.h
@@ -0,0 +1,11 @@
+/* Copyright (c) 2015 Google Inc
+ * See LICENSE for details.
+ */
+
+#pragma once
+
+const char *get_boot_option(const char *base, const char *option, char *param,
+ size_t max_param);
+void _panic(const char *file, int line, const char *fmt, ...);
+void _warn(const char *file, int line, const char *fmt, ...);
diff --git a/kern/include/string.h b/kern/include/string.h
index efcc890..ab5ac5f 100644
--- a/kern/include/string.h
+++ b/kern/include/string.h
@@ -5,7 +5,7 @@
int strlen(const char *s);
int strnlen(const char *s, size_t size);
-char *strstr(char *s1, char *s2);
+const char *strstr(const char *s1, const char *s2);
/* zra : These aren't being used, and they are dangerous, so I'm rm'ing them
STRING strcpy(STRING dst, const STRING src);
diff --git a/kern/src/init.c b/kern/src/init.c
index ba88555..4d1c986 100644
--- a/kern/src/init.c
+++ b/kern/src/init.c
@@ -46,11 +46,62 @@
#include <acpi.h>
#include <coreboot_tables.h>
+#define MAX_BOOT_CMDLINE_SIZE 4096
+
int booting = 1;
struct sysinfo_t sysinfo;
+static char boot_cmdline[MAX_BOOT_CMDLINE_SIZE];
+
static void run_linker_funcs(void);
static int run_init_script(void);
+const char *get_boot_option(const char *base, const char *option, char *param,
+ size_t max_param)
+{
+ const char *opt;
+
+ if (!base)
+ base = boot_cmdline;
+ else
+ base++;
+ opt = strstr(base, option);
+ if (opt) {
+ const char *arg = opt;
+
+ for (; *arg && (strchr("= \t", *arg) == NULL); arg++);
+ if (*arg == '=') {
+ size_t psize;
+ const char *eoa;
+
+ arg++;
+ if (*arg == '\'') {
+ arg++;
+ for (eoa = arg; *eoa && (*eoa != '\''); eoa++);
+ } else {
+ for (eoa = arg; *eoa && (strchr(" \t", *eoa) == NULL); eoa++);
+ }
+ psize = eoa - arg;
+ psize = MIN(psize, max_param - 1);
+ memcpy(param, arg, psize);
+ param[psize] = 0;
+ } else if (max_param) {
+ *param = 0;
+ }
+ }
+
+ return opt;
+}
+
+static void extract_multiboot_cmdline(struct multiboot_info *mbi)
+{
+ if (mbi && (mbi->flags & MULTIBOOT_INFO_CMDLINE) && mbi->cmdline) {
+ const char *cmdln = (const char *) KADDR(mbi->cmdline);
+
+ strncpy(boot_cmdline, cmdln, sizeof(boot_cmdline));
+ boot_cmdline[sizeof(boot_cmdline) - 1] = 0;
+ }
+}
+
void kernel_init(multiboot_info_t *mboot_info)
{
extern char edata[], end[];
@@ -62,9 +113,13 @@ void kernel_init(multiboot_info_t *mboot_info)
* memory, we may clobber it. */
multiboot_kaddr = (struct multiboot_info*)((physaddr_t)mboot_info
+ KERNBASE);
+ extract_multiboot_cmdline(multiboot_kaddr);
+
cons_init();
print_cpuinfo();
+ printk("Boot Command Line: '%s'\n", boot_cmdline);
+
exception_table_init();
cache_init(); // Determine systems's cache properties
pmem_init(multiboot_kaddr);
diff --git a/kern/src/strstr.c b/kern/src/strstr.c
index 10fbf3a..4904469 100644
--- a/kern/src/strstr.c
+++ b/kern/src/strstr.c
@@ -32,9 +32,9 @@
* Return pointer to first occurrence of s2 in s1,
* 0 if none
*/
-char *strstr(char *s1, char *s2)
+const char *strstr(const char *s1, const char *s2)
{
- char *p;
+ const char *p;
int f, n;
f = s2[0];