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