]>
Commit | Line | Data |
---|---|---|
1c79356b A |
1 | /* |
2 | * Copyright (c) 2000 Apple Computer, Inc. All rights reserved. | |
3 | * | |
4 | * @APPLE_LICENSE_HEADER_START@ | |
5 | * | |
de355530 A |
6 | * The contents of this file constitute Original Code as defined in and |
7 | * are subject to the Apple Public Source License Version 1.1 (the | |
8 | * "License"). You may not use this file except in compliance with the | |
9 | * License. Please obtain a copy of the License at | |
10 | * http://www.apple.com/publicsource and read it before using this file. | |
11 | * | |
12 | * This Original Code and all software distributed under the License are | |
13 | * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER | |
1c79356b A |
14 | * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, |
15 | * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, | |
de355530 A |
16 | * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the |
17 | * License for the specific language governing rights and limitations | |
18 | * under the License. | |
1c79356b A |
19 | * |
20 | * @APPLE_LICENSE_HEADER_END@ | |
21 | */ | |
22 | /* | |
23 | * @OSF_COPYRIGHT@ | |
24 | */ | |
25 | ||
26 | /* | |
27 | * Mach Operating System | |
28 | * Copyright (c) 1991,1990 Carnegie Mellon University | |
29 | * All Rights Reserved. | |
30 | * | |
31 | * Permission to use, copy, modify and distribute this software and its | |
32 | * documentation is hereby granted, provided that both the copyright | |
33 | * notice and this permission notice appear in all copies of the | |
34 | * software, derivative works or modified versions, and any portions | |
35 | * thereof, and that both notices appear in supporting documentation. | |
36 | * | |
37 | * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" | |
38 | * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR | |
39 | * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. | |
40 | * | |
41 | * Carnegie Mellon requests users of this software to return to | |
42 | * | |
43 | * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU | |
44 | * School of Computer Science | |
45 | * Carnegie Mellon University | |
46 | * Pittsburgh PA 15213-3890 | |
47 | * | |
48 | * any improvements or extensions that they make and grant Carnegie Mellon | |
49 | * the rights to redistribute these changes. | |
50 | */ | |
51 | ||
52 | ||
53 | #include "i386/asm.h" | |
54 | #include "i386/AT386/mp/boot.h" | |
55 | ||
56 | #define CR0_PE_ON 0x1 | |
57 | #define CR0_PE_OFF 0xfffffffe | |
58 | ||
59 | .file "slave_boot.s" | |
60 | ||
61 | .text | |
62 | ||
63 | #define LJMP(segment,address) \ | |
64 | .byte 0xea ;\ | |
65 | .long address-EXT(slave_boot_base) ;\ | |
66 | .word segment | |
67 | ||
68 | #define LGDT(address) \ | |
69 | .word 0x010f ;\ | |
70 | .byte 0x15 ;\ | |
71 | .long address-EXT(slave_boot_base) | |
72 | ||
73 | ENTRY(slave_boot_base) | |
74 | /* code is loaded at 0x0:0x1000 */ | |
75 | /* ljmp to the next instruction to set up %cs */ | |
76 | data16 | |
77 | LJMP(MP_BOOTSEG, EXT(slave_pstart)) | |
78 | ||
79 | ENTRY(slave_pstart) | |
80 | /* set up %ds */ | |
81 | mov %cs, %ax | |
82 | mov %ax, %ds | |
83 | ||
84 | /* set up %ss and %esp */ | |
85 | data16 | |
86 | mov $MP_BOOTSEG, %eax | |
87 | mov %ax, %ss | |
88 | data16 | |
89 | mov $MP_BOOTSTACK, %esp | |
90 | ||
91 | /*set up %es */ | |
92 | mov %ax, %es | |
93 | ||
94 | /* change to protected mode */ | |
95 | data16 | |
96 | call EXT(real_to_prot) | |
97 | ||
98 | push MP_MACH_START | |
99 | call EXT(startprog) | |
100 | ||
101 | /* | |
102 | real_to_prot() | |
103 | transfer from real mode to protected mode. | |
104 | */ | |
105 | ||
106 | ENTRY(real_to_prot) | |
107 | /* guarantee that interrupt is disabled when in prot mode */ | |
108 | cli | |
109 | ||
110 | /* load the gdtr */ | |
111 | addr16 | |
112 | data16 | |
113 | LGDT(EXT(gdtr)) | |
114 | ||
115 | /* set the PE bit of CR0 */ | |
116 | mov %cr0, %eax | |
117 | ||
118 | data16 | |
119 | or $CR0_PE_ON, %eax | |
120 | mov %eax, %cr0 | |
121 | ||
122 | /* make intrasegment jump to flush the processor pipeline and */ | |
123 | /* reload CS register */ | |
124 | data16 | |
125 | LJMP(0x08, xprot) | |
126 | ||
127 | xprot: | |
128 | /* we are in USE32 mode now */ | |
129 | /* set up the protective mode segment registers : DS, SS, ES */ | |
130 | mov $0x10, %eax | |
131 | movw %ax, %ds | |
132 | movw %ax, %ss | |
133 | movw %ax, %es | |
134 | ||
135 | ret | |
136 | ||
137 | /* | |
138 | startprog(phyaddr) | |
139 | start the program on protected mode where phyaddr is the entry point | |
140 | */ | |
141 | ||
142 | ENTRY(startprog) | |
143 | push %ebp | |
144 | mov %esp, %ebp | |
145 | ||
146 | mov 0x8(%ebp), %ecx /* entry offset */ | |
147 | mov $0x28, %ebx /* segment */ | |
148 | push %ebx | |
149 | push %ecx | |
150 | ||
151 | /* set up %ds and %es */ | |
152 | mov $0x20, %ebx | |
153 | movw %bx, %ds | |
154 | movw %bx, %es | |
155 | ||
156 | lret | |
157 | ||
158 | ||
159 | . = MP_GDT-MP_BOOT /* GDT location */ | |
160 | ENTRY(Gdt) | |
161 | ||
162 | /* Segment Descriptor | |
163 | * | |
164 | * 31 24 19 16 7 0 | |
165 | * ------------------------------------------------------------ | |
166 | * | | |B| |A| | | |1|0|E|W|A| | | |
167 | * | BASE 31..24 |G|/|0|V| LIMIT |P|DPL| TYPE | BASE 23:16 | | |
168 | * | | |D| |L| 19..16| | |1|1|C|R|A| | | |
169 | * ------------------------------------------------------------ | |
170 | * | | | | |
171 | * | BASE 15..0 | LIMIT 15..0 | | |
172 | * | | | | |
173 | * ------------------------------------------------------------ | |
174 | */ | |
175 | .word 0,0 /* 0x0 : null */ | |
176 | .byte 0,0,0,0 | |
177 | ||
178 | .word 0xffff,MP_BOOT /* 0x8 : boot code */ | |
179 | .byte 0,0x9e,0x40,0 | |
180 | ||
181 | .word 0xffff,MP_BOOT /* 0x10 : boot data */ | |
182 | .byte 0,0x92,0x40,0 | |
183 | ||
184 | .word 0xffff,MP_BOOT /* 0x18 : boot code, 16 bits */ | |
185 | .byte 0,0x9e,0x0,0 | |
186 | ||
187 | .word 0xffff,0 /* 0x20 : init data */ | |
188 | .byte 0,0x92,0xcf,0 | |
189 | ||
190 | .word 0xffff,0 /* 0x28 : init code */ | |
191 | .byte 0,0x9e,0xcf,0 | |
192 | ||
193 | ENTRY(gdtr) | |
194 | .short 48 /* limit (8*6 segs) */ | |
195 | .short MP_GDT /* base low */ | |
196 | .short 0 /* base high */ | |
197 | ||
198 | ENTRY(slave_boot_end) | |
199 | ||
200 | ||
201 | ||
202 | ||
203 | ||
204 | ||
205 | ||
206 | ||
207 | ||
208 | ||
209 | ||
210 | ||
211 | ||
212 |