From 8fe8d7805108eabc2f34e37d6208a3618b4cc1a6 Mon Sep 17 00:00:00 2001 From: josh Date: Thu, 25 Jun 2009 19:12:25 +0000 Subject: [PATCH] realigned assembly a bit git-svn-id: svn://anubis/hos/trunk@18 5b3e749e-e535-0410-8002-a9bb6afbdfca --- kernel/boot.asm | 101 +++++++++++++++++++++++++++--------------------- 1 file changed, 56 insertions(+), 45 deletions(-) diff --git a/kernel/boot.asm b/kernel/boot.asm index aba9108..9f70e37 100644 --- a/kernel/boot.asm +++ b/kernel/boot.asm @@ -14,9 +14,11 @@ %define PAGE_SIZE 0x1000 ; 4KB pages -; Get these symbols from the linker +; Symbols from the linker extern _end, _bss +; Symbols from C +extern k_mbsave ;------------------------------------------------------- [section .text] @@ -30,80 +32,89 @@ start: ;************************************************************************** ;* Multiboot header data block * ;************************************************************************** - align 4 +align 4 multiboot_header: - dd MULTIBOOT_HEADER_MAGIC ; magic - dd MULTIBOOT_HEADER_FLAGS ; flags - dd -(MULTIBOOT_HEADER_MAGIC + MULTIBOOT_HEADER_FLAGS) ; checksum + dd MULTIBOOT_HEADER_MAGIC ; magic + dd MULTIBOOT_HEADER_FLAGS ; flags + dd -(MULTIBOOT_HEADER_MAGIC + MULTIBOOT_HEADER_FLAGS) ; checksum - dd multiboot_header - VIRTUAL_OFFSET ; header_addr - dd start - VIRTUAL_OFFSET ; load_addr - dd _bss - VIRTUAL_OFFSET ; load_end_addr - dd _end - VIRTUAL_OFFSET ; bss_end_addr - dd multiboot_entry - VIRTUAL_OFFSET ; entry_addr + dd multiboot_header - VIRTUAL_OFFSET ; header_addr + dd start - VIRTUAL_OFFSET ; load_addr + dd _bss - VIRTUAL_OFFSET ; load_end_addr + dd _end - VIRTUAL_OFFSET ; bss_end_addr + dd multiboot_entry - VIRTUAL_OFFSET ; entry_addr ;************************************************************************** ;* Resume execution * ;************************************************************************** multiboot_entry: - mov ax, 0x0700 + 'a' - mov [0xB8000+160*8+0*2], ax + mov ax, 0x0700 + 'a' + mov [0xB8000+160*8+0*2], ax - lgdt [gdtr_tmp32-VIRTUAL_OFFSET] ; load temporary GDTR - jmp KERNEL_CODE_32_TMP_SEG:segmented_start + lgdt [gdtr_tmp32-VIRTUAL_OFFSET] ; load temporary GDTR + jmp KERNEL_CODE_32_TMP_SEG:segmented_start ;************************************************************************** ;* At this point address 0xE000_0000 is mapped to physical address 0x0 * ;************************************************************************** segmented_start: - mov cx, KERNEL_DATA_32_TMP_SEG - mov ss, cx - mov ds, cx - mov es, cx - mov gs, cx - mov fs, cx - mov esp, TEMPORARY_STACK_VIRTUAL-4 ; set up temporary stack space + mov cx, KERNEL_DATA_32_TMP_SEG + mov ss, cx + mov ds, cx + mov es, cx + mov gs, cx + mov fs, cx + mov esp, TEMPORARY_STACK_VIRTUAL-4 ; set up temporary stack space - mov ax, 0x0700 + 'b' - mov [VIRTUAL_OFFSET+0xB8000+160*8+1*2], ax + mov ax, 0x0700 + 'b' + mov [VIRTUAL_OFFSET+0xB8000+160*8+1*2], ax + +; add ebx, VIRTUAL_OFFSET +; push eax +; push ebx ; pointer to multiboot info struct +; call k_mbsave +; add esp, 8 + +; mov ax, 0x0700 + 'c' +; mov [VIRTUAL_OFFSET+0xB8000+160*8+2*2], ax idle_loop: hlt - jmp idle_loop + jmp idle_loop ;------------------------------------------------------- [section .rodata] gdtr_tmp32: - dw gdt_end_tmp32-gdt_tmp32-1 - dd gdt_tmp32-VIRTUAL_OFFSET + dw gdt_end_tmp32-gdt_tmp32-1 + dd gdt_tmp32-VIRTUAL_OFFSET -gdt_tmp32: ; 0 = null descriptor - dd 0 - dd 0 +gdt_tmp32: ; 0 = null descriptor + dd 0 + dd 0 ; a base of 0x2000_0000, when added to 0xE000_0000 will produce ; 0x0000_0000 physical before paging in effect KERNEL_CODE_32_TMP_SEG equ $-gdt_tmp32 ; 8 - db 0xff ;limit 7:0 - db 0xff ;limit 15:8 - db 0x00 ;base 7:0 - db 0x00 ;base 15:8 - db 0x00 ;base 23:16 - db 0x9a ;access - db 0xcf ;flags / limit 19:16 - db 0x20 ;base 31:24 + db 0xff ; limit 7:0 + db 0xff ; limit 15:8 + db 0x00 ; base 7:0 + db 0x00 ; base 15:8 + db 0x00 ; base 23:16 + db 0x9a ; access + db 0xcf ; flags / limit 19:16 + db 0x20 ; base 31:24 KERNEL_DATA_32_TMP_SEG equ $-gdt_tmp32 ; 16 - db 0xff ;limit 7:0 - db 0xff ;limit 15:8 - db 0x00 ;base 7:0 - db 0x00 ;base 15:8 - db 0x00 ;base 23:16 - db 0x92 ;access - db 0xcf ;flags / limit 19:16 - db 0x20 ;base 31:24 + db 0xff ; limit 7:0 + db 0xff ; limit 15:8 + db 0x00 ; base 7:0 + db 0x00 ; base 15:8 + db 0x00 ; base 23:16 + db 0x92 ; access + db 0xcf ; flags / limit 19:16 + db 0x20 ; base 31:24 gdt_end_tmp32: