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_HEADER_MAGIC equ 0x1BADB002
18 MULTIBOOT_HEADER_FLAGS equ MULTIBOOT_PAGE_ALIGN | MULTIBOOT_MEMORY_INFO
19 MULTIBOOT_CHECKSUM equ -(MULTIBOOT_HEADER_MAGIC + MULTIBOOT_HEADER_FLAGS)
21 ; This is the GRUB Multiboot header. A boot signature
22 dd MULTIBOOT_HEADER_MAGIC
23 dd MULTIBOOT_HEADER_FLAGS
25 dd mboot; - KERNEL_BASE ;Location of Multiboot Header
29 ; MULTIBOOT2_HEADER_MAGIC equ 0xE85250D6
30 ; MULTIBOOT2_HEADER_ARCH equ 0
31 ; MULTIBOOT2_HEADER_LENGTH equ (mboot2_end-mboot2)
32 ; MULTIBOOT2_CHECKSUM equ -(MULTIBOOT2_HEADER_MAGIC + MULTIBOOT2_HEADER_ARCH + MULTIBOOT2_HEADER_LENGTH)
34 ; dd MULTIBOOT2_HEADER_MAGIC
35 ; dd MULTIBOOT2_HEADER_ARCH
36 ; dd MULTIBOOT2_HEADER_LENGTH
37 ; dd MULTIBOOT2_CHECKSUM
38 ; ; MBoot2 Address Header
41 ; dd mboot2 ; Location of Multiboot Header
42 ; dd __load_addr - KERNEL_BASE ; Kernel Load base
43 ; dd __bss_start - KERNEL_BASE ; Kernel Data End
44 ; dd gKernelEnd - KERNEL_BASE ; Kernel BSS End
45 ; ; MBoot2 Entry Point Tag
48 ; dd start - KERNEL_BASE
49 ; ; MBoot2 Module Alignment Tag
52 ; dd 0 ; Search me, seems it wants padding
62 ; Just show we're here
63 mov WORD [0xB8000], 0x0741 ; 'A'
66 mov esp, Kernel_Stack_Top
69 mov ecx, gaInitPageDir - KERNEL_BASE
73 or ecx, 0x80010000 ; PG and WP
76 mov WORD [0xB8002], 0x0763 ; 'c'
77 mov WORD [0xB8004], 0x0765 ; 'e'
79 lea ecx, [.higherHalf]
83 mov WORD [0xB8006], 0x0773 ; 's'
84 mov WORD [0xB8008], 0x0773 ; 's'
87 push ebx ; Multiboot Info
88 push eax ; Multiboot Magic Value
89 mov WORD [0xB800A], 0x0732 ; '2'
99 ; Multiprocessing AP Startup Code (Must be within 0 - 0x10FFF0)
105 [extern gpMP_LocalAPIC]
106 [extern giMP_TimerCount]
107 [extern gaAPIC_to_CPU]
109 [extern giNumInitingCPUs]
110 [extern MM_NewKStack]
112 lGDTPtr: ; Local GDT Pointer
125 ;xchg bx, bx ; MAGIC BREAK!
129 lgdt [DWORD ds:lGDTPtr-KERNEL_BASE-0xFFFF0]
130 ; Enable PMode in CR0
135 jmp 08h:DWORD .ProtectedMode-KERNEL_BASE
138 ; Load segment registers
146 mov eax, gaInitPageDir - KERNEL_BASE
149 or eax, 0x80010000 ; PG and WP
151 ; Jump to higher half
152 lea eax, [.higherHalf]
155 ; Load True GDT & IDT
159 mov ebp, [gpMP_LocalAPIC]
160 mov ebx, [ebp+0x20] ; Read ID
162 ;xchg bx, bx ; MAGIC BREAK
163 ; CL is now local APIC ID
164 mov cl, BYTE [gaAPIC_to_CPU+ebx]
167 ; BL is now the CPU ID
168 mov BYTE [gaCPUs+ebx*8+1], 1
169 ; Decrement the remaining CPU count
170 dec DWORD [giNumInitingCPUs]
174 shl edx, 5+2 ; *32 *4
175 lea esp, [gInitAPStacks+edx]
180 lea ecx, [ebx*8+0x30]
182 ; Save the CPU number to a debug register
185 ;xchg bx, bx ; MAGIC_BREAK
187 mov DWORD [ebp+0x0F0], 0x000001EF ; Spurious Interrupt Vector (0xEF)
188 mov ecx, DWORD [giMP_TimerCount]
189 mov DWORD [ebp+0x380], ecx ; Set Initial Count
190 mov DWORD [ebp+0x320], 0x000200EE ; Enable timer on IVT#0xEE
191 mov DWORD [ebp+0x330], 0x000100E0 ; ##Enable thermal sensor on IVT#0xE0
192 mov DWORD [ebp+0x340], 0x000100D0 ; ##Enable performance counters on IVT#0xD0
193 mov DWORD [ebp+0x350], 0x000100D1 ; ##Enable LINT0 on IVT#0xD1
194 mov DWORD [ebp+0x360], 0x000100D2 ; ##Enable LINT1 on IVT#0xD2
195 mov DWORD [ebp+0x370], 0x000100E1 ; ##Enable Error on IVT#0xE1
196 mov DWORD [ebp+0x0B0], 0 ; Send an EOI (just in case)
198 ; CPU is now marked as initialised
200 ;xchg bx, bx ; MAGIC BREAK
211 ; int CallWithArgArray(void *Ptr, int NArgs, Uint *Args)
212 ; Call a function passing the array as arguments
213 [global CallWithArgArray]
217 mov ecx, [ebp+12] ; Get NArgs
221 mov eax, [edx+ecx*4-4]
232 [global gaInitPageDir]
233 [global gaInitPageTable]
236 dd gaInitPageTable-KERNEL_BASE+3 ; 0x000 - Low kernel
237 times 0x300-0x000-1 dd 0
238 dd gaInitPageTable-KERNEL_BASE+3 ; 0xC00 - High kernel
239 times 0x3F0-0x300-1 dd 0
240 dd gaInitPageDir-KERNEL_BASE+3 ; 0xFC0 - Fractal
241 times 0x400-0x3F0-1 dd 0
249 [global Kernel_Stack_Top]
254 times 32*MAX_CPUS dd 0