Fixes to VM8086 handler to remove operand size errors.
[tpg/acess2.git] / Kernel / arch / x86 / start.asm
1 ; AcessOS Microkernel Version\r
2 ; Start.asm\r
3 \r
4 [bits 32]\r
5 \r
6 KERNEL_BASE     equ 0xC0000000\r
7 \r
8 [extern __load_addr]\r
9 [extern __bss_start]\r
10 [extern gKernelEnd]\r
11 [section .multiboot]\r
12 mboot:\r
13     ; Multiboot macros to make a few lines later more readable\r
14     MULTIBOOT_PAGE_ALIGN        equ 1<<0\r
15     MULTIBOOT_MEMORY_INFO       equ 1<<1\r
16     MULTIBOOT_HEADER_MAGIC      equ 0x1BADB002\r
17     MULTIBOOT_HEADER_FLAGS      equ MULTIBOOT_PAGE_ALIGN | MULTIBOOT_MEMORY_INFO\r
18     MULTIBOOT_CHECKSUM  equ -(MULTIBOOT_HEADER_MAGIC + MULTIBOOT_HEADER_FLAGS)\r
19         \r
20     ; This is the GRUB Multiboot header. A boot signature\r
21     dd MULTIBOOT_HEADER_MAGIC\r
22     dd MULTIBOOT_HEADER_FLAGS\r
23     dd MULTIBOOT_CHECKSUM\r
24         dd mboot - KERNEL_BASE  ;Location of Multiboot Header\r
25         \r
26 ; Multiboot 2 Header\r
27 mboot2:\r
28     MULTIBOOT2_HEADER_MAGIC     equ 0xE85250D6\r
29     MULTIBOOT2_HEADER_ARCH      equ 0\r
30     MULTIBOOT2_HEADER_LENGTH    equ (mboot2_end-mboot2)\r
31     MULTIBOOT2_CHECKSUM equ -(MULTIBOOT2_HEADER_MAGIC + MULTIBOOT2_HEADER_ARCH + MULTIBOOT2_HEADER_LENGTH)\r
32         \r
33     dd MULTIBOOT2_HEADER_MAGIC\r
34     dd MULTIBOOT2_HEADER_ARCH\r
35     dd MULTIBOOT2_HEADER_LENGTH\r
36     dd MULTIBOOT2_CHECKSUM\r
37         ; MBoot2 Address Header\r
38         dw      2, 0\r
39         dd      8 + 16\r
40         dd      mboot2  ; Location of Multiboot Header\r
41         dd      __load_addr - KERNEL_BASE       ; Kernel Load base\r
42         dd      __bss_start - KERNEL_BASE       ; Kernel Data End\r
43         dd      gKernelEnd - KERNEL_BASE        ; Kernel BSS End\r
44         ; MBoot2 Entry Point Tag\r
45         dw      3, 0\r
46         dd      8 + 4\r
47         dd      start - KERNEL_BASE\r
48         ; MBoot2 Module Alignment Tag\r
49         dw      6, 0\r
50         dd      12      ; ???\r
51         dd      0       ; Search me, seems it wants padding\r
52         ; Terminator\r
53         dw      0, 0\r
54         dd      8\r
55 mboot2_end:\r
56         \r
57 [section .text]\r
58 [extern kmain]\r
59 [global start]\r
60 start:\r
61         ; Set up stack\r
62         mov esp, Kernel_Stack_Top\r
63         \r
64         ; Start Paging\r
65         mov ecx, gaInitPageDir - KERNEL_BASE\r
66         mov cr3, ecx\r
67         \r
68         mov ecx, cr0\r
69         or      ecx, 0x80010000 ; PG and WP\r
70         mov cr0, ecx\r
71         \r
72         lea ecx, [.higherHalf]\r
73         jmp ecx\r
74 .higherHalf:\r
75 \r
76         ; Call the kernel\r
77         push ebx        ; Multiboot Info\r
78         push eax        ; Multiboot Magic Value\r
79         call kmain
80
81         ; Halt the Machine\r
82         cli\r
83 .hlt:\r
84         hlt\r
85         jmp .hlt\r
86 \r
87\r
88 ; Multiprocessing AP Startup Code (Must be within 0x10FFF0)\r
89 ;\r
90 %if USE_MP\r
91 [extern gGDT]\r
92 [extern gGDTPtr]\r
93 [extern gIDTPtr]\r
94 [extern gpMP_LocalAPIC]\r
95 [extern gaAPIC_to_CPU]\r
96 [extern gaCPUs]\r
97 [extern giNumInitingCPUs]\r
98 lGDTPtr:        ; Local GDT Pointer\r
99         dw      2*8-1\r
100         dd      gGDT-KERNEL_BASE\r
101 \r
102 [bits 16]\r
103 [global APStartup]\r
104 APStartup:\r
105         xchg bx, bx     ; MAGIC BREAK!\r
106         mov ax, 0xFFFF\r
107         mov ds, ax\r
108         lgdt [DWORD ds:lGDTPtr-KERNEL_BASE-0xFFFF0]\r
109         mov eax, cr0\r
110         or      al, 1\r
111         mov     cr0, eax\r
112         jmp 08h:DWORD .ProtectedMode-KERNEL_BASE\r
113 [bits 32]\r
114 .ProtectedMode:\r
115         ; Start Paging\r
116         mov eax, gaInitPageDir - KERNEL_BASE\r
117         mov cr3, eax\r
118         mov eax, cr0\r
119         or      eax, 0x80010000 ; PG and WP\r
120         mov cr0, eax\r
121         ; Jump to higher half\r
122         lea eax, [.higherHalf]\r
123         jmp eax\r
124 .higherHalf:\r
125         ; Load True GDT & IDT\r
126         lgdt [gGDTPtr]\r
127         lidt [gIDTPtr]\r
128 \r
129         mov eax, [gpMP_LocalAPIC]\r
130         mov DWORD [eax], 0\r
131         xor ecx, ecx\r
132         mov cl, BYTE [eax+0x10]\r
133         ; CL is now local APIC ID\r
134         mov cl, BYTE [gaAPIC_to_CPU+ecx]\r
135         ; CL is now the CPU ID\r
136         mov BYTE [gaCPUs+ecx*8+1], 1\r
137         ; Decrement the remaining CPU count\r
138         dec DWORD [giNumInitingCPUs]\r
139         ; CPU is now marked as initialised\r
140         sti\r
141 .hlt:\r
142         hlt\r
143         jmp .hlt\r
144 %endif\r
145 \r
146 [global GetEIP]\r
147 GetEIP:\r
148         mov eax, [esp]\r
149         ret\r
150 \r
151 ; int CallWithArgArray(void *Ptr, int NArgs, Uint *Args)\r
152 ; Call a function passing the array as arguments\r
153 [global CallWithArgArray]\r
154 CallWithArgArray:\r
155         push ebp\r
156         mov ebp, esp\r
157         mov ecx, [ebp+12]       ; Get NArgs\r
158         mov edx, [ebp+16]\r
159 \r
160 .top:\r
161         mov eax, [edx+ecx*4-4]\r
162         push eax\r
163         loop .top\r
164         \r
165         mov eax, [ebp+8]\r
166         call eax\r
167         lea esp, [ebp]\r
168         pop ebp\r
169         ret\r
170 \r
171 [section .initpd]\r
172 [global gaInitPageDir]\r
173 [global gaInitPageTable]\r
174 align 0x1000\r
175 gaInitPageDir:\r
176         dd      gaInitPageTable-KERNEL_BASE+3   ; 0x00\r
177         times 1024-256-1        dd      0\r
178         dd      gaInitPageTable-KERNEL_BASE+3   ; 0xC0\r
179         times 256-1     dd      0\r
180 align 0x1000\r
181 gaInitPageTable:\r
182         %assign i 0\r
183         %rep 1024\r
184         dd      i*0x1000+3\r
185         %assign i i+1\r
186         %endrep\r
187 [global Kernel_Stack_Top]\r
188 ALIGN 0x1000\r
189         times 1024      dd      0\r
190 Kernel_Stack_Top:\r
191         

UCC git Repository :: git.ucc.asn.au