1 ; AcessOS Microkernel Version
6 KERNEL_BASE equ 0xC0000000
14 ; Multiboot macros to make a few lines later more readable
15 MULTIBOOT_PAGE_ALIGN equ 1<<0
16 MULTIBOOT_MEMORY_INFO equ 1<<1
17 MULTIBOOT_REQVIDMODE equ 1<<2
18 MULTIBOOT_HEADER_MAGIC equ 0x1BADB002
19 MULTIBOOT_HEADER_FLAGS equ MULTIBOOT_PAGE_ALIGN | MULTIBOOT_MEMORY_INFO | MULTIBOOT_REQVIDMODE
20 MULTIBOOT_CHECKSUM equ -(MULTIBOOT_HEADER_MAGIC + MULTIBOOT_HEADER_FLAGS)
22 ; This is the GRUB Multiboot header. A boot signature
23 dd MULTIBOOT_HEADER_MAGIC
24 dd MULTIBOOT_HEADER_FLAGS
27 dd mboot; - KERNEL_BASE ;Location of Multiboot Header
33 dd 0 ; Mode type (0: LFB)
34 dd 0 ; Width (no preference)
35 dd 0 ; Height (no preference)
36 dd 32 ; Depth (32-bit preferred)
40 ; MULTIBOOT2_HEADER_MAGIC equ 0xE85250D6
41 ; MULTIBOOT2_HEADER_ARCH equ 0
42 ; MULTIBOOT2_HEADER_LENGTH equ (mboot2_end-mboot2)
43 ; MULTIBOOT2_CHECKSUM equ -(MULTIBOOT2_HEADER_MAGIC + MULTIBOOT2_HEADER_ARCH + MULTIBOOT2_HEADER_LENGTH)
45 ; dd MULTIBOOT2_HEADER_MAGIC
46 ; dd MULTIBOOT2_HEADER_ARCH
47 ; dd MULTIBOOT2_HEADER_LENGTH
48 ; dd MULTIBOOT2_CHECKSUM
49 ; ; MBoot2 Address Header
52 ; dd mboot2 ; Location of Multiboot Header
53 ; dd __load_addr - KERNEL_BASE ; Kernel Load base
54 ; dd __bss_start - KERNEL_BASE ; Kernel Data End
55 ; dd gKernelEnd - KERNEL_BASE ; Kernel BSS End
56 ; ; MBoot2 Entry Point Tag
59 ; dd start - KERNEL_BASE
60 ; ; MBoot2 Module Alignment Tag
63 ; dd 0 ; Search me, seems it wants padding
71 [extern Desctab_Install]
74 ; Just show we're here
75 mov WORD [0xB8000], 0x0741 ; 'A'
78 mov esp, Kernel_Stack_Top
81 mov ecx, gaInitPageDir - KERNEL_BASE
84 or ecx, 0x80010000 ; PG and WP
87 mov WORD [0xB8002], 0x0763 ; 'c'
91 mov cx, 0x10 ; PL0 Data
97 mov WORD [0xB8004], 0x0765 ; 'e'
101 mov WORD [0xB8006], 0x0773 ; 's'
103 push ebx ; Multiboot Info
104 push eax ; Multiboot Magic Value
105 ; NOTE: These are actually for kmain
108 mov WORD [0xB8008], 0x0773 ; 's'
111 mov WORD [0xB800A], 0x0732 ; '2'
121 ; Multiprocessing AP Startup Code (Must be within 0 - 0x10FFF0)
125 [extern gpMP_LocalAPIC]
126 [extern giMP_TimerCount]
127 [extern gaAPIC_to_CPU]
129 [extern giNumInitingCPUs]
130 [extern MM_NewKStack]
131 [extern Proc_InitialiseSSE]
133 lGDTPtr: ; Local GDT Pointer
144 [extern Proc_Reschedule]
147 ;xchg bx, bx ; MAGIC BREAK!
151 lgdt [DWORD ds:lGDTPtr-0xFFFF0]
152 ; Enable PMode in CR0
157 jmp 08h:DWORD .ProtectedMode
160 ; Load segment registers
168 mov eax, gaInitPageDir - KERNEL_BASE
171 or eax, 0x80010000 ; PG and WP
173 ; Jump to higher half
174 lea eax, [.higherHalf]
177 ; Load True GDT & IDT
181 mov ebp, [gpMP_LocalAPIC]
182 mov ebx, [ebp+0x20] ; Read ID
184 ;xchg bx, bx ; MAGIC BREAK
185 ; BL is now local APIC ID
186 mov cl, BYTE [gaAPIC_to_CPU+ebx]
189 ; BL is now the CPU ID
190 mov dr1, ebx ; Save the CPU number to a debug register
192 mov BYTE [gaCPUs+ebx*8+1], 1
193 ; Decrement the remaining CPU count
194 dec DWORD [giNumInitingCPUs]
198 shl edx, 5+2 ; *32 *4
199 lea esp, [gInitAPStacks+edx]
204 lea ecx, [ebx*8+0x30]
207 ;xchg bx, bx ; MAGIC_BREAK
209 mov DWORD [ebp+0x0F0], 0x000001EF ; Spurious Interrupt Vector (0xEF)
210 mov ecx, DWORD [giMP_TimerCount]
211 mov DWORD [ebp+0x380], ecx ; Set Initial Count
212 mov DWORD [ebp+0x320], 0x000200EE ; Enable timer on IVT#0xEE
213 mov DWORD [ebp+0x330], 0x000100E0 ; ##Enable thermal sensor on IVT#0xE0
214 mov DWORD [ebp+0x340], 0x000100D0 ; ##Enable performance counters on IVT#0xD0
215 mov DWORD [ebp+0x350], 0x000100D1 ; ##Enable LINT0 on IVT#0xD1
216 mov DWORD [ebp+0x360], 0x000100D2 ; ##Enable LINT1 on IVT#0xD2
217 mov DWORD [ebp+0x370], 0x000100E1 ; ##Enable Error on IVT#0xE1
218 mov DWORD [ebp+0x0B0], 0 ; Send an EOI (just in case)
220 ; Initialise SSE support
221 call Proc_InitialiseSSE
223 ; CPU is now marked as initialised
241 ; int CallWithArgArray(void *Ptr, int NArgs, Uint *Args)
242 ; Call a function passing the array as arguments
243 [global CallWithArgArray]
247 mov ecx, [ebp+12] ; Get NArgs
251 mov eax, [edx+ecx*4-4]
263 GDT_SIZE equ (1+2*2+1+MAX_CPUS)*8
268 dd 0x00000000, 0x00000000 ; 00 NULL Entry
269 dd 0x0000FFFF, 0x00CF9A00 ; 08 PL0 Code
270 dd 0x0000FFFF, 0x00CF9200 ; 10 PL0 Data
271 dd 0x0000FFFF, 0x00CFFA00 ; 18 PL3 Code
272 dd 0x0000FFFF, 0x00CFF200 ; 20 PL3 Data
273 dd 26*4-1, 0x00408900 ; 28 Double Fault TSS
274 times MAX_CPUS dd 26*4-1, 0x00408900 ; 30+ TSSes
281 [global gaInitPageDir]
282 [global gaInitPageTable]
285 dd gaInitPageTable-KERNEL_BASE+3 ; 0x000 - Low kernel
286 times 0x300-0x000-1 dd 0
287 dd gaInitPageTable-KERNEL_BASE+3 ; 0xC00 - High kernel
288 times 0x3F0-0x300-1 dd 0
289 dd gaInitPageDir-KERNEL_BASE+3 ; 0xFC0 - Fractal
290 times 0x400-0x3F0-1 dd 0
298 [global Kernel_Stack_Top]
303 times 32*MAX_CPUS dd 0