realigned assembly a bit

git-svn-id: svn://anubis/hos/trunk@18 5b3e749e-e535-0410-8002-a9bb6afbdfca
This commit is contained in:
josh 2009-06-25 19:12:25 +00:00
parent 1b0da72e5a
commit 8fe8d78051

View File

@ -14,9 +14,11 @@
%define PAGE_SIZE 0x1000 ; 4KB pages %define PAGE_SIZE 0x1000 ; 4KB pages
; Get these symbols from the linker ; Symbols from the linker
extern _end, _bss extern _end, _bss
; Symbols from C
extern k_mbsave
;------------------------------------------------------- ;-------------------------------------------------------
[section .text] [section .text]
@ -30,80 +32,89 @@ start:
;************************************************************************** ;**************************************************************************
;* Multiboot header data block * ;* Multiboot header data block *
;************************************************************************** ;**************************************************************************
align 4 align 4
multiboot_header: multiboot_header:
dd MULTIBOOT_HEADER_MAGIC ; magic dd MULTIBOOT_HEADER_MAGIC ; magic
dd MULTIBOOT_HEADER_FLAGS ; flags dd MULTIBOOT_HEADER_FLAGS ; flags
dd -(MULTIBOOT_HEADER_MAGIC + MULTIBOOT_HEADER_FLAGS) ; checksum dd -(MULTIBOOT_HEADER_MAGIC + MULTIBOOT_HEADER_FLAGS) ; checksum
dd multiboot_header - VIRTUAL_OFFSET ; header_addr dd multiboot_header - VIRTUAL_OFFSET ; header_addr
dd start - VIRTUAL_OFFSET ; load_addr dd start - VIRTUAL_OFFSET ; load_addr
dd _bss - VIRTUAL_OFFSET ; load_end_addr dd _bss - VIRTUAL_OFFSET ; load_end_addr
dd _end - VIRTUAL_OFFSET ; bss_end_addr dd _end - VIRTUAL_OFFSET ; bss_end_addr
dd multiboot_entry - VIRTUAL_OFFSET ; entry_addr dd multiboot_entry - VIRTUAL_OFFSET ; entry_addr
;************************************************************************** ;**************************************************************************
;* Resume execution * ;* Resume execution *
;************************************************************************** ;**************************************************************************
multiboot_entry: multiboot_entry:
mov ax, 0x0700 + 'a' mov ax, 0x0700 + 'a'
mov [0xB8000+160*8+0*2], ax mov [0xB8000+160*8+0*2], ax
lgdt [gdtr_tmp32-VIRTUAL_OFFSET] ; load temporary GDTR lgdt [gdtr_tmp32-VIRTUAL_OFFSET] ; load temporary GDTR
jmp KERNEL_CODE_32_TMP_SEG:segmented_start jmp KERNEL_CODE_32_TMP_SEG:segmented_start
;************************************************************************** ;**************************************************************************
;* At this point address 0xE000_0000 is mapped to physical address 0x0 * ;* At this point address 0xE000_0000 is mapped to physical address 0x0 *
;************************************************************************** ;**************************************************************************
segmented_start: segmented_start:
mov cx, KERNEL_DATA_32_TMP_SEG mov cx, KERNEL_DATA_32_TMP_SEG
mov ss, cx mov ss, cx
mov ds, cx mov ds, cx
mov es, cx mov es, cx
mov gs, cx mov gs, cx
mov fs, cx mov fs, cx
mov esp, TEMPORARY_STACK_VIRTUAL-4 ; set up temporary stack space mov esp, TEMPORARY_STACK_VIRTUAL-4 ; set up temporary stack space
mov ax, 0x0700 + 'b' mov ax, 0x0700 + 'b'
mov [VIRTUAL_OFFSET+0xB8000+160*8+1*2], ax 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: idle_loop:
hlt hlt
jmp idle_loop jmp idle_loop
;------------------------------------------------------- ;-------------------------------------------------------
[section .rodata] [section .rodata]
gdtr_tmp32: gdtr_tmp32:
dw gdt_end_tmp32-gdt_tmp32-1 dw gdt_end_tmp32-gdt_tmp32-1
dd gdt_tmp32-VIRTUAL_OFFSET dd gdt_tmp32-VIRTUAL_OFFSET
gdt_tmp32: ; 0 = null descriptor gdt_tmp32: ; 0 = null descriptor
dd 0 dd 0
dd 0 dd 0
; a base of 0x2000_0000, when added to 0xE000_0000 will produce ; a base of 0x2000_0000, when added to 0xE000_0000 will produce
; 0x0000_0000 physical before paging in effect ; 0x0000_0000 physical before paging in effect
KERNEL_CODE_32_TMP_SEG equ $-gdt_tmp32 ; 8 KERNEL_CODE_32_TMP_SEG equ $-gdt_tmp32 ; 8
db 0xff ;limit 7:0 db 0xff ; limit 7:0
db 0xff ;limit 15:8 db 0xff ; limit 15:8
db 0x00 ;base 7:0 db 0x00 ; base 7:0
db 0x00 ;base 15:8 db 0x00 ; base 15:8
db 0x00 ;base 23:16 db 0x00 ; base 23:16
db 0x9a ;access db 0x9a ; access
db 0xcf ;flags / limit 19:16 db 0xcf ; flags / limit 19:16
db 0x20 ;base 31:24 db 0x20 ; base 31:24
KERNEL_DATA_32_TMP_SEG equ $-gdt_tmp32 ; 16 KERNEL_DATA_32_TMP_SEG equ $-gdt_tmp32 ; 16
db 0xff ;limit 7:0 db 0xff ; limit 7:0
db 0xff ;limit 15:8 db 0xff ; limit 15:8
db 0x00 ;base 7:0 db 0x00 ; base 7:0
db 0x00 ;base 15:8 db 0x00 ; base 15:8
db 0x00 ;base 23:16 db 0x00 ; base 23:16
db 0x92 ;access db 0x92 ; access
db 0xcf ;flags / limit 19:16 db 0xcf ; flags / limit 19:16
db 0x20 ;base 31:24 db 0x20 ; base 31:24
gdt_end_tmp32: gdt_end_tmp32: