summaryrefslogtreecommitdiff
path: root/kernel/entry.c
diff options
context:
space:
mode:
authorVegard Storheil Eriksen <zyp@jvnv.net>2010-01-29 20:23:53 +0100
committerVegard Storheil Eriksen <zyp@jvnv.net>2010-01-29 20:23:53 +0100
commit37db7181daf1cc10683de24f6203e595b2ac49bc (patch)
tree6fd009ef0206a3b2a836fd7d0b2e816f02422816 /kernel/entry.c
parent81e59db8151915250df68f79f7afde1f1ce8dac3 (diff)
Copy multiboot information.
Diffstat (limited to 'kernel/entry.c')
-rw-r--r--kernel/entry.c32
1 files changed, 28 insertions, 4 deletions
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) {