+
+static void
+ram_init (void)
+{
+ /* The "BSS" is a segment that should be initialized to zeros.
+ It isn't actually stored on disk or zeroed by the kernel
+ loader, so we have to zero it ourselves.
+
+ The start and end of the BSS segment is recorded by the
+ linker as _start_bss and _end_bss. See kernel.lds. */
+ extern char _start_bss, _end_bss;
+ memset (&_start_bss, 0, &_end_bss - &_start_bss);
+
+ /* Get RAM size from loader. */
+ ram_pages = *(uint32_t *) ptov (LOADER_RAM_PAGES);
+}
+\f
+/* This should be sufficient because the command line buffer is
+ only 128 bytes and arguments are space-delimited. */
+#define ARGC_MAX 64
+
+int argc;
+char *argv[ARGC_MAX + 1];
+
+static void
+argv_init (void)
+{
+ char *cmd_line = ptov (LOADER_CMD_LINE);
+ char *arg, *pos;
+
+ for (arg = strtok_r (cmd_line, " \t\r\n\v", &pos); arg != NULL;
+ arg = strtok_r (NULL, " \t\r\n\v", &pos))
+ {
+ ASSERT (argc < ARGC_MAX);
+ argv[argc++] = arg;
+ }
+ argv[argc] = NULL;
+}