4dd760365c3bd8284af47d74614ce39f5300202e
[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         mov DWORD [gaInitPageDir], 0\r
43 \r
44         ; Call the kernel\r
45         push ebx        ; Multiboot Info\r
46         push eax        ; Multiboot Magic Value\r
47         call kmain
48
49         ; Halt the Machine\r
50         cli\r
51 .hlt:\r
52         hlt\r
53         jmp .hlt\r
54 \r
55\r
56 ; Multiprocessing AP Startup Code (Must be within 0x10FFF0)\r
57 ;\r
58 %if USE_MP\r
59 [extern gGDTptr]\r
60 [extern gpMP_LocalAPIC]\r
61 [extern gaAPIC_to_CPU]\r
62 [extern gaCPUs]\r
63 [global APStartup]\r
64 \r
65 [bits 16]\r
66 APStartup:\r
67         xchg bx, bx     ; MAGIC BREAK!\r
68         mov ax, 0xFFFF\r
69         mov ds, ax\r
70         lgdt [DWORD ds:gGDTptr-0xFFFF0]\r
71         mov eax, cr0\r
72         or      al, 1\r
73         mov     cr0, eax\r
74         jmp 08h:DWORD .ProtectedMode\r
75 [bits 32]\r
76 .ProtectedMode:\r
77         ; Start Paging\r
78         mov eax, gaInitPageDir - KERNEL_BASE\r
79         mov cr3, eax\r
80         mov eax, cr0\r
81         or      eax, 0x80010000 ; PG and WP\r
82         mov cr0, eax\r
83         ; Jump to higher half\r
84         lea eax, [.higherHalf]\r
85         jmp eax\r
86 .higherHalf:\r
87         mov eax, [gpMP_LocalAPIC]\r
88         mov DWORD [eax], 0\r
89         xor ecx, ecx\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
96 .hlt:\r
97         hlt\r
98         jmp .hlt\r
99 %endif\r
100 \r
101 [global GetEIP]\r
102 GetEIP:\r
103         mov eax, [esp]\r
104         ret\r
105 \r
106 [extern Proc_Clone]\r
107 [extern Threads_Exit]\r
108 [global SpawnTask]\r
109 SpawnTask:\r
110         ; Call Proc_Clone with Flags=0\r
111         xor eax, eax\r
112         push eax
113         push eax\r
114         call Proc_Clone\r
115         add esp, 8      ; Remove arguments from stack\r
116         \r
117         test eax, eax\r
118         jnz .parent\r
119         \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
123         ; Child\r
124         push edx        ; Argument\r
125         call ebx        ; Function\r
126         call Threads_Exit       ; Kill Thread\r
127         \r
128 .parent:\r
129         ret\r
130 \r
131 [section .initpd]\r
132 [global gaInitPageDir]\r
133 [global gaInitPageTable]\r
134 align 0x1000\r
135 gaInitPageDir:\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
139         times 256-1     dd      0\r
140 align 0x1000\r
141 gaInitPageTable:\r
142         %assign i 0\r
143         %rep 1024\r
144         dd      i*0x1000+3\r
145         %assign i i+1\r
146         %endrep\r
147 [global Kernel_Stack_Top]\r
148 ALIGN 0x1000\r
149         times 1024      dd      0\r
150 Kernel_Stack_Top:\r
151         

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