1*58a2b000SEvgeniy Ivanov/* $NetBSD: startprog.S,v 1.3 2003/02/01 14:48:18 dsl Exp $ */ 2*58a2b000SEvgeniy Ivanov 3*58a2b000SEvgeniy Ivanov/* starts program in protected mode / flat space 4*58a2b000SEvgeniy Ivanov with given stackframe 5*58a2b000SEvgeniy Ivanov needs global variables flatcodeseg and flatdataseg 6*58a2b000SEvgeniy Ivanov (gdt offsets) 7*58a2b000SEvgeniy Ivanov derived from: NetBSD:sys/arch/i386/boot/asm.S 8*58a2b000SEvgeniy Ivanov */ 9*58a2b000SEvgeniy Ivanov 10*58a2b000SEvgeniy Ivanov/* 11*58a2b000SEvgeniy Ivanov * Ported to boot 386BSD by Julian Elischer (julian@tfs.com) Sept 1992 12*58a2b000SEvgeniy Ivanov * 13*58a2b000SEvgeniy Ivanov * Mach Operating System 14*58a2b000SEvgeniy Ivanov * Copyright (c) 1992, 1991 Carnegie Mellon University 15*58a2b000SEvgeniy Ivanov * All Rights Reserved. 16*58a2b000SEvgeniy Ivanov * 17*58a2b000SEvgeniy Ivanov * Permission to use, copy, modify and distribute this software and its 18*58a2b000SEvgeniy Ivanov * documentation is hereby granted, provided that both the copyright 19*58a2b000SEvgeniy Ivanov * notice and this permission notice appear in all copies of the 20*58a2b000SEvgeniy Ivanov * software, derivative works or modified versions, and any portions 21*58a2b000SEvgeniy Ivanov * thereof, and that both notices appear in supporting documentation. 22*58a2b000SEvgeniy Ivanov * 23*58a2b000SEvgeniy Ivanov * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" 24*58a2b000SEvgeniy Ivanov * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR 25*58a2b000SEvgeniy Ivanov * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. 26*58a2b000SEvgeniy Ivanov * 27*58a2b000SEvgeniy Ivanov * Carnegie Mellon requests users of this software to return to 28*58a2b000SEvgeniy Ivanov * 29*58a2b000SEvgeniy Ivanov * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU 30*58a2b000SEvgeniy Ivanov * School of Computer Science 31*58a2b000SEvgeniy Ivanov * Carnegie Mellon University 32*58a2b000SEvgeniy Ivanov * Pittsburgh PA 15213-3890 33*58a2b000SEvgeniy Ivanov * 34*58a2b000SEvgeniy Ivanov * any improvements or extensions that they make and grant Carnegie Mellon 35*58a2b000SEvgeniy Ivanov * the rights to redistribute these changes. 36*58a2b000SEvgeniy Ivanov */ 37*58a2b000SEvgeniy Ivanov 38*58a2b000SEvgeniy Ivanov/* 39*58a2b000SEvgeniy Ivanov Copyright 1988, 1989, 1990, 1991, 1992 40*58a2b000SEvgeniy Ivanov by Intel Corporation, Santa Clara, California. 41*58a2b000SEvgeniy Ivanov 42*58a2b000SEvgeniy Ivanov All Rights Reserved 43*58a2b000SEvgeniy Ivanov 44*58a2b000SEvgeniy IvanovPermission to use, copy, modify, and distribute this software and 45*58a2b000SEvgeniy Ivanovits documentation for any purpose and without fee is hereby 46*58a2b000SEvgeniy Ivanovgranted, provided that the above copyright notice appears in all 47*58a2b000SEvgeniy Ivanovcopies and that both the copyright notice and this permission notice 48*58a2b000SEvgeniy Ivanovappear in supporting documentation, and that the name of Intel 49*58a2b000SEvgeniy Ivanovnot be used in advertising or publicity pertaining to distribution 50*58a2b000SEvgeniy Ivanovof the software without specific, written prior permission. 51*58a2b000SEvgeniy Ivanov 52*58a2b000SEvgeniy IvanovINTEL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE 53*58a2b000SEvgeniy IvanovINCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, 54*58a2b000SEvgeniy IvanovIN NO EVENT SHALL INTEL BE LIABLE FOR ANY SPECIAL, INDIRECT, OR 55*58a2b000SEvgeniy IvanovCONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM 56*58a2b000SEvgeniy IvanovLOSS OF USE, DATA OR PROFITS, WHETHER IN ACTION OF CONTRACT, 57*58a2b000SEvgeniy IvanovNEGLIGENCE, OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION 58*58a2b000SEvgeniy IvanovWITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 59*58a2b000SEvgeniy Ivanov*/ 60*58a2b000SEvgeniy Ivanov 61*58a2b000SEvgeniy Ivanov#include <machine/asm.h> 62*58a2b000SEvgeniy Ivanov 63*58a2b000SEvgeniy Ivanov/* 64*58a2b000SEvgeniy Ivanov * startprog(phyaddr,argc,argv,stack) 65*58a2b000SEvgeniy Ivanov * start the program on protected mode where phyaddr is the entry point 66*58a2b000SEvgeniy Ivanov */ 67*58a2b000SEvgeniy IvanovENTRY(startprog) 68*58a2b000SEvgeniy Ivanov pushl %ebp 69*58a2b000SEvgeniy Ivanov movl %esp, %ebp 70*58a2b000SEvgeniy Ivanov 71*58a2b000SEvgeniy Ivanov # prepare a new stack 72*58a2b000SEvgeniy Ivanov movl $flatdataseg, %ebx 73*58a2b000SEvgeniy Ivanov movw %bx, %es # for arg copy 74*58a2b000SEvgeniy Ivanov movl 20(%ebp), %eax # stack 75*58a2b000SEvgeniy Ivanov subl $4,%eax 76*58a2b000SEvgeniy Ivanov movl %eax, %edi 77*58a2b000SEvgeniy Ivanov 78*58a2b000SEvgeniy Ivanov # push some number of args onto the stack 79*58a2b000SEvgeniy Ivanov movl 12(%ebp), %ecx # argc 80*58a2b000SEvgeniy Ivanov 81*58a2b000SEvgeniy Ivanov movl %ecx, %eax 82*58a2b000SEvgeniy Ivanov decl %eax 83*58a2b000SEvgeniy Ivanov shl $2, %eax 84*58a2b000SEvgeniy Ivanov addl 16(%ebp), %eax # ptr to last arg 85*58a2b000SEvgeniy Ivanov movl %eax, %esi 86*58a2b000SEvgeniy Ivanov 87*58a2b000SEvgeniy Ivanov std # backwards 88*58a2b000SEvgeniy Ivanov rep 89*58a2b000SEvgeniy Ivanov movsl 90*58a2b000SEvgeniy Ivanov 91*58a2b000SEvgeniy Ivanov cld # LynxOS depends on it 92*58a2b000SEvgeniy Ivanov 93*58a2b000SEvgeniy Ivanov movl 8(%ebp), %ecx # entry 94*58a2b000SEvgeniy Ivanov 95*58a2b000SEvgeniy Ivanov # set new stackptr (movsl decd sp 1 more -> dummy return address) 96*58a2b000SEvgeniy Ivanov movw %bx, %ss 97*58a2b000SEvgeniy Ivanov movl %edi, %esp 98*58a2b000SEvgeniy Ivanov 99*58a2b000SEvgeniy Ivanov # push on our entry address 100*58a2b000SEvgeniy Ivanov movl $flatcodeseg, %ebx # segment 101*58a2b000SEvgeniy Ivanov pushl %ebx 102*58a2b000SEvgeniy Ivanov pushl %ecx #entry 103*58a2b000SEvgeniy Ivanov 104*58a2b000SEvgeniy Ivanov # convert over the other data segs 105*58a2b000SEvgeniy Ivanov movl $flatdataseg, %ebx 106*58a2b000SEvgeniy Ivanov mov %bx, %ds 107*58a2b000SEvgeniy Ivanov mov %bx, %es 108*58a2b000SEvgeniy Ivanov 109*58a2b000SEvgeniy Ivanov # convert the PC (and code seg) 110*58a2b000SEvgeniy Ivanov lret 111