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
42 mov DWORD [gaInitPageDir], 0
\r
45 push ebx ; Multiboot Info
\r
46 push eax ; Multiboot Magic Value
\r
56 ; Multiprocessing AP Startup Code (Must be within 0x10FFF0)
\r
60 [extern gpMP_LocalAPIC]
\r
61 [extern gaAPIC_to_CPU]
\r
67 xchg bx, bx ; MAGIC BREAK!
\r
70 lgdt [DWORD ds:gGDTptr-0xFFFF0]
\r
74 jmp 08h:DWORD .ProtectedMode
\r
78 mov eax, gaInitPageDir - KERNEL_BASE
\r
81 or eax, 0x80010000 ; PG and WP
\r
83 ; Jump to higher half
\r
84 lea eax, [.higherHalf]
\r
87 mov eax, [gpMP_LocalAPIC]
\r
90 mov cl, BYTE [eax+0x10]
\r
91 ; CL is now local APIC ID
\r
92 mov cl, BYTE [gaAPIC_to_CPU+ecx]
\r
93 ; CL is now the CPU ID
\r
94 mov BYTE [gaCPUs+ecx*8+1], 1
\r
95 ; CPU is now marked as initialised
\r
106 [extern Proc_Clone]
\r
107 [extern Threads_Exit]
\r
110 ; Call Proc_Clone with Flags=0
\r
115 add esp, 8 ; Remove arguments from stack
\r
120 ; In child, so now set up stack frame
\r
121 mov ebx, [esp+4] ; Child Function
\r
122 mov edx, [esp+8] ; Argument
\r
124 push edx ; Argument
\r
125 call ebx ; Function
\r
126 call Threads_Exit ; Kill Thread
\r
132 [global gaInitPageDir]
\r
133 [global gaInitPageTable]
\r
136 dd gaInitPageTable-KERNEL_BASE+3 ; 0x00
\r
137 times 1024-256-1 dd 0
\r
138 dd gaInitPageTable-KERNEL_BASE+3 ; 0xC0
\r
147 [global Kernel_Stack_Top]
\r