From 37db7181daf1cc10683de24f6203e595b2ac49bc Mon Sep 17 00:00:00 2001 From: Vegard Storheil Eriksen Date: Fri, 29 Jan 2010 20:23:53 +0100 Subject: Copy multiboot information. --- kernel/entry.c | 32 ++++++++++++++++++++++++++++---- 1 file changed, 28 insertions(+), 4 deletions(-) (limited to 'kernel/entry.c') diff --git a/kernel/entry.c b/kernel/entry.c index 61ac82b..28bdb12 100644 --- a/kernel/entry.c +++ b/kernel/entry.c @@ -8,6 +8,7 @@ extern void addr_load_virt; extern void addr_load_virt_end; extern void entry_stack; +extern void entry_multiboot; extern uint32_t entry_pagedir[]; extern uint32_t entry_pagetable_low[]; @@ -26,8 +27,9 @@ asm( void entry_serial_out(char* str); void entry_serial_out_hex(uint32_t x); +void entry_copy_multiboot(multiboot_info_t* mb_info); -void entry_main(uint32_t mb_magic, multiboot_info* mb_info) { +void entry_main(uint32_t mb_magic, multiboot_info_t* mb_info) { entry_serial_out("entry_main()\n"); if(mb_magic != 0x2badb002) { entry_serial_out("Multiboot magic word is wrong!\n"); @@ -35,8 +37,9 @@ void entry_main(uint32_t mb_magic, multiboot_info* mb_info) { } entry_serial_out("Multiboot ok\n"); - // TODO: Copy multiboot information. + entry_copy_multiboot(mb_info); + /* entry_serial_out("Flags: "); entry_serial_out_hex(mb_info->flags); @@ -49,6 +52,7 @@ void entry_main(uint32_t mb_magic, multiboot_info* mb_info) { entry_serial_out("Module addr: "); entry_serial_out_hex(mb_info->mods_addr->mod_start); + */ // Create initial page tables. for(unsigned int i = 0; i < 1024; i++) { @@ -67,6 +71,8 @@ void entry_main(uint32_t mb_magic, multiboot_info* mb_info) { } } + entry_pagetable_high[((uint32_t)&multiboot_info & 0x003ff000) >> 12] = (uint32_t)&entry_multiboot | 0x003; + entry_pagedir[(uint32_t)&addr_phys >> 22] = (uint32_t)&entry_pagetable_low | 0x007; entry_pagedir[(uint32_t)&addr_virt >> 22] = (uint32_t)&entry_pagetable_high | 0x003; @@ -80,7 +86,7 @@ void entry_main(uint32_t mb_magic, multiboot_info* mb_info) { "mov %%cr0, %0\n" "or $0x80000000, %0\n" "mov %0, %%cr0\n" - : : "r" (&entry_pagedir) : "%0" + :: "r" (&entry_pagedir) : "%0" ); // TODO: Check that segments are loaded and mapped right. @@ -98,7 +104,25 @@ void entry_main(uint32_t mb_magic, multiboot_info* mb_info) { while(1); } -#define outb(port, value) asm volatile("out %b0,%w1" : : "a" (value), "d" (port)); +#define memcpy(source, target, size) asm volatile( \ + "cld\n" \ + "rep movsd\n" \ + :: "S" (source), "D" (target), "c" (size / 4) \ + : "flags", "memory") + +void entry_copy_multiboot(multiboot_info_t* mb_info) { + // Copy multiboot structure. + memcpy(mb_info, &entry_multiboot, sizeof(multiboot_info_t)); + uint32_t low_p = (uint32_t)&entry_multiboot + sizeof(multiboot_info_t); + uint32_t high_p = (uint32_t)&multiboot_info + sizeof(multiboot_info_t); + // Copy module structures. + memcpy(mb_info->mods_addr, low_p, mb_info->mods_count * sizeof(multiboot_module_t)); + multiboot_info.mods_addr = (multiboot_module_t*)high_p; + low_p += mb_info->mods_count * sizeof(multiboot_module_t); + high_p += mb_info->mods_count * sizeof(multiboot_module_t); +} + +#define outb(port, value) asm volatile("out %b0,%w1" : : "a" (value), "d" (port)) void entry_serial_out(char* str) { while(*str) { -- cgit v1.2.3