startprog32.S revision 1.3 1 1.3 manu /* $NetBSD: startprog32.S,v 1.3 2023/04/20 00:42:24 manu 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.3 manu
121 1.3 manu /* skip copy if same source and destination */
122 1.3 manu cmpl %edi,%esi
123 1.3 manu jz .Lcopy_done
124 1.3 manu
125 1.1 nonaka #if defined(NO_OVERLAP)
126 1.1 nonaka movl %ecx, %eax
127 1.1 nonaka #else
128 1.1 nonaka movl %edi, %eax
129 1.1 nonaka subl %esi, %eax
130 1.1 nonaka cmpl %ecx, %eax /* overlapping? */
131 1.1 nonaka movl %ecx, %eax
132 1.1 nonaka jb .Lbackwards
133 1.1 nonaka #endif
134 1.1 nonaka /* nope, copy forwards. */
135 1.1 nonaka shrl $2, %ecx /* copy by words */
136 1.1 nonaka rep
137 1.1 nonaka movsl
138 1.1 nonaka and $3, %eax /* any bytes left? */
139 1.1 nonaka jnz .Ltrailing
140 1.1 nonaka jmp .Lcopy_done
141 1.1 nonaka
142 1.1 nonaka .Ltrailing:
143 1.1 nonaka cmp $2, %eax
144 1.1 nonaka jb 1f
145 1.1 nonaka movw (%esi), %ax
146 1.1 nonaka movw %ax, (%edi)
147 1.1 nonaka je .Lcopy_done
148 1.1 nonaka movb 2(%esi), %al
149 1.1 nonaka movb %al, 2(%edi)
150 1.1 nonaka jmp .Lcopy_done
151 1.1 nonaka 1: movb (%esi), %al
152 1.1 nonaka movb %al, (%edi)
153 1.1 nonaka jmp .Lcopy_done
154 1.1 nonaka
155 1.1 nonaka #if !defined(NO_OVERLAP)
156 1.1 nonaka .Lbackwards:
157 1.1 nonaka addl %ecx, %edi /* copy backwards. */
158 1.1 nonaka addl %ecx, %esi
159 1.1 nonaka and $3, %eax /* any fractional bytes? */
160 1.1 nonaka jnz .Lback_align
161 1.1 nonaka .Lback_aligned:
162 1.1 nonaka shrl $2, %ecx
163 1.1 nonaka subl $4, %esi
164 1.1 nonaka subl $4, %edi
165 1.1 nonaka std
166 1.1 nonaka rep
167 1.1 nonaka movsl
168 1.1 nonaka cld
169 1.1 nonaka jmp .Lcopy_done
170 1.1 nonaka
171 1.1 nonaka .Lback_align:
172 1.1 nonaka sub %eax, %esi
173 1.1 nonaka sub %eax, %edi
174 1.1 nonaka cmp $2, %eax
175 1.1 nonaka jb 1f
176 1.1 nonaka je 2f
177 1.1 nonaka movb 2(%esi), %al
178 1.1 nonaka movb %al, 2(%edi)
179 1.1 nonaka 2: movw (%esi), %ax
180 1.1 nonaka movw %ax, (%edi)
181 1.1 nonaka jmp .Lback_aligned
182 1.1 nonaka 1: movb (%esi), %al
183 1.1 nonaka movb %al, (%edi)
184 1.1 nonaka jmp .Lback_aligned
185 1.1 nonaka #endif
186 1.1 nonaka /* End of copy kernel */
187 1.1 nonaka .Lcopy_done:
188 1.1 nonaka cld /* LynxOS depends on it */
189 1.1 nonaka
190 1.1 nonaka /* Prepare jump address */
191 1.2 nonaka lea (start32a - start)(%edx), %eax
192 1.2 nonaka movl %eax, (start32r - start)(%edx)
193 1.1 nonaka
194 1.1 nonaka /* Setup GDT */
195 1.2 nonaka lea (gdt - start)(%edx), %eax
196 1.2 nonaka movl %eax, (gdtrr - start)(%edx)
197 1.2 nonaka lgdt (gdtr - start)(%edx)
198 1.1 nonaka
199 1.1 nonaka /* Jump to set %cs */
200 1.2 nonaka ljmp *(start32r - start)(%edx)
201 1.1 nonaka
202 1.1 nonaka .align 4
203 1.1 nonaka start32a:
204 1.1 nonaka movl $DATA_SEGMENT, %eax
205 1.1 nonaka movw %ax, %ds
206 1.1 nonaka movw %ax, %es
207 1.1 nonaka movw %ax, %fs
208 1.1 nonaka movw %ax, %gs
209 1.1 nonaka movw %ax, %ss
210 1.1 nonaka
211 1.2 nonaka /* Already set new stack pointer */
212 1.2 nonaka movl %esp, %ebp
213 1.1 nonaka
214 1.1 nonaka /* Disable Paging in CR0 */
215 1.1 nonaka movl %cr0, %eax
216 1.1 nonaka andl $(~CR0_PG), %eax
217 1.1 nonaka movl %eax, %cr0
218 1.1 nonaka
219 1.1 nonaka /* Disable PAE in CR4 */
220 1.1 nonaka movl %cr4, %eax
221 1.1 nonaka andl $(~CR4_PAE), %eax
222 1.1 nonaka movl %eax, %cr4
223 1.1 nonaka
224 1.1 nonaka jmp start32b
225 1.1 nonaka
226 1.1 nonaka .align 4
227 1.1 nonaka start32b:
228 1.1 nonaka xor %eax, %eax
229 1.2 nonaka movl %ebx, (start32r - start)(%edx)
230 1.2 nonaka ljmp *(start32r - start)(%edx)
231 1.1 nonaka
232 1.1 nonaka .align 16
233 1.1 nonaka start32r:
234 1.1 nonaka .long 0
235 1.1 nonaka .long CODE_SEGMENT
236 1.1 nonaka .align 16
237 1.1 nonaka gdt:
238 1.1 nonaka .long 0, 0
239 1.1 nonaka .byte 0xff, 0xff, 0x00, 0x00, 0x00, 0x9f, 0xcf, 0x00
240 1.1 nonaka .byte 0xff, 0xff, 0x00, 0x00, 0x00, 0x93, 0xcf, 0x00
241 1.1 nonaka gdtr:
242 1.1 nonaka .word gdtr - gdt
243 1.1 nonaka gdtrr:
244 1.1 nonaka .quad
245 1.1 nonaka start32end:
246 1.1 nonaka /* Space for the stack */
247 1.1 nonaka .align 16
248 1.1 nonaka .space 8192
249 1.1 nonaka startprog32_end:
250