redesign of the boot code of the application processor

This commit is contained in:
Stefan Lankes 2011-07-18 08:35:57 +02:00
parent 1fb1379a9c
commit e7c0f53562

View file

@ -22,55 +22,10 @@
[BITS 16]
SECTION .text
GLOBAL _start
ORG 0x10000
ORG 0x7000
_start:
jmp _realstart
struc GDT_STR
s0_15: resw 1
b0_15: resw 1
b16_23: resb 1
flags: resb 1
access: resb 1
b24_31: resb 1
endstruc
gdt_start dw gdt_size
gdt_ptr dd dummy_descriptor
dummy_descriptor: istruc GDT_STR
at s0_15, dw 0
at b0_15, dw 0
at b16_23, db 0
at flags, db 0
at access, db 0
at b24_31, db 0
iend
; 4GB 32-bit code , 9ah = 10011010b = Present, DPL 00,No System, Code Exec/Read.
code32_descriptor: istruc GDT_STR
at s0_15, dw 0x0ffff
at b0_15, dw 0
at b16_23, db 0
at flags, db 0x9a
at access, db 0xcf
at b24_31, db 0
iend
; 4GB 32-bit data, 92h = 10010010b = Present, DPL 00, No System, Data Read/Write
data32_descriptor: istruc GDT_STR
at s0_15, dw 0x0ffff
at b0_15, dw 0
at b16_23, db 0
at flags, db 0x92
at access, db 0xcf
at b24_31, db 0
iend
gdt_size equ $ - (dummy_descriptor) - 1
_realstart:
lgdt [gdt_start]
cli
lgdt [gdtr]
; switch to protected mode by setting PE bit
mov eax, cr0
@ -78,28 +33,41 @@ _realstart:
mov cr0, eax
; far jump to the 32bit code
jmp dword 0x08 : _pmstart
jmp dword codesel : _pmstart
[BITS 32]
_pmstart:
cli
xor eax, eax
mov ax, 0x10
mov ax, datasel
mov ds, ax
mov es, ax
mov fs, ax
mov gs, ax
mov ss, ax
; enable cache and turn on FPU exceptions
mov eax, cr0
and eax, 0x9fffffff
or eax, 0x20
mov cr0, eax
; clear the current pgd entry
xor eax, eax
mov cr3, eax
; set stack pointer
mov esp, 0xDEADBEEF
xor eax, eax
xor ebx, ebx
jmp 0x08 : 0xDEADC0DE
mov esp, 0xDEADBEEF
push DWORD 0xDEADDEAD
push DWORD 0x00 ; dummy value
jmp codesel : 0xDEADC0DE
jmp $
gdtr: ; descritor table
dw gdt_end-gdt-1 ; limit
dd gdt ; base adresse
gdt:
dd 0,0 ; null descriptor
codesel equ $-gdt
dw 0xFFFF ; segment size 0..15
dw 0x0000 ; segment address 0..15
db 0x00 ; segment address 16..23
db 0x9A ; access permissions und type
db 0xCF ; additional information and segment size 16...19
db 0x00 ; segment address 24..31
datasel equ $-gdt
dw 0xFFFF ; segment size 0..15
dw 0x0000 ; segment address 0..15
db 0x00 ; segment address 16..23
db 0x92 ; access permissions and type
db 0xCF ; additional informationen and degment size 16...19
db 0x00 ; segment address 24..31
gdt_end: