startprog32.S revision 1.1 1 1.1 nonaka /* $NetBSD: startprog32.S,v 1.1 2017/02/21 10:53:37 nonaka Exp $ */
2 1.1 nonaka /* NetBSD: startprog.S,v 1.4 2016/12/04 08:21:08 maxv Exp */
3 1.1 nonaka
4 1.1 nonaka /*
5 1.1 nonaka * Ported to boot 386BSD by Julian Elischer (julian (at) tfs.com) Sept 1992
6 1.1 nonaka *
7 1.1 nonaka * Mach Operating System
8 1.1 nonaka * Copyright (c) 1992, 1991 Carnegie Mellon University
9 1.1 nonaka * All Rights Reserved.
10 1.1 nonaka *
11 1.1 nonaka * Permission to use, copy, modify and distribute this software and its
12 1.1 nonaka * documentation is hereby granted, provided that both the copyright
13 1.1 nonaka * notice and this permission notice appear in all copies of the
14 1.1 nonaka * software, derivative works or modified versions, and any portions
15 1.1 nonaka * thereof, and that both notices appear in supporting documentation.
16 1.1 nonaka *
17 1.1 nonaka * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
18 1.1 nonaka * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
19 1.1 nonaka * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
20 1.1 nonaka *
21 1.1 nonaka * Carnegie Mellon requests users of this software to return to
22 1.1 nonaka *
23 1.1 nonaka * Software Distribution Coordinator or Software.Distribution (at) CS.CMU.EDU
24 1.1 nonaka * School of Computer Science
25 1.1 nonaka * Carnegie Mellon University
26 1.1 nonaka * Pittsburgh PA 15213-3890
27 1.1 nonaka *
28 1.1 nonaka * any improvements or extensions that they make and grant Carnegie Mellon
29 1.1 nonaka * the rights to redistribute these changes.
30 1.1 nonaka */
31 1.1 nonaka
32 1.1 nonaka /*
33 1.1 nonaka * Copyright 1988, 1989, 1990, 1991, 1992
34 1.1 nonaka * by Intel Corporation, Santa Clara, California.
35 1.1 nonaka *
36 1.1 nonaka * All Rights Reserved
37 1.1 nonaka *
38 1.1 nonaka * Permission to use, copy, modify, and distribute this software and
39 1.1 nonaka * its documentation for any purpose and without fee is hereby
40 1.1 nonaka * granted, provided that the above copyright notice appears in all
41 1.1 nonaka * copies and that both the copyright notice and this permission notice
42 1.1 nonaka * appear in supporting documentation, and that the name of Intel
43 1.1 nonaka * not be used in advertising or publicity pertaining to distribution
44 1.1 nonaka * of the software without specific, written prior permission.
45 1.1 nonaka *
46 1.1 nonaka * INTEL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE
47 1.1 nonaka * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS,
48 1.1 nonaka * IN NO EVENT SHALL INTEL BE LIABLE FOR ANY SPECIAL, INDIRECT, OR
49 1.1 nonaka * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
50 1.1 nonaka * LOSS OF USE, DATA OR PROFITS, WHETHER IN ACTION OF CONTRACT,
51 1.1 nonaka * NEGLIGENCE, OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
52 1.1 nonaka * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
53 1.1 nonaka */
54 1.1 nonaka
55 1.1 nonaka #include <machine/asm.h>
56 1.1 nonaka #include <machine/specialreg.h>
57 1.1 nonaka
58 1.1 nonaka #define CODE_SEGMENT 0x08
59 1.1 nonaka #define DATA_SEGMENT 0x10
60 1.1 nonaka
61 1.1 nonaka .align 16
62 1.1 nonaka .globl _C_LABEL(startprog32)
63 1.1 nonaka _C_LABEL(startprog32):
64 1.1 nonaka .quad 0
65 1.1 nonaka
66 1.1 nonaka .globl _C_LABEL(startprog32_size)
67 1.1 nonaka _C_LABEL(startprog32_size):
68 1.1 nonaka .long startprog32_end - _C_LABEL(startprog32_start)
69 1.1 nonaka
70 1.1 nonaka .text
71 1.1 nonaka .p2align 4,,15
72 1.1 nonaka
73 1.1 nonaka /*
74 1.1 nonaka * startprog32(entry,argc,argv,stack,kern_start,kern_load,kern_size,loadaddr)
75 1.1 nonaka */
76 1.1 nonaka ENTRY(startprog32_start)
77 1.1 nonaka start:
78 1.1 nonaka pushl %ebp
79 1.1 nonaka movl %esp, %ebp
80 1.1 nonaka
81 1.1 nonaka /*
82 1.1 nonaka * 8(%ebp): kernel entry address
83 1.1 nonaka * 12(%ebp): argc
84 1.1 nonaka * 16(%ebp): argv
85 1.1 nonaka * 20(%ebp): stack address
86 1.1 nonaka * 24(%ebp): kernel start address
87 1.1 nonaka * 28(%ebp): loaded kernel address
88 1.1 nonaka * 32(%ebp): loaded kernel size
89 1.1 nonaka * 36(%ebp): loaded start address
90 1.1 nonaka */
91 1.1 nonaka
92 1.1 nonaka cli
93 1.1 nonaka
94 1.1 nonaka /* Prepare a new stack */
95 1.1 nonaka movl 20(%ebp), %eax /* stack */
96 1.1 nonaka subl $4, %eax
97 1.1 nonaka movl %eax, %edi
98 1.1 nonaka
99 1.1 nonaka /* Push some number of args onto the stack */
100 1.1 nonaka movl 12(%ebp), %ecx /* argc */
101 1.1 nonaka movl %ecx, %eax
102 1.1 nonaka decl %eax
103 1.1 nonaka shl $2, %eax
104 1.1 nonaka addl 16(%ebp), %eax /* ptr to last arg */
105 1.1 nonaka movl %eax, %esi
106 1.1 nonaka
107 1.1 nonaka std /* backwards */
108 1.1 nonaka rep
109 1.1 nonaka movsl /* copy %ds:(%esi) -> %es:(%edi) */
110 1.1 nonaka cld
111 1.1 nonaka mov %edi, %edx /* %edx: new stack pointer */
112 1.1 nonaka
113 1.1 nonaka /* Copy kernel */
114 1.1 nonaka movl 24(%esp), %edi /* dest */
115 1.1 nonaka movl 28(%esp), %esi /* src */
116 1.1 nonaka movl 32(%esp), %ecx /* size */
117 1.1 nonaka #if defined(NO_OVERLAP)
118 1.1 nonaka movl %ecx, %eax
119 1.1 nonaka #else
120 1.1 nonaka movl %edi, %eax
121 1.1 nonaka subl %esi, %eax
122 1.1 nonaka cmpl %ecx, %eax /* overlapping? */
123 1.1 nonaka movl %ecx, %eax
124 1.1 nonaka jb .Lbackwards
125 1.1 nonaka #endif
126 1.1 nonaka /* nope, copy forwards. */
127 1.1 nonaka shrl $2, %ecx /* copy by words */
128 1.1 nonaka rep
129 1.1 nonaka movsl
130 1.1 nonaka and $3, %eax /* any bytes left? */
131 1.1 nonaka jnz .Ltrailing
132 1.1 nonaka jmp .Lcopy_done
133 1.1 nonaka
134 1.1 nonaka .Ltrailing:
135 1.1 nonaka cmp $2, %eax
136 1.1 nonaka jb 1f
137 1.1 nonaka movw (%esi), %ax
138 1.1 nonaka movw %ax, (%edi)
139 1.1 nonaka je .Lcopy_done
140 1.1 nonaka movb 2(%esi), %al
141 1.1 nonaka movb %al, 2(%edi)
142 1.1 nonaka jmp .Lcopy_done
143 1.1 nonaka 1: movb (%esi), %al
144 1.1 nonaka movb %al, (%edi)
145 1.1 nonaka jmp .Lcopy_done
146 1.1 nonaka
147 1.1 nonaka #if !defined(NO_OVERLAP)
148 1.1 nonaka .Lbackwards:
149 1.1 nonaka addl %ecx, %edi /* copy backwards. */
150 1.1 nonaka addl %ecx, %esi
151 1.1 nonaka and $3, %eax /* any fractional bytes? */
152 1.1 nonaka jnz .Lback_align
153 1.1 nonaka .Lback_aligned:
154 1.1 nonaka shrl $2, %ecx
155 1.1 nonaka subl $4, %esi
156 1.1 nonaka subl $4, %edi
157 1.1 nonaka std
158 1.1 nonaka rep
159 1.1 nonaka movsl
160 1.1 nonaka cld
161 1.1 nonaka jmp .Lcopy_done
162 1.1 nonaka
163 1.1 nonaka .Lback_align:
164 1.1 nonaka sub %eax, %esi
165 1.1 nonaka sub %eax, %edi
166 1.1 nonaka cmp $2, %eax
167 1.1 nonaka jb 1f
168 1.1 nonaka je 2f
169 1.1 nonaka movb 2(%esi), %al
170 1.1 nonaka movb %al, 2(%edi)
171 1.1 nonaka 2: movw (%esi), %ax
172 1.1 nonaka movw %ax, (%edi)
173 1.1 nonaka jmp .Lback_aligned
174 1.1 nonaka 1: movb (%esi), %al
175 1.1 nonaka movb %al, (%edi)
176 1.1 nonaka jmp .Lback_aligned
177 1.1 nonaka #endif
178 1.1 nonaka /* End of copy kernel */
179 1.1 nonaka .Lcopy_done:
180 1.1 nonaka cld /* LynxOS depends on it */
181 1.1 nonaka
182 1.1 nonaka movl 8(%ebp), %esi /* %esi: entry address */
183 1.1 nonaka movl 36(%ebp), %edi /* %edi: loaded start address */
184 1.1 nonaka
185 1.1 nonaka /* Prepare jump address */
186 1.1 nonaka lea (start32a - start)(%edi), %eax
187 1.1 nonaka movl %eax, (start32r - start)(%edi)
188 1.1 nonaka
189 1.1 nonaka /* Setup GDT */
190 1.1 nonaka lea (gdt - start)(%edi), %eax
191 1.1 nonaka movl %eax, (gdtrr - start)(%edi)
192 1.1 nonaka lgdt (gdtr - start)(%edi)
193 1.1 nonaka
194 1.1 nonaka /* Jump to set %cs */
195 1.1 nonaka ljmp *(start32r - start)(%edi)
196 1.1 nonaka
197 1.1 nonaka .align 4
198 1.1 nonaka start32a:
199 1.1 nonaka movl $DATA_SEGMENT, %eax
200 1.1 nonaka movw %ax, %ds
201 1.1 nonaka movw %ax, %es
202 1.1 nonaka movw %ax, %fs
203 1.1 nonaka movw %ax, %gs
204 1.1 nonaka movw %ax, %ss
205 1.1 nonaka
206 1.1 nonaka movl %edx, %esp
207 1.1 nonaka
208 1.1 nonaka /* Disable Paging in CR0 */
209 1.1 nonaka movl %cr0, %eax
210 1.1 nonaka andl $(~CR0_PG), %eax
211 1.1 nonaka movl %eax, %cr0
212 1.1 nonaka
213 1.1 nonaka /* Disable PAE in CR4 */
214 1.1 nonaka movl %cr4, %eax
215 1.1 nonaka andl $(~CR4_PAE), %eax
216 1.1 nonaka movl %eax, %cr4
217 1.1 nonaka
218 1.1 nonaka jmp start32b
219 1.1 nonaka
220 1.1 nonaka .align 4
221 1.1 nonaka start32b:
222 1.1 nonaka xor %eax, %eax
223 1.1 nonaka movl %esi, (start32r - start)(%edi)
224 1.1 nonaka ljmp *(start32r - start)(%edi)
225 1.1 nonaka
226 1.1 nonaka .align 16
227 1.1 nonaka start32r:
228 1.1 nonaka .long 0
229 1.1 nonaka .long CODE_SEGMENT
230 1.1 nonaka .align 16
231 1.1 nonaka gdt:
232 1.1 nonaka .long 0, 0
233 1.1 nonaka .byte 0xff, 0xff, 0x00, 0x00, 0x00, 0x9f, 0xcf, 0x00
234 1.1 nonaka .byte 0xff, 0xff, 0x00, 0x00, 0x00, 0x93, 0xcf, 0x00
235 1.1 nonaka gdtr:
236 1.1 nonaka .word gdtr - gdt
237 1.1 nonaka gdtrr:
238 1.1 nonaka .quad
239 1.1 nonaka start32end:
240 1.1 nonaka /* Space for the stack */
241 1.1 nonaka .align 16
242 1.1 nonaka .space 8192
243 1.1 nonaka startprog32_end:
244