FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL )

#include <librm.h>

	.section ".note.GNU-stack", "", @progbits
	.code16
	.arch i386
	.section ".prefix", "awx", @progbits
	.org 0
	.globl	_hd_start
_hd_start:

	movw	$load_image, %bp
	jmp	find_active_partition

#include "bootpart.S"

load_image:
	/* Get disk geometry */
	pushal
	pushw	%es
	movb	$0x08, %ah
	int	$0x13
	jc	load_failed
	movb	%cl, max_sector
	movb	%dh, max_head
	popw	%es
	popal
	
1:	/* Read to end of current track (or end of image) */
	movb	%cl, %al
	negb	%al
	addb	max_sector, %al
	incb	%al
	andb	$0x3f, %al
	movzbl	%al, %eax
	movl	load_length, %ebx
	cmpl	%eax, %ebx
	ja	2f
	movl	%ebx, %eax
2:	call	*read_sectors
	jc	load_failed
	
	/* Update %es */
	movw	%es, %bx
	shll	$5, %eax
	addw	%ax, %bx
	movw	%bx, %es
	shrl	$5, %eax
	
	/* Update LBA address */
	addl	%eax, %edi
	adcl	$0, %esi
	
	/* Update CHS address */
	andb	$0xc0, %cl
	orb	$0x01, %cl
	incb	%dh
	cmpb	max_head, %dh
	jbe	3f
	xorb	%dh, %dh
	incb	%ch
	jnc	3f
	addb	$0xc0, %cl
3:
	/* Loop until whole image is read */
	subl	%eax, load_length
	ja	1b
	ljmp	$BOOT_SEG, $start_image

max_sector:
	.byte	0
max_head:
	.byte	0
load_length:
	.long	0
	
	.section ".zinfo.fixup", "a", @progbits	/* Compressor fixups */
	.ascii	"ADDL"
	.long	load_length
	.long	512
	.long	0
	.previous


load_failed:
	movw	$10f, %si
	jmp	boot_error
10:	.asciz	"Could not load iPXE\r\n"

	.org 510
	.byte 0x55, 0xaa

start_image:
	/* Install iPXE */
	call	install

	/* Set up real-mode stack */
	movw	%bx, %ss
	movw	$_estack16, %sp

	/* Jump to .text16 segment */
	pushw	%ax
	pushw	$1f
	lret
	.section ".text16", "awx", @progbits
1:
	/* Run iPXE */
	virtcall main

	/* Uninstall iPXE */
	call	uninstall

	/* Boot next device */
	int $0x18
