minix/sys/arch/i386/stand/boot/biosboot.S
2012-02-09 18:48:13 +01:00

150 lines
3.8 KiB
ArmAsm

/* $NetBSD: biosboot.S,v 1.8 2011/01/05 23:13:01 jakllsch Exp $ */
/*-
* Copyright (c) 2003 The NetBSD Foundation, Inc.
* All rights reserved.
*
* This code is derived from software contributed to The NetBSD Foundation
* by David Laight.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
#include <machine/asm.h>
#include <sys/bootblock.h>
/*
* Code linked to 0x1000:0 and (usually) read from /boot by bootxx code
*
* On entry:
* %dl BIOS drive number
* %ecx:%ebx Sector number of NetBSD partition
* %ds:%si Boot parameter block (patched by installboot)
* %cs 0x1000
* %ds, %es, %ss All zero
* %sp near 0xfffc
*/
.text
.code16
ENTRY(boot_start)
jmp boot_start_1
.balign 4
ENTRY(boot_magic)
.long X86_BOOT_MAGIC_2 /* checked for by bootxx code */
ENTRY(boot_params)
.long boot_start_1 - boot_params
#include <boot_params.S>
. = boot_start + 0x80 /* space for patchable variables */
boot_start_1:
#if 0
/* Allow for boot_start not being %cs:0 */
call 2f
2: pop %cx
sub $2b, %cx /* %ax is offset */
test $0xf, %cx /* check code seg aligned */
jz 3f
lret /* not playing if not */
3: mov %cs, %ax
shr $4, %cx
add %cx, %ax /* segment staring at boot_start */
push %ax
push $4f
lret
4:
#endif
mov %cs, %ax
mov %ax, %es
movl %ecx, %ebp /* move LBA out of the way */
/* Grab boot_params patched into bootxx by installboot */
cmpl $X86_BOOT_MAGIC_1,-4(%si) /* sanity check ptr */
jne 2f
mov $boot_params, %di
movl (%si),%ecx
cmp $boot_start_1 - boot_params, %cx
jbe 1f
mov $boot_start_1 - boot_params, %cx
1: cld
rep
movsb
2:
mov %ax, %ds
movl $_end, %eax /* top of bss */
shr $4, %eax /* as a segment */
add $0x1001, %ax /* and + 64k */
mov %ax, %ss /* for stack */
mov $0xfffc, %sp /* %sp at top of it */
call gdt_fixup
calll real_to_prot
.code32
movl $_end, %ecx /* zero bss */
movl $__bss_start, %edi
subl %edi, %ecx
shr $2, %ecx /* _end and __bss_start are aligned */
xor %eax, %eax
rep
stosl
testb $X86_BP_FLAGS_LBA64VALID, boot_params+4
jnz 1f
xorl %ebp, %ebp /* high part of LBA is not valid */
1:
movzbl %dl, %edx
push %ebp /* high 32 bits of first sector */
push %ebx /* first sector of bios partition */
push %edx /* bios disk */
call _C_LABEL(boot2) /* C bootstrap code */
addl $12, %esp
call prot_to_real
.code16
boot_fail:
push %ax
movw $1f, %si
call message
pop %si
call message
jmp loopstop
1: .asciz "Boot2 failed: "
ENTRY(_rtt)
.code32
call prot_to_real
.code16
loopstop:
movb $0x86, %ah /* delay for about a second */
movw $16, %cx
int $0x15
int $0x18 /* might be a boot fail entry */
1: sti
hlt
jmp 1b