startprog32.S revision 1.2 1 1.2 nonaka /* $NetBSD: startprog32.S,v 1.2 2017/02/24 12:24:25 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.2 nonaka movl 8(%ebp), %ebx /* %ebx: entry address */
95 1.2 nonaka movl 36(%ebp), %edx /* %edx: loaded start address */
96 1.2 nonaka
97 1.1 nonaka /* Prepare a new stack */
98 1.1 nonaka movl 20(%ebp), %eax /* stack */
99 1.1 nonaka subl $4, %eax
100 1.1 nonaka movl %eax, %edi
101 1.1 nonaka
102 1.1 nonaka /* Push some number of args onto the stack */
103 1.1 nonaka movl 12(%ebp), %ecx /* argc */
104 1.1 nonaka movl %ecx, %eax
105 1.1 nonaka decl %eax
106 1.1 nonaka shl $2, %eax
107 1.1 nonaka addl 16(%ebp), %eax /* ptr to last arg */
108 1.1 nonaka movl %eax, %esi
109 1.1 nonaka
110 1.1 nonaka std /* backwards */
111 1.1 nonaka rep
112 1.1 nonaka movsl /* copy %ds:(%esi) -> %es:(%edi) */
113 1.1 nonaka cld
114 1.2 nonaka mov %edi, %esp /* set new stack pointer */
115 1.1 nonaka
116 1.1 nonaka /* Copy kernel */
117 1.2 nonaka movl 24(%ebp), %edi /* dest */
118 1.2 nonaka movl 28(%ebp), %esi /* src */
119 1.2 nonaka movl 32(%ebp), %ecx /* size */
120 1.1 nonaka #if defined(NO_OVERLAP)
121 1.1 nonaka movl %ecx, %eax
122 1.1 nonaka #else
123 1.1 nonaka movl %edi, %eax
124 1.1 nonaka subl %esi, %eax
125 1.1 nonaka cmpl %ecx, %eax /* overlapping? */
126 1.1 nonaka movl %ecx, %eax
127 1.1 nonaka jb .Lbackwards
128 1.1 nonaka #endif
129 1.1 nonaka /* nope, copy forwards. */
130 1.1 nonaka shrl $2, %ecx /* copy by words */
131 1.1 nonaka rep
132 1.1 nonaka movsl
133 1.1 nonaka and $3, %eax /* any bytes left? */
134 1.1 nonaka jnz .Ltrailing
135 1.1 nonaka jmp .Lcopy_done
136 1.1 nonaka
137 1.1 nonaka .Ltrailing:
138 1.1 nonaka cmp $2, %eax
139 1.1 nonaka jb 1f
140 1.1 nonaka movw (%esi), %ax
141 1.1 nonaka movw %ax, (%edi)
142 1.1 nonaka je .Lcopy_done
143 1.1 nonaka movb 2(%esi), %al
144 1.1 nonaka movb %al, 2(%edi)
145 1.1 nonaka jmp .Lcopy_done
146 1.1 nonaka 1: movb (%esi), %al
147 1.1 nonaka movb %al, (%edi)
148 1.1 nonaka jmp .Lcopy_done
149 1.1 nonaka
150 1.1 nonaka #if !defined(NO_OVERLAP)
151 1.1 nonaka .Lbackwards:
152 1.1 nonaka addl %ecx, %edi /* copy backwards. */
153 1.1 nonaka addl %ecx, %esi
154 1.1 nonaka and $3, %eax /* any fractional bytes? */
155 1.1 nonaka jnz .Lback_align
156 1.1 nonaka .Lback_aligned:
157 1.1 nonaka shrl $2, %ecx
158 1.1 nonaka subl $4, %esi
159 1.1 nonaka subl $4, %edi
160 1.1 nonaka std
161 1.1 nonaka rep
162 1.1 nonaka movsl
163 1.1 nonaka cld
164 1.1 nonaka jmp .Lcopy_done
165 1.1 nonaka
166 1.1 nonaka .Lback_align:
167 1.1 nonaka sub %eax, %esi
168 1.1 nonaka sub %eax, %edi
169 1.1 nonaka cmp $2, %eax
170 1.1 nonaka jb 1f
171 1.1 nonaka je 2f
172 1.1 nonaka movb 2(%esi), %al
173 1.1 nonaka movb %al, 2(%edi)
174 1.1 nonaka 2: movw (%esi), %ax
175 1.1 nonaka movw %ax, (%edi)
176 1.1 nonaka jmp .Lback_aligned
177 1.1 nonaka 1: movb (%esi), %al
178 1.1 nonaka movb %al, (%edi)
179 1.1 nonaka jmp .Lback_aligned
180 1.1 nonaka #endif
181 1.1 nonaka /* End of copy kernel */
182 1.1 nonaka .Lcopy_done:
183 1.1 nonaka cld /* LynxOS depends on it */
184 1.1 nonaka
185 1.1 nonaka /* Prepare jump address */
186 1.2 nonaka lea (start32a - start)(%edx), %eax
187 1.2 nonaka movl %eax, (start32r - start)(%edx)
188 1.1 nonaka
189 1.1 nonaka /* Setup GDT */
190 1.2 nonaka lea (gdt - start)(%edx), %eax
191 1.2 nonaka movl %eax, (gdtrr - start)(%edx)
192 1.2 nonaka lgdt (gdtr - start)(%edx)
193 1.1 nonaka
194 1.1 nonaka /* Jump to set %cs */
195 1.2 nonaka ljmp *(start32r - start)(%edx)
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.2 nonaka /* Already set new stack pointer */
207 1.2 nonaka movl %esp, %ebp
208 1.1 nonaka
209 1.1 nonaka /* Disable Paging in CR0 */
210 1.1 nonaka movl %cr0, %eax
211 1.1 nonaka andl $(~CR0_PG), %eax
212 1.1 nonaka movl %eax, %cr0
213 1.1 nonaka
214 1.1 nonaka /* Disable PAE in CR4 */
215 1.1 nonaka movl %cr4, %eax
216 1.1 nonaka andl $(~CR4_PAE), %eax
217 1.1 nonaka movl %eax, %cr4
218 1.1 nonaka
219 1.1 nonaka jmp start32b
220 1.1 nonaka
221 1.1 nonaka .align 4
222 1.1 nonaka start32b:
223 1.1 nonaka xor %eax, %eax
224 1.2 nonaka movl %ebx, (start32r - start)(%edx)
225 1.2 nonaka ljmp *(start32r - start)(%edx)
226 1.1 nonaka
227 1.1 nonaka .align 16
228 1.1 nonaka start32r:
229 1.1 nonaka .long 0
230 1.1 nonaka .long CODE_SEGMENT
231 1.1 nonaka .align 16
232 1.1 nonaka gdt:
233 1.1 nonaka .long 0, 0
234 1.1 nonaka .byte 0xff, 0xff, 0x00, 0x00, 0x00, 0x9f, 0xcf, 0x00
235 1.1 nonaka .byte 0xff, 0xff, 0x00, 0x00, 0x00, 0x93, 0xcf, 0x00
236 1.1 nonaka gdtr:
237 1.1 nonaka .word gdtr - gdt
238 1.1 nonaka gdtrr:
239 1.1 nonaka .quad
240 1.1 nonaka start32end:
241 1.1 nonaka /* Space for the stack */
242 1.1 nonaka .align 16
243 1.1 nonaka .space 8192
244 1.1 nonaka startprog32_end:
245