1 ; AcessOS Microkernel Version
\r
6 KERNEL_BASE equ 0xC0000000
\r
10 ; Multiboot macros to make a few lines later more readable
\r
11 MULTIBOOT_PAGE_ALIGN equ 1<<0
\r
12 MULTIBOOT_MEMORY_INFO equ 1<<1
\r
13 MULTIBOOT_HEADER_MAGIC equ 0x1BADB002
\r
14 MULTIBOOT_HEADER_FLAGS equ MULTIBOOT_PAGE_ALIGN | MULTIBOOT_MEMORY_INFO
\r
15 MULTIBOOT_CHECKSUM equ -(MULTIBOOT_HEADER_MAGIC + MULTIBOOT_HEADER_FLAGS)
\r
17 ; This is the GRUB Multiboot header. A boot signature
\r
18 dd MULTIBOOT_HEADER_MAGIC
\r
19 dd MULTIBOOT_HEADER_FLAGS
\r
20 dd MULTIBOOT_CHECKSUM
\r
21 dd mboot - KERNEL_BASE ;Location of Multiboot Header
\r
28 mov esp, Kernel_Stack_Top
\r
31 mov ecx, gaInitPageDir - KERNEL_BASE
\r
35 or ecx, 0x80010000 ; PG and WP
\r
38 lea ecx, [.higherHalf]
\r
43 push ebx ; Multiboot Info
\r
44 push eax ; Multiboot Magic Value
\r
54 ; Multiprocessing AP Startup Code (Must be within 0x10FFF0)
\r
60 [extern gpMP_LocalAPIC]
\r
61 [extern gaAPIC_to_CPU]
\r
63 [extern giNumInitingCPUs]
\r
64 lGDTPtr: ; Local GDT Pointer
\r
71 xchg bx, bx ; MAGIC BREAK!
\r
74 lgdt [DWORD ds:lGDTPtr-KERNEL_BASE-0xFFFF0]
\r
78 jmp 08h:DWORD .ProtectedMode-KERNEL_BASE
\r
82 mov eax, gaInitPageDir - KERNEL_BASE
\r
85 or eax, 0x80010000 ; PG and WP
\r
87 ; Jump to higher half
\r
88 lea eax, [.higherHalf]
\r
91 ; Load True GDT & IDT
\r
95 mov eax, [gpMP_LocalAPIC]
\r
98 mov cl, BYTE [eax+0x10]
\r
99 ; CL is now local APIC ID
\r
100 mov cl, BYTE [gaAPIC_to_CPU+ecx]
\r
101 ; CL is now the CPU ID
\r
102 mov BYTE [gaCPUs+ecx*8+1], 1
\r
103 ; Decrement the remaining CPU count
\r
104 dec DWORD [giNumInitingCPUs]
\r
105 ; CPU is now marked as initialised
\r
117 [extern Proc_Clone]
\r
118 [extern Threads_Exit]
\r
121 ; Call Proc_Clone with Flags=0
\r
126 add esp, 8 ; Remove arguments from stack
\r
131 ; In child, so now set up stack frame
\r
132 mov ebx, [esp+4] ; Child Function
\r
133 mov edx, [esp+8] ; Argument
\r
135 push edx ; Argument
\r
136 call ebx ; Function
\r
137 call Threads_Exit ; Kill Thread
\r
143 [global gaInitPageDir]
\r
144 [global gaInitPageTable]
\r
147 dd gaInitPageTable-KERNEL_BASE+3 ; 0x00
\r
148 times 1024-256-1 dd 0
\r
149 dd gaInitPageTable-KERNEL_BASE+3 ; 0xC0
\r
158 [global Kernel_Stack_Top]
\r