aboutsummaryrefslogtreecommitdiffstats
path: root/roms/ipxe/src/arch/x86/prefix/hdprefix.S
diff options
context:
space:
mode:
Diffstat (limited to 'roms/ipxe/src/arch/x86/prefix/hdprefix.S')
-rw-r--r--roms/ipxe/src/arch/x86/prefix/hdprefix.S115
1 files changed, 115 insertions, 0 deletions
diff --git a/roms/ipxe/src/arch/x86/prefix/hdprefix.S b/roms/ipxe/src/arch/x86/prefix/hdprefix.S
new file mode 100644
index 000000000..28c8a532d
--- /dev/null
+++ b/roms/ipxe/src/arch/x86/prefix/hdprefix.S
@@ -0,0 +1,115 @@
+FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL )
+
+#include <librm.h>
+
+ .text
+ .arch i386
+ .section ".prefix", "awx", @progbits
+ .code16
+ .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