/*
 * Copyright (C) 2009 Juergen Beisert, Pengutronix
 *
 * This code was inspired by the GRUB2 project.
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License as
 * published by the Free Software Foundation; either version 2 of
 * the License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 * MA 02111-1307 USA
 *
 */

/**
 * @file
 * @brief Loading the barebox image from a disk drive in LBA mode
 */

/**
 * @fn void real_start(void)
 * @brief A very simple and small loader to fetch all required sectors
 * from the boot media.
 */


	.file "boot_hdisk.S"
	.code16

	/*
	 * These symbols are generated by the linker, because they need a
	 * special layout. This layout is needed to be able to setup this
	 * bootloader by patching the binary when it gets stored into the
	 * master boot record.
	 */
	.extern indirect_sector_lba
	.extern boot_stack
	.extern start_pre_uboot
	.extern boot_disk
	.section .boot_code, "ax"

	.globl real_start
	.type real_start, @function

real_start:

	xorw %ax, %ax	/* set up %ds and %ss as offset from 0 */
	movw %ax, %ds
	movw %ax, %ss

	/* set up the REAL stack */
	movw $boot_stack, %sp

	sti		/* we're safe again */

	/* save drive reference first thing! */
	movb %dl, boot_disk
	pushw %dx

	movw $notification_string, %si
	call output_message

	/*
	 * This boot code only supports LBA. We fail here, if the BIOS
	 * does not support LBA for the harddisk
	 */

	/* check if LBA is supported */
	movb $0x41, %ah
	movw $0x55aa, %bx
	int $0x13

	/*
	 *  %dl may have been clobbered by INT 13, AH=41H.
	 *  This happens, for example, with AST BIOS 1.04.
	 */
	popw %dx
	pushw %dx

	/* stop if no LBA support */
	jc no_lba
	cmpw $0xaa55, %bx
	jne no_lba
	andw $1, %cx
	jz no_lba

lba_mode:
	/*
	 * Load the indirect sector. Its content is ready for use,
	 * provided by the installer
	 */
	movw $indirect_sector_lba, %si
	movb $0x42, %ah
	int $0x13
	jc no_lba	/* error? Then die */

	/*
	 * Now loop through all valid entries in the indirect sector
	 */
	movw $indirect_area, %si

load_loop:
	/*
	 * Stop if this "Disk Address Packet Structure" is invalid
	 * We call it invalid, if the size member is zero. If it is invalid
	 * we are optimistic and calling the loaded image
	 */
	movw (%si), %ax
	cmpw $0x0000, %ax
	je start_main

	/*
	 * Load this entry
	 */
	movb $0x42, %ah
	int $0x13
	jc no_lba

	addw (%si), %si	/* next entry */
	cmpw $indirect_area + 512, %si
	jne load_loop
	/*
	 * fall through to start u-boot.
	 */
start_main:
	movw $jmp_string, %si
	call output_message
	jmp start_pre_uboot
/*
 * die if there is no LBA support
 */
no_lba:	movw $chs_string, %si
	call output_message
	hlt

/*
 * message: write the string pointed to by %si
 *
 *   WARNING: trashes %si, %ax, and %bx
 */

/*
 * Use BIOS "int 10H Function 0Eh" to write character in teletype mode
 *	%ah = 0xe	%al = character
 *	%bh = page	%bl = foreground color (graphics modes)
 */

1:
	movw	$0x0001, %bx
	movb	$0xe, %ah
	int	$0x10		/* display this char */

output_message:
	lodsb
	cmpb	$0, %al
	jne	1b	/* if not end of string, next char */
	ret

/* ---------------------------------------------------------------------- */

	.section .boot_data

notification_string:	.asciz "UBOOT2 "
chs_string:	.asciz "CHS "
jmp_string:	.asciz "JMP "

