Add qemu 2.4.0
[kvmfornfv.git] / qemu / roms / ipxe / src / arch / i386 / prefix / hdprefix.S
diff --git a/qemu/roms/ipxe/src/arch/i386/prefix/hdprefix.S b/qemu/roms/ipxe/src/arch/i386/prefix/hdprefix.S
new file mode 100644 (file)
index 0000000..876bfe1
--- /dev/null
@@ -0,0 +1,111 @@
+FILE_LICENCE ( GPL2_OR_LATER )
+
+       .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 */
+       movb    %cl, %al
+       negb    %al
+       addb    max_sector, %al
+       incb    %al
+       andb    $0x3f, %al
+       movzbl  %al, %eax
+       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     2f
+       xorb    %dh, %dh
+       incb    %ch
+       jnc     2f
+       addb    $0xc0, %cl
+2:
+       /* 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:
+       pushl   $main
+       pushw   %cs
+       call    prot_call
+       popl    %ecx /* discard */
+
+       /* Uninstall iPXE */
+       call    uninstall
+
+       /* Boot next device */
+       int $0x18