diff --git a/hermit/arch/x86/kernel/processor.c b/hermit/arch/x86/kernel/processor.c index 5f07e442a..7ac21db37 100644 --- a/hermit/arch/x86/kernel/processor.c +++ b/hermit/arch/x86/kernel/processor.c @@ -167,25 +167,16 @@ static void fpu_init_xsave(union fpu_state* fpu) xs->fxsave.mxcsr = 0x1f80; } -static char* cmdline = 0; - static uint32_t get_frequency_from_mbinfo(void) { if (mb_info && (mb_info->flags & MULTIBOOT_INFO_CMDLINE)) { - int i; - - cmdline = (char*) vma_alloc(PAGE_SIZE, VMA_READ|VMA_WRITE|VMA_CACHEABLE); - if (BUILTIN_EXPECT(!cmdline, 0)) + // search in the command line for cpu frequency + char* found = strstr((char*) mb_info->cmdline, "-freq"); + if (!found) return 0; - page_map((size_t) cmdline, mb_info->cmdline & PAGE_MASK, 1, PG_GLOBAL|PG_RW|PG_PRESENT); - cmdline = (char*) ((size_t) cmdline | (mb_info->cmdline & ~PAGE_MASK)); - - for(i=0; (cmdline[i] != '\0') && (cmdline[i] != ' '); i++) - ; - - return atoi(cmdline+i+1); + return atoi(found+strlen("-freq")); } return 0; diff --git a/hermit/arch/x86/mm/page.c b/hermit/arch/x86/mm/page.c index 48b781dfe..42ec8fcdb 100644 --- a/hermit/arch/x86/mm/page.c +++ b/hermit/arch/x86/mm/page.c @@ -41,6 +41,7 @@ #include #include +#include #include #include @@ -303,6 +304,11 @@ int page_init(void) kputs("Detect Go runtime! Consequently, HermitCore zeroed heap.\n"); } + if (mb_info && ((mb_info->cmdline & PAGE_MASK) != ((size_t) mb_info & PAGE_MASK))) { + kprintf("Map multiboot cmdline 0x%x into the virtual address space\n", mb_info->cmdline); + page_map((size_t) mb_info->cmdline & PAGE_MASK, mb_info->cmdline & PAGE_MASK, 1, PG_GLOBAL|PG_RW|PG_PRESENT); + } + /* Replace default pagefault handler */ irq_uninstall_handler(14); irq_install_handler(14, page_fault_handler); diff --git a/hermit/mm/memory.c b/hermit/mm/memory.c index eb6ad9366..e5c110367 100644 --- a/hermit/mm/memory.c +++ b/hermit/mm/memory.c @@ -347,6 +347,8 @@ int memory_init(void) last->end = end_addr; } } + + //TODO: mb_info and mb_info->cmdline should be marked as reserevd } } diff --git a/hermit/mm/vma.c b/hermit/mm/vma.c index a63b69cee..b8bfcb97a 100644 --- a/hermit/mm/vma.c +++ b/hermit/mm/vma.c @@ -75,9 +75,15 @@ int vma_init(void) #endif if (mb_info) { - ret = vma_add((size_t)mb_info, (size_t)mb_info + PAGE_SIZE, VMA_READ|VMA_WRITE); + ret = vma_add((size_t)mb_info & PAGE_MASK, ((size_t)mb_info & PAGE_MASK) + PAGE_SIZE, VMA_READ|VMA_WRITE); if (BUILTIN_EXPECT(ret, 0)) goto out; + + if ((mb_info->cmdline & PAGE_MASK) != ((size_t) mb_info & PAGE_MASK)) { + ret = vma_add((size_t)mb_info->cmdline & PAGE_MASK, ((size_t)mb_info->cmdline & PAGE_MASK) + PAGE_SIZE, VMA_READ|VMA_WRITE); + if (BUILTIN_EXPECT(ret, 0)) + goto out; + } } out: diff --git a/hermit/tools/proxy.c b/hermit/tools/proxy.c index 81bef0175..2a9887bb5 100644 --- a/hermit/tools/proxy.c +++ b/hermit/tools/proxy.c @@ -72,6 +72,7 @@ static unsigned int qemu = 0; static pid_t id = 0; static unsigned int port = HERMIT_PORT; static char tmpname[] = "/tmp/hermit-XXXXXX"; +static char cmdline[MAX_PATH] = ""; extern char **environ; @@ -109,6 +110,7 @@ static char* cpufreq(void) const char* pcreErrorStr = NULL; int creErrorOffset = 0; char line[2048]; + const char* match = NULL; int rc, results[10]; pcre* reCompiled = pcre_compile(pattern, PCRE_ANCHORED, &pcreErrorStr, &creErrorOffset, NULL); @@ -124,13 +126,13 @@ static char* cpufreq(void) if ((rc = pcre_exec(reCompiled, 0, line, 2048, 0, 0, results, 10)) < 0) continue; - const char* match = NULL; pcre_get_substring(line, results, rc, 1, &(match)); - + snprintf(cmdline, MAX_PATH, "-freq%s", match); fclose(fp); + pcre_free_substring(match); pcre_free(reCompiled); - return (char*)match; + return cmdline; } return "0";