xref: /minix3/sys/arch/i386/stand/lib/startprog.S (revision 58a2b0008e28f606a7f7f5faaeaba4faac57a1ea)
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