]>
Commit | Line | Data |
---|---|---|
eee8da2e | 1 | org 0xA8000 |
f23390bf JW |
2 | [bits 16] |
3 | entry: | |
f23390bf JW |
4 | mov ax, 0xA800 |
5 | mov ds, ax ; Take us out of flat unreal mode, and | |
6 | mov es, ax ; put us in true real mode. | |
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 | |
4bea7daf | 24 | mov esp, [dataptr] |
f23390bf | 25 | |
015cd976 JW |
26 | mov al, [needclear] |
27 | cmp al, 0 | |
28 | jz noclear | |
29 | mov al, 0 ; clear BSS | |
30 | mov edi, [dataptr+4] | |
31 | mov ecx, [dataptr+8] | |
32 | rep stosb | |
33 | mov [needclear], al | |
34 | ||
35 | noclear: | |
36 | mov eax, [dataptr+12] ; jump into C | |
37 | call eax | |
38 | ||
f23390bf JW |
39 | mov al, 0x40 ; ack the periodic IRQ |
40 | mov dx, 0x834 | |
41 | out dx, al | |
42 | ||
015cd976 | 43 | mov dx, 0x830 ; now ack the SMI itself |
f23390bf | 44 | in al, dx |
015cd976 | 45 | or al, 0x02 |
f23390bf JW |
46 | and al, 0xBF |
47 | out dx, al | |
48 | or al, 0x40 | |
49 | out dx, al | |
50 | ||
51 | rsm ; and leave SMM | |
52 | ||
53 | align 0x4 | |
54 | gdtr: | |
55 | db 0x27, 0x00 | |
eee8da2e | 56 | dd gdt |
f23390bf JW |
57 | align 0x4 |
58 | gdt: | |
59 | db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 | |
60 | db 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x93, 0xCF, 0x00 ; data segment | |
61 | db 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x9B, 0xCF, 0x00 ; code segment | |
62 | db 0xFF, 0xFF, 0x00, 0x80, 0x0A, 0x9B, 0xCF, 0x00 ; code segment for trampoline | |
63 | ||
035d7af7 JW |
64 | needclear: |
65 | db 0x01 | |
4bea7daf | 66 | |
4bea7daf JW |
67 | dataptr: |
68 | ; 4 bytes of stack top | |
69 | ; 4 bytes of BSS start | |
70 | ; 4 bytes of BSS length | |
035d7af7 JW |
71 | ; 4 bytes of C entry point |
72 | ; These show up |