]>
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 | |
4bea7daf JW |
26 | ; mov al, [cstat] |
27 | ; add al, 1 | |
f23390bf | 28 | ; out 0x80, al |
4bea7daf | 29 | ; mov [cstat], al |
f23390bf | 30 | |
f23390bf JW |
31 | mov dx, 0xCF8 ; save off the old config value |
32 | in dword eax, dx | |
33 | mov [esp-4], eax | |
34 | ||
35 | mov eax, 0x80000070 ; load in smramc | |
36 | out dx, eax | |
37 | mov dx, 0xCFC | |
38 | in byte al, dx | |
39 | mov [esp-5], al | |
40 | and al, 0xF3 ; Allow graphics access | |
41 | or al, 0x08 | |
42 | out dx, al | |
43 | ||
44 | xor eax, eax | |
45 | mov dx, 0x3D4 | |
46 | in byte al, dx | |
47 | mov [esp-6], al ; save off the old VGA command | |
48 | mov al, 0xC | |
49 | out dx, al | |
50 | inc dx | |
51 | in al, dx | |
52 | mov ah, al | |
53 | dec dx | |
54 | mov al, 0xD | |
55 | out dx, al | |
56 | inc dx | |
57 | in al, dx | |
58 | shl eax, 1 | |
59 | add eax, 0xB8000 ; yay | |
60 | mov byte [eax+0], '1' | |
eee8da2e | 61 | mov byte [eax+1], 0x1F |
f23390bf | 62 | mov byte [eax+2], '5' |
eee8da2e | 63 | mov byte [eax+3], 0x1F |
f23390bf | 64 | mov byte [eax+4], '-' |
eee8da2e | 65 | mov byte [eax+5], 0x1F |
f23390bf | 66 | mov byte [eax+6], '4' |
eee8da2e | 67 | mov byte [eax+7], 0x1F |
f23390bf | 68 | mov byte [eax+8], '1' |
eee8da2e | 69 | mov byte [eax+9], 0x1F |
f23390bf | 70 | mov byte [eax+10], '2' |
eee8da2e | 71 | mov byte [eax+11], 0x1F |
f23390bf | 72 | |
4bea7daf | 73 | mov dx, 0x3D4 ; restore the old stuff |
f23390bf JW |
74 | mov al, [esp-6] |
75 | out dx, al | |
4bea7daf | 76 | |
f23390bf JW |
77 | mov dx, 0xCFC ; restore smramc |
78 | mov al, [esp-5] | |
79 | out dx, al | |
80 | ||
015cd976 | 81 | mov dx, 0xCF8 ; restore the old PCI config value |
f23390bf JW |
82 | mov eax, [esp-4] |
83 | out dx, eax | |
84 | ||
015cd976 JW |
85 | mov al, [needclear] |
86 | cmp al, 0 | |
87 | jz noclear | |
88 | mov al, 0 ; clear BSS | |
89 | mov edi, [dataptr+4] | |
90 | mov ecx, [dataptr+8] | |
91 | rep stosb | |
92 | mov [needclear], al | |
93 | ||
94 | noclear: | |
95 | mov eax, [dataptr+12] ; jump into C | |
96 | call eax | |
97 | ||
f23390bf JW |
98 | mov al, 0x40 ; ack the periodic IRQ |
99 | mov dx, 0x834 | |
100 | out dx, al | |
101 | ||
015cd976 | 102 | mov dx, 0x830 ; now ack the SMI itself |
f23390bf | 103 | in al, dx |
015cd976 | 104 | or al, 0x02 |
f23390bf JW |
105 | and al, 0xBF |
106 | out dx, al | |
107 | or al, 0x40 | |
108 | out dx, al | |
109 | ||
110 | rsm ; and leave SMM | |
111 | ||
015cd976 JW |
112 | needclear: |
113 | db 0x01 | |
114 | ||
f23390bf JW |
115 | align 0x4 |
116 | gdtr: | |
117 | db 0x27, 0x00 | |
eee8da2e | 118 | dd gdt |
f23390bf JW |
119 | align 0x4 |
120 | gdt: | |
121 | db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 | |
122 | db 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x93, 0xCF, 0x00 ; data segment | |
123 | db 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x9B, 0xCF, 0x00 ; code segment | |
124 | db 0xFF, 0xFF, 0x00, 0x80, 0x0A, 0x9B, 0xCF, 0x00 ; code segment for trampoline | |
125 | ||
f23390bf JW |
126 | cstat: |
127 | db 0x00 | |
4bea7daf JW |
128 | |
129 | TIMES 512-($-$$) DB 0 | |
130 | dataptr: | |
131 | ; 4 bytes of stack top | |
132 | ; 4 bytes of BSS start | |
133 | ; 4 bytes of BSS length | |
134 | ; 4 bytes of C entry point |