1/* $NetBSD: biosboot.S,v 1.7 2010/12/20 00:39:06 jakllsch Exp $ */ 2 3/*- 4 * Copyright (c) 2003 The NetBSD Foundation, Inc. 5 * All rights reserved. 6 * 7 * This code is derived from software contributed to The NetBSD Foundation 8 * by David Laight. 9 * 10 * Redistribution and use in source and binary forms, with or without 11 * modification, are permitted provided that the following conditions 12 * are met: 13 * 1. Redistributions of source code must retain the above copyright 14 * notice, this list of conditions and the following disclaimer. 15 * 2. Redistributions in binary form must reproduce the above copyright 16 * notice, this list of conditions and the following disclaimer in the 17 * documentation and/or other materials provided with the distribution. 18 * 19 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 20 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 21 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 22 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 23 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 24 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 25 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 26 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 27 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 28 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 29 * POSSIBILITY OF SUCH DAMAGE. 30 */ 31 32#include <machine/asm.h> 33#include <sys/bootblock.h> 34 35/* 36 * Code linked to 0x1000:0 and (usually) read from /boot by bootxx code 37 * 38 * On entry: 39 * %dl BIOS drive number 40 * %ecx:%ebx Sector number of NetBSD partition 41 * %ds:%si Boot parameter block (patched by installboot) 42 * %cs 0x1000 43 * %ds, %es, %ss All zero 44 * %sp near 0xfffc 45 */ 46 47 .text 48 .code16 49ENTRY(boot_start) 50 jmp boot_start_1 51 .balign 4 52ENTRY(boot_magic) 53 .long X86_BOOT_MAGIC_2 /* checked for by bootxx code */ 54ENTRY(boot_params) 55 .long boot_start_1 - boot_params 56#include <boot_params.S> 57 . = boot_start + 0x80 /* space for patchable variables */ 58boot_start_1: 59 60#if 0 61 /* Allow for boot_start not being %cs:0 */ 62 call 2f 632: pop %cx 64 sub $2b, %cx /* %ax is offset */ 65 test $0xf, %cx /* check code seg aligned */ 66 jz 3f 67 lret /* not playing if not */ 683: mov %cs, %ax 69 shr $4, %cx 70 add %cx, %ax /* segment staring at boot_start */ 71 push %ax 72 push $4f 73 lret 744: 75#endif 76 77 mov %cs, %ax 78 mov %ax, %es 79 80 movl %ecx, %ebp /* move LBA out of the way */ 81 82 /* Grab boot_params patched into bootxx by installboot */ 83 cmpl $X86_BOOT_MAGIC_1,-4(%si) /* sanity check ptr */ 84 jne 2f 85 mov $boot_params, %di 86 movl (%si),%ecx 87 cmp $boot_start_1 - boot_params, %cx 88 jbe 1f 89 mov $boot_start_1 - boot_params, %cx 901: cld 91 rep 92 movsb 932: 94 95 mov %ax, %ds 96 movl $_end, %eax /* top of bss */ 97 shr $4, %eax /* as a segment */ 98 add $0x1001, %ax /* and + 64k */ 99 mov %ax, %ss /* for stack */ 100 mov $0xfffc, %sp /* %sp at top of it */ 101 102 call gdt_fixup 103 104 calll real_to_prot 105 .code32 106 107 movl $_end, %ecx /* zero bss */ 108 movl $__bss_start, %edi 109 subl %edi, %ecx 110 shr $2, %ecx /* _end and __bss_start are aligned */ 111 xor %eax, %eax 112 rep 113 stosl 114 115 testb $X86_BP_FLAGS_LBA64VALID, boot_params+4 116 jnz 1f 117 xorl %ebp, %ebp /* high part of LBA is not valid */ 1181: 119 120 movzbl %dl, %edx 121 push %ebp /* high 32 bits of first sector */ 122 push %ebx /* first sector of bios partition */ 123 push %edx /* bios disk */ 124 call _C_LABEL(boot2) /* C bootstrap code */ 125 addl $12, %esp 126 call prot_to_real 127 .code16 128 129boot_fail: 130 push %ax 131 movw $1f, %si 132 call message 133 pop %si 134 call message 135 jmp loopstop 1361: .asciz "Boot2 failed: " 137 138ENTRY(_rtt) 139 .code32 140 call prot_to_real 141 .code16 142loopstop: 143 movb $0x86, %ah /* delay for about a second */ 144 movw $16, %cx 145 int $0x15 146 int $0x18 /* might be a boot fail entry */ 1471: sti 148 hlt 149 jmp 1b 150