|
|
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: * Mach Operating System
27: * Copyright (c) 1991,1990 Carnegie Mellon University
28: * All Rights Reserved.
29: *
30: * Permission to use, copy, modify and distribute this software and its
31: * documentation is hereby granted, provided that both the copyright
32: * notice and this permission notice appear in all copies of the
33: * software, derivative works or modified versions, and any portions
34: * thereof, and that both notices appear in supporting documentation.
35: *
36: * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
37: * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
38: * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
39: *
40: * Carnegie Mellon requests users of this software to return to
41: *
42: * Software Distribution Coordinator or [email protected]
43: * School of Computer Science
44: * Carnegie Mellon University
45: * Pittsburgh PA 15213-3890
46: *
47: * any improvements or extensions that they make and grant Carnegie Mellon
48: * the rights to redistribute these changes.
49: */
50:
51: #ifndef __MACHO__
52: /*
53: * Startup code for an i386 on an AT.
54: * Kernel is loaded starting at 1MB.
55: * Protected mode, paging disabled.
56: */
57:
58: popl %eax
59: cmpl $-1,%eax /* new calling convention */
60: je 0f
61:
62: /*
63: * Old calling convention
64: *
65: * %esp -> boottype (deprecated)
66: * size of extended memory (K)
67: * size of conventional memory (K)
68: * boothowto (deprecated)
69: * esym (if KDB set up)
70: */
71: #define SYS_REBOOT_COMPAT 1
72: #if SYS_REBOOT_COMPAT
73: movl %eax,PA(EXT(boottype))
74: #endif
75: popl PA(EXT(extmem)) /* extended memory, in K */
76: popl PA(EXT(cnvmem)) /* conventional memory, in K */
77: popl %edx /* old boothowto */
78: #if SYS_REBOOT_COMPAT
79: #define RB_SINGLE 0x2
80: #define RB_HALT 0x8
81: #define RB_ALTBOOT 0x40
82: testb $(RB_SINGLE),%edx /* old RB_SINGLE flag ? */
83: je 2f
84: incl PA(EXT(startup_single_user))
85: 2: testb $(RB_HALT),%edx /* old RB_HALT flag ? */
86: je 2f
87: incl PA(EXT(halt_in_debugger))
88: 2: testb $(RB_ALTBOOT),%edx /* old RB_ALTBOOT flag ? */
89: je 2f
90: incl PA(EXT(cons_is_com1))
91: 2:
92: #if NCPUS > 1
93: shrl $0x8,%edx
94: movb %edx,PA(EXT(wncpu)) /* old want ncpus flag */
95: #endif
96: #endif
97:
98: popl %eax /* get boot_string & esym */
99: #if SYS_REBOOT_COMPAT
100: movl %eax, %esi
101: lea PA(EXT(boot_string_store)), %edi
102: movl PA(EXT(boot_string_sz)), %ecx
103: cld
104: rep
105: movsb
106: #endif
107:
108: /*
109: * Move symbol table out of the way of BSS.
110: *
111: * When kernel is loaded, at the start of BSS we have:
112: * _edata:
113: * .long kern_sym_size
114: * .long boot_image_size
115: * .long load_info_size
116: * sym_start:
117: * kernel symbols
118: * .align ALIGN
119: * boot_start:
120: * bootstrap image
121: * .align ALIGN
122: * load_info_start:
123: * bootstrap load information
124: *
125: * all of which must be moved somewhere else, since it
126: * is sitting in the kernel BSS. In addition, the bootstrap
127: * image must be moved to a machine page boundary, so that we get:
128: *
129: * _edata:
130: * BSS
131: * _end: <- kern_sym_start (VA)
132: * kernel symbols . (kern_sym_size)
133: * <next page boundary>: <- boot_start (VA)
134: * bootstrap image
135: * <- load_info_start (VA)
136: * load information
137: * <- %ebx (PA)
138: *
139: */
140: lea PA(EXT(edata))+4-1,%esi /* point to symbol size word */
141: andl $~0x3,%esi
142: movl (%esi),%edx /* get symbol size */
143:
144: lea PA(EXT(end))+NBPG-1(%edx),%edi
145: /* point after BSS, add symbol */
146: /* size, and round up to */
147: andl $-NBPG,%edi /* machine page boundary */
148:
149: lea -KVTOPHYS(%edi),%eax /* save virtual address */
150: movl %eax,PA(EXT(boot_start)) /* of start of bootstrap */
151: movl 4(%esi),%ecx /* get size of bootstrap */
152: movl %ecx,PA(EXT(boot_size)) /* save size of bootstrap */
153: lea -KVTOPHYS(%edi,%ecx),%eax
154: movl %eax,PA(EXT(load_info_start))
155: /* save virtual address */
156: /* of start of loader info */
157: movl 8(%esi),%eax /* get size of loader info */
158: movl %eax,PA(EXT(load_info_size))
159: /* save size of loader info */
160: addl %eax,%ecx /* get total size to move */
161:
162: leal 12(%esi,%edx),%esi /* point to start of boot image - source */
163:
164: leal (%edi,%ecx),%ebx /* point to new location of */
165: /* end of bootstrap - next */
166: /* available physical address */
167:
168: lea -4(%esi,%ecx),%esi /* point to end of src - 4 */
169: lea -4(%edi,%ecx),%edi /* point to end of dst - 4 */
170: shrl $2,%ecx /* move by longs */
171: std /* move backwards */
172: rep
173: movsl /* move bootstrap and loader_info */
174: cld /* reset direction flag */
175:
176: movl $EXT(end),PA(EXT(kern_sym_start))
177: /* save virtual address */
178: /* of start of symbols */
179: movl %edx,PA(EXT(kern_sym_size)) /* save symbol table size */
180: testl %edx,%edx /* any symbols? */
181: jz 1f /* if so: */
182:
183: /* %esi points to start of boot-4 */
184: /* == end of symbol table (source) - 4 */
185: leal PA(EXT(end))-4(%edx),%edi /* point to end of dst - 4 */
186: movl %edx,%ecx /* copy size */
187: shrl $2,%ecx /* move by longs */
188: std /* move backwards */
189: rep
190: movsl /* move symbols */
191: cld /* reset direction flag */
192:
193: jmp 1f
194:
195: /*
196: * New calling convention
197: *
198: * %esp -> -1
199: * size of extended memory (K)
200: * size of conventional memory (K)
201: * kern_sym_start
202: * kern_sym_size
203: * kern_args_start
204: * kern_args_size
205: * boot_sym_start
206: * boot_sym_size
207: * boot_args_start
208: * boot_args_size
209: * boot_start
210: * boot_size
211: * boot_region_desc
212: * boot_region_count
213: * boot_thread_state_flavor
214: * boot_thread_state
215: * boot_thread_state_count
216: * env_start
217: * env_size
218: * top of loaded memory
219: */
220:
221: #define MEM_BASE 0
222:
223: #define BOOT_TO_VIRT (MEM_BASE-(KVTOPHYS))
224: .globl EXT(boot_start)
225:
226: 0:
227: popl PA(EXT(extmem)) /* extended memory, in K */
228: popl PA(EXT(cnvmem)) /* conventional memory, in K */
229: popl %eax
230: addl $BOOT_TO_VIRT,%eax /* convert to virtual address */
231: movl %eax,PA(EXT(kern_sym_start))
232: popl PA(EXT(kern_sym_size))
233: popl %eax
234: addl $BOOT_TO_VIRT,%eax /* convert to virtual address */
235: movl %eax,PA(EXT(kern_args_start))
236: popl PA(EXT(kern_args_size))
237: popl %eax
238: addl $BOOT_TO_VIRT,%eax /* convert to virtual address */
239: movl %eax,PA(EXT(boot_sym_start))
240: popl PA(EXT(boot_sym_size))
241: popl %eax
242: addl $BOOT_TO_VIRT,%eax /* convert to virtual address */
243: movl %eax,PA(EXT(boot_args_start))
244: popl PA(EXT(boot_args_size))
245: popl %eax
246: addl $BOOT_TO_VIRT,%eax /* convert to virtual address */
247: movl %eax,PA(EXT(boot_start))
248: popl PA(EXT(boot_size))
249: popl %eax
250: addl $BOOT_TO_VIRT,%eax /* convert to virtual address */
251: movl %eax,PA(EXT(boot_region_desc))
252: popl PA(EXT(boot_region_count))
253: popl PA(EXT(boot_thread_state_flavor))
254: popl %eax
255: addl $BOOT_TO_VIRT,%eax /* convert to virtual address */
256: movl %eax,PA(EXT(boot_thread_state))
257: popl PA(EXT(boot_thread_state_count))
258: popl %eax
259: addl $BOOT_TO_VIRT,%eax /* convert to virtual address */
260: movl %eax,PA(EXT(env_start))
261: popl PA(EXT(env_size))
262: popl %ebx /* mem top */
263: addl $MEM_BASE,%ebx /* translate */
264: 1:
265: #else
266: cld
267: call PA(EXT(i386_preinit))
268: movl %eax,%ebx
269: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.