SMP Work (APs now start, just seem to lock up on lgdt, or whatever is at that address)
[tpg/acess2.git] / Kernel / arch / x86 / start.asm
1 ; AcessOS Microkernel Version\r
2 ; Start.asm\r
3 \r
4 [bits 32]\r
5 \r
6 KERNEL_BASE     equ 0xC0000000\r
7 \r
8 [section .multiboot]\r
9 mboot:\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
16         \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
22         \r
23 [section .text]\r
24 [extern kmain]\r
25 [global start]\r
26 start:\r
27         ; Set up stack\r
28         mov esp, Kernel_Stack_Top\r
29         \r
30         ; Start Paging\r
31         mov ecx, gaInitPageDir - KERNEL_BASE\r
32         mov cr3, ecx\r
33         \r
34         mov ecx, cr0\r
35         or      ecx, 0x80010000 ; PG and WP\r
36         mov cr0, ecx\r
37         \r
38         lea ecx, [.higherHalf]\r
39         jmp ecx\r
40 .higherHalf:\r
41 \r
42         ; Call the kernel\r
43         push ebx        ; Multiboot Info\r
44         push eax        ; Multiboot Magic Value\r
45         call kmain
46
47         ; Halt the Machine\r
48         cli\r
49 .hlt:\r
50         hlt\r
51         jmp .hlt\r
52 \r
53\r
54 ; Multiprocessing AP Startup Code (Must be within 0x10FFF0)\r
55 ;\r
56 %if USE_MP\r
57 [extern gGDT]\r
58 [extern gGDTPtr]\r
59 [extern gIDTPtr]\r
60 [extern gpMP_LocalAPIC]\r
61 [extern gaAPIC_to_CPU]\r
62 [extern gaCPUs]\r
63 lGDTPtr:        ; Local GDT Pointer\r
64         dw      2*8-1\r
65         dd      gGDT-KERNEL_BASE\r
66 \r
67 [bits 16]\r
68 [global APStartup]\r
69 APStartup:\r
70         xchg bx, bx     ; MAGIC BREAK!\r
71         mov ax, 0xFFFF\r
72         mov ds, ax\r
73         lgdt [DWORD ds:lGDTPtr-KERNEL_BASE-0xFFFF0]\r
74         mov eax, cr0\r
75         or      al, 1\r
76         mov     cr0, eax\r
77         jmp 08h:DWORD .ProtectedMode-KERNEL_BASE\r
78 [bits 32]\r
79 .ProtectedMode:\r
80         ; Start Paging\r
81         mov eax, gaInitPageDir - KERNEL_BASE\r
82         mov cr3, eax\r
83         mov eax, cr0\r
84         or      eax, 0x80010000 ; PG and WP\r
85         mov cr0, eax\r
86         ; Jump to higher half\r
87         lea eax, [.higherHalf]\r
88         jmp eax\r
89 .higherHalf:\r
90         ; Load True GDT & IDT\r
91         lgdt [gGDTPtr]\r
92         lidt [gIDTPtr]\r
93 \r
94         mov eax, [gpMP_LocalAPIC]\r
95         mov DWORD [eax], 0\r
96         xor ecx, ecx\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
103         sti\r
104 .hlt:\r
105         hlt\r
106         jmp .hlt\r
107 %endif\r
108 \r
109 [global GetEIP]\r
110 GetEIP:\r
111         mov eax, [esp]\r
112         ret\r
113 \r
114 [extern Proc_Clone]\r
115 [extern Threads_Exit]\r
116 [global SpawnTask]\r
117 SpawnTask:\r
118         ; Call Proc_Clone with Flags=0\r
119         xor eax, eax\r
120         push eax
121         push eax\r
122         call Proc_Clone\r
123         add esp, 8      ; Remove arguments from stack\r
124         \r
125         test eax, eax\r
126         jnz .parent\r
127         \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
131         ; Child\r
132         push edx        ; Argument\r
133         call ebx        ; Function\r
134         call Threads_Exit       ; Kill Thread\r
135         \r
136 .parent:\r
137         ret\r
138 \r
139 [section .initpd]\r
140 [global gaInitPageDir]\r
141 [global gaInitPageTable]\r
142 align 0x1000\r
143 gaInitPageDir:\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
147         times 256-1     dd      0\r
148 align 0x1000\r
149 gaInitPageTable:\r
150         %assign i 0\r
151         %rep 1024\r
152         dd      i*0x1000+3\r
153         %assign i i+1\r
154         %endrep\r
155 [global Kernel_Stack_Top]\r
156 ALIGN 0x1000\r
157         times 1024      dd      0\r
158 Kernel_Stack_Top:\r
159         

UCC git Repository :: git.ucc.asn.au