Source to osfmk/i386/AT386/asm_startup.h
/*
* Copyright (c) 2000 Apple Computer, Inc. All rights reserved.
*
* @APPLE_LICENSE_HEADER_START@
*
* The contents of this file constitute Original Code as defined in and
* are subject to the Apple Public Source License Version 1.1 (the
* "License"). You may not use this file except in compliance with the
* License. Please obtain a copy of the License at
* http://www.apple.com/publicsource and read it before using this file.
*
* This Original Code and all software distributed under the License are
* distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
* EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
* INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the
* License for the specific language governing rights and limitations
* under the License.
*
* @APPLE_LICENSE_HEADER_END@
*/
/*
* @OSF_COPYRIGHT@
*/
/*
* Mach Operating System
* Copyright (c) 1991,1990 Carnegie Mellon University
* All Rights Reserved.
*
* Permission to use, copy, modify and distribute this software and its
* documentation is hereby granted, provided that both the copyright
* notice and this permission notice appear in all copies of the
* software, derivative works or modified versions, and any portions
* thereof, and that both notices appear in supporting documentation.
*
* CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
* CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
* ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
*
* Carnegie Mellon requests users of this software to return to
*
* Software Distribution Coordinator or [email protected]
* School of Computer Science
* Carnegie Mellon University
* Pittsburgh PA 15213-3890
*
* any improvements or extensions that they make and grant Carnegie Mellon
* the rights to redistribute these changes.
*/
#ifndef __MACHO__
/*
* Startup code for an i386 on an AT.
* Kernel is loaded starting at 1MB.
* Protected mode, paging disabled.
*/
popl %eax
cmpl $-1,%eax /* new calling convention */
je 0f
/*
* Old calling convention
*
* %esp -> boottype (deprecated)
* size of extended memory (K)
* size of conventional memory (K)
* boothowto (deprecated)
* esym (if KDB set up)
*/
#define SYS_REBOOT_COMPAT 1
#if SYS_REBOOT_COMPAT
movl %eax,PA(EXT(boottype))
#endif
popl PA(EXT(extmem)) /* extended memory, in K */
popl PA(EXT(cnvmem)) /* conventional memory, in K */
popl %edx /* old boothowto */
#if SYS_REBOOT_COMPAT
#define RB_SINGLE 0x2
#define RB_HALT 0x8
#define RB_ALTBOOT 0x40
testb $(RB_SINGLE),%edx /* old RB_SINGLE flag ? */
je 2f
incl PA(EXT(startup_single_user))
2: testb $(RB_HALT),%edx /* old RB_HALT flag ? */
je 2f
incl PA(EXT(halt_in_debugger))
2: testb $(RB_ALTBOOT),%edx /* old RB_ALTBOOT flag ? */
je 2f
incl PA(EXT(cons_is_com1))
2:
#if NCPUS > 1
shrl $0x8,%edx
movb %edx,PA(EXT(wncpu)) /* old want ncpus flag */
#endif
#endif
popl %eax /* get boot_string & esym */
#if SYS_REBOOT_COMPAT
movl %eax, %esi
lea PA(EXT(boot_string_store)), %edi
movl PA(EXT(boot_string_sz)), %ecx
cld
rep
movsb
#endif
/*
* Move symbol table out of the way of BSS.
*
* When kernel is loaded, at the start of BSS we have:
* _edata:
* .long kern_sym_size
* .long boot_image_size
* .long load_info_size
* sym_start:
* kernel symbols
* .align ALIGN
* boot_start:
* bootstrap image
* .align ALIGN
* load_info_start:
* bootstrap load information
*
* all of which must be moved somewhere else, since it
* is sitting in the kernel BSS. In addition, the bootstrap
* image must be moved to a machine page boundary, so that we get:
*
* _edata:
* BSS
* _end: <- kern_sym_start (VA)
* kernel symbols . (kern_sym_size)
* <next page boundary>: <- boot_start (VA)
* bootstrap image
* <- load_info_start (VA)
* load information
* <- %ebx (PA)
*
*/
lea PA(EXT(edata))+4-1,%esi /* point to symbol size word */
andl $~0x3,%esi
movl (%esi),%edx /* get symbol size */
lea PA(EXT(end))+NBPG-1(%edx),%edi
/* point after BSS, add symbol */
/* size, and round up to */
andl $-NBPG,%edi /* machine page boundary */
lea -KVTOPHYS(%edi),%eax /* save virtual address */
movl %eax,PA(EXT(boot_start)) /* of start of bootstrap */
movl 4(%esi),%ecx /* get size of bootstrap */
movl %ecx,PA(EXT(boot_size)) /* save size of bootstrap */
lea -KVTOPHYS(%edi,%ecx),%eax
movl %eax,PA(EXT(load_info_start))
/* save virtual address */
/* of start of loader info */
movl 8(%esi),%eax /* get size of loader info */
movl %eax,PA(EXT(load_info_size))
/* save size of loader info */
addl %eax,%ecx /* get total size to move */
leal 12(%esi,%edx),%esi /* point to start of boot image - source */
leal (%edi,%ecx),%ebx /* point to new location of */
/* end of bootstrap - next */
/* available physical address */
lea -4(%esi,%ecx),%esi /* point to end of src - 4 */
lea -4(%edi,%ecx),%edi /* point to end of dst - 4 */
shrl $2,%ecx /* move by longs */
std /* move backwards */
rep
movsl /* move bootstrap and loader_info */
cld /* reset direction flag */
movl $EXT(end),PA(EXT(kern_sym_start))
/* save virtual address */
/* of start of symbols */
movl %edx,PA(EXT(kern_sym_size)) /* save symbol table size */
testl %edx,%edx /* any symbols? */
jz 1f /* if so: */
/* %esi points to start of boot-4 */
/* == end of symbol table (source) - 4 */
leal PA(EXT(end))-4(%edx),%edi /* point to end of dst - 4 */
movl %edx,%ecx /* copy size */
shrl $2,%ecx /* move by longs */
std /* move backwards */
rep
movsl /* move symbols */
cld /* reset direction flag */
jmp 1f
/*
* New calling convention
*
* %esp -> -1
* size of extended memory (K)
* size of conventional memory (K)
* kern_sym_start
* kern_sym_size
* kern_args_start
* kern_args_size
* boot_sym_start
* boot_sym_size
* boot_args_start
* boot_args_size
* boot_start
* boot_size
* boot_region_desc
* boot_region_count
* boot_thread_state_flavor
* boot_thread_state
* boot_thread_state_count
* env_start
* env_size
* top of loaded memory
*/
#define MEM_BASE 0
#define BOOT_TO_VIRT (MEM_BASE-(KVTOPHYS))
.globl EXT(boot_start)
0:
popl PA(EXT(extmem)) /* extended memory, in K */
popl PA(EXT(cnvmem)) /* conventional memory, in K */
popl %eax
addl $BOOT_TO_VIRT,%eax /* convert to virtual address */
movl %eax,PA(EXT(kern_sym_start))
popl PA(EXT(kern_sym_size))
popl %eax
addl $BOOT_TO_VIRT,%eax /* convert to virtual address */
movl %eax,PA(EXT(kern_args_start))
popl PA(EXT(kern_args_size))
popl %eax
addl $BOOT_TO_VIRT,%eax /* convert to virtual address */
movl %eax,PA(EXT(boot_sym_start))
popl PA(EXT(boot_sym_size))
popl %eax
addl $BOOT_TO_VIRT,%eax /* convert to virtual address */
movl %eax,PA(EXT(boot_args_start))
popl PA(EXT(boot_args_size))
popl %eax
addl $BOOT_TO_VIRT,%eax /* convert to virtual address */
movl %eax,PA(EXT(boot_start))
popl PA(EXT(boot_size))
popl %eax
addl $BOOT_TO_VIRT,%eax /* convert to virtual address */
movl %eax,PA(EXT(boot_region_desc))
popl PA(EXT(boot_region_count))
popl PA(EXT(boot_thread_state_flavor))
popl %eax
addl $BOOT_TO_VIRT,%eax /* convert to virtual address */
movl %eax,PA(EXT(boot_thread_state))
popl PA(EXT(boot_thread_state_count))
popl %eax
addl $BOOT_TO_VIRT,%eax /* convert to virtual address */
movl %eax,PA(EXT(env_start))
popl PA(EXT(env_size))
popl %ebx /* mem top */
addl $MEM_BASE,%ebx /* translate */
1:
#else
cld
call PA(EXT(i386_preinit))
movl %eax,%ebx
#endif