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 lGDTPtr: ; Local GDT Pointer
\r
70 xchg bx, bx ; MAGIC BREAK!
\r
73 lgdt [DWORD ds:lGDTPtr-KERNEL_BASE-0xFFFF0]
\r
77 jmp 08h:DWORD .ProtectedMode-KERNEL_BASE
\r
81 mov eax, gaInitPageDir - KERNEL_BASE
\r
84 or eax, 0x80010000 ; PG and WP
\r
86 ; Jump to higher half
\r
87 lea eax, [.higherHalf]
\r
90 ; Load True GDT & IDT
\r
94 mov eax, [gpMP_LocalAPIC]
\r
97 mov cl, BYTE [eax+0x10]
\r
98 ; CL is now local APIC ID
\r
99 mov cl, BYTE [gaAPIC_to_CPU+ecx]
\r
100 ; CL is now the CPU ID
\r
101 mov BYTE [gaCPUs+ecx*8+1], 1
\r
102 ; CPU is now marked as initialised
\r
114 [extern Proc_Clone]
\r
115 [extern Threads_Exit]
\r
118 ; Call Proc_Clone with Flags=0
\r
123 add esp, 8 ; Remove arguments from stack
\r
128 ; In child, so now set up stack frame
\r
129 mov ebx, [esp+4] ; Child Function
\r
130 mov edx, [esp+8] ; Argument
\r
132 push edx ; Argument
\r
133 call ebx ; Function
\r
134 call Threads_Exit ; Kill Thread
\r
140 [global gaInitPageDir]
\r
141 [global gaInitPageTable]
\r
144 dd gaInitPageTable-KERNEL_BASE+3 ; 0x00
\r
145 times 1024-256-1 dd 0
\r
146 dd gaInitPageTable-KERNEL_BASE+3 ; 0xC0
\r
155 [global Kernel_Stack_Top]
\r