]>
Commit | Line | Data |
---|---|---|
eee8da2e | 1 | org 0xA8000 |
f23390bf JW |
2 | [bits 16] |
3 | entry: | |
1458b275 JW |
4 | mov ax, 0xA800 ; Take us out of flat unreal mode, |
5 | mov ds, ax ; and put us in true real mode. | |
6 | mov es, ax | |
f23390bf JW |
7 | mov fs, ax |
8 | mov gs, ax | |
9 | mov ss, ax | |
eee8da2e | 10 | jmp 0xA800:(entry2-0xA8000) ; Long jump to a correct cs. |
f23390bf | 11 | entry2: |
eee8da2e | 12 | lgdt [(gdtr-0xA8000)] ; Set up a new GDT. |
f23390bf JW |
13 | mov eax, 0x1 |
14 | mov cr0, eax ; ... and enter pmode! | |
eee8da2e | 15 | jmp long 0x10:continue ; Now longjmp into the new code. |
f23390bf JW |
16 | [bits 32] |
17 | continue: | |
f23390bf JW |
18 | mov ax, 0x08 ; Set up segment selectors. |
19 | mov ds, ax | |
20 | mov es, ax | |
21 | mov fs, ax | |
22 | mov gs, ax | |
23 | mov ss, ax | |
1458b275 | 24 | mov esp, [dataptr] ; Load stack pointer. |
015cd976 | 25 | |
f2b87dd6 | 26 | mov eax, [dataptr+4] ; Load target jump address |
1458b275 | 27 | call eax ; then jump into C. |
015cd976 | 28 | |
f23390bf JW |
29 | rsm ; and leave SMM |
30 | ||
31 | align 0x4 | |
32 | gdtr: | |
9b8c947b | 33 | db 0x17, 0x00 |
eee8da2e | 34 | dd gdt |
f23390bf JW |
35 | align 0x4 |
36 | gdt: | |
1458b275 | 37 | db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ; initial null entry |
f23390bf JW |
38 | db 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x93, 0xCF, 0x00 ; data segment |
39 | db 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x9B, 0xCF, 0x00 ; code segment | |
f23390bf | 40 | |
4bea7daf JW |
41 | dataptr: |
42 | ; 4 bytes of stack top | |
035d7af7 JW |
43 | ; 4 bytes of C entry point |
44 | ; These show up |