mirror of https://github.com/ipxe/ipxe.git
108 lines
1.5 KiB
ArmAsm
108 lines
1.5 KiB
ArmAsm
.text
|
|
.arch i386
|
|
.section ".prefix", "awx", @progbits
|
|
.code16
|
|
.org 0
|
|
|
|
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 _filesz_sect
|
|
|
|
.section ".zinfo.fixup", "a", @progbits /* Compressor fixups */
|
|
.ascii "SUBL"
|
|
.long load_length
|
|
.long 512
|
|
.long 0
|
|
.previous
|
|
|
|
|
|
load_failed:
|
|
movw $10f, %si
|
|
jmp boot_error
|
|
10: .asciz "Could not load gPXE\r\n"
|
|
|
|
.org 510
|
|
.byte 0x55, 0xaa
|
|
|
|
start_image:
|
|
/* Install gPXE */
|
|
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 gPXE */
|
|
call uninstall
|
|
|
|
/* Boot next device */
|
|
int $0x18
|