xref: /reactos/hal/halx86/mp/mpsboot.asm (revision c2c66aff)
1;
2; COPYRIGHT:       See COPYING in the top level directory
3; PROJECT:         ReactOS kernel
4; FILE:            hal/halx86/mp/mpsboot.c
5; PURPOSE:         Bootstrap code for application processors
6; PROGRAMMER:      Casper S. Hornstrup (chorns@users.sourceforge.net)
7; UPDATE HISTORY:
8;                  Created 12/04/2001
9;
10
11;
12; Memory map at this stage is:
13;     0x2000  Location of our stack
14;     0x3000  Startup code for the APs (this code)
15;
16
17;
18; Magic value to be put in EAX when multiboot.S is called as part of the
19; application processor initialization process
20;
21AP_MAGIC    equ 12481020h
22
23
24X86_CR4_PAE equ 00000020h
25
26;
27; Segment selectors
28;
29%define KERNEL_CS     (0x8)
30%define KERNEL_DS     (0x10)
31
32section .text
33
34global _APstart
35global _APend
36
37; 16 bit code
38BITS 16
39
40_APstart:
41	cli		; Just in case
42
43  xor   ax, ax
44	mov		ds, ax
45	mov		ss, ax
46
47  mov   eax, 3000h + APgdt - _APstart
48	lgdt  [eax]
49
50  mov	eax, [2004h]	  ; Set the page directory
51  mov   cr3, eax
52
53  mov	eax, [200ch]
54  cmp	eax,0
55  je	NoPae
56
57  mov	eax,cr4
58  or	eax,X86_CR4_PAE
59  mov	cr4,eax
60
61NoPae:
62
63  mov   eax, cr0
64  or    eax, 80010001h    ; Turn on protected mode, paging and write protection
65  mov   cr0, eax
66
67  db    0eah
68  dw    3000h + flush - _APstart, KERNEL_CS
69
70; 32 bit code
71BITS 32
72
73flush:
74  mov   ax, KERNEL_DS
75  mov		ds, ax
76  mov		es, ax
77  mov		fs, ax
78  mov		gs, ax
79  mov		ss, ax
80
81  ; Setup a stack for the AP
82  mov   eax, 2000h
83  mov   eax, [eax]
84  mov   esp, eax
85
86  ; Jump to start of the kernel with AP magic in ecx
87  mov      ecx, AP_MAGIC
88  mov	   eax,[2008h]
89  jmp      eax
90
91  ; Never get here
92
93
94; Temporary GDT descriptor for the APs
95
96APgdt:
97; Limit
98  dw  (3*8)-1
99; Base
100  dd	3000h + gdt - _APstart
101
102gdt:
103  dw	0x0       ; Null descriptor
104  dw	0x0
105  dw	0x0
106  dw	0x0
107
108  dw	0xffff    ; Kernel code descriptor
109  dw	0x0000
110  dw	0x9a00
111  dw	0x00cf
112
113  dw	0xffff    ;  Kernel data descriptor
114  dw	0x0000
115  dw	0x9200
116  dw	0x00cf
117
118_APend:
119