| 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 |