|
|
1.1 root 1: /*
2: * Copyright (c) 2000 Apple Computer, Inc. All rights reserved.
3: *
4: * @APPLE_LICENSE_HEADER_START@
5: *
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
14: * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
15: * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
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.
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 [email protected]
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:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.