diff --git a/tools/smp_setup.asm b/tools/smp_setup.asm index 744fe159..7398029c 100644 --- a/tools/smp_setup.asm +++ b/tools/smp_setup.asm @@ -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: +