]> Joshua Wise's Git repositories - netwatch.git/blob - aseg/aseg.asm
a6f71c20cd79c5eed1b581654e9bfde5edaabb2a
[netwatch.git] / aseg / aseg.asm
1         org 0xA8000
2 [bits 16]
3 entry:
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
7         mov fs, ax
8         mov gs, ax
9         mov ss, ax
10         jmp 0xA800:(entry2-0xA8000)     ; Long jump to a correct cs.
11 entry2:
12         lgdt [(gdtr-0xA8000)]           ; Set up a new GDT.
13         mov eax, 0x1
14         mov cr0, eax                    ; ... and enter pmode!
15         jmp long 0x10:continue          ; Now longjmp into the new code.
16 [bits 32]
17 continue:
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
24         mov esp, [dataptr]              ; Load stack pointer.
25
26         mov al, [needclear]             ; Has the aseg been run before?
27         cmp al, 0                       ; If so,
28         jz noclear                      ; don't clear BSS.
29         mov al, 0                       ; Otherwise, 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]           ; Load target jump address
37         call eax                        ; then jump into C.
38
39         rsm                             ; and leave SMM
40
41         align 0x4
42 gdtr:
43         db 0x17, 0x00
44         dd gdt
45         align 0x4
46 gdt:
47         db 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00       ; initial null entry
48         db 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x93, 0xCF, 0x00       ; data segment
49         db 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x9B, 0xCF, 0x00       ; code segment
50
51 needclear:
52         db 0x01
53
54 dataptr:
55         ; 4 bytes of stack top
56         ; 4 bytes of BSS start
57         ; 4 bytes of BSS length
58         ; 4 bytes of C entry point
59         ; These show up 
This page took 0.021524 seconds and 2 git commands to generate.