summaryrefslogtreecommitdiffstats
path: root/src/arch/i386
diff options
context:
space:
mode:
authorMichael Brown2007-07-05 13:58:16 +0200
committerMichael Brown2007-07-05 13:58:16 +0200
commit66208dd65d41e0babe27d270917fe71674102884 (patch)
treeb47d5f2134cf8a05ff441cb284f004e846f29cd3 /src/arch/i386
parentMiscellaneous efficiency improvements, and extend read_sectors to (diff)
downloadipxe-66208dd65d41e0babe27d270917fe71674102884.tar.gz
ipxe-66208dd65d41e0babe27d270917fe71674102884.tar.xz
ipxe-66208dd65d41e0babe27d270917fe71674102884.zip
hdprefix that works for LBA only
Diffstat (limited to 'src/arch/i386')
-rw-r--r--src/arch/i386/prefix/bootpart.S33
-rw-r--r--src/arch/i386/prefix/hdprefix.S360
2 files changed, 82 insertions, 311 deletions
diff --git a/src/arch/i386/prefix/bootpart.S b/src/arch/i386/prefix/bootpart.S
index 22ad3e3a..d60fe9bc 100644
--- a/src/arch/i386/prefix/bootpart.S
+++ b/src/arch/i386/prefix/bootpart.S
@@ -44,7 +44,7 @@ find_active_partition:
jc 1f
cmpw $0xaa55, %bx
jne 1f
- movw $read_lba, read_sector
+ movw $read_lba, read_sectors
1:
/* Read and process root partition table */
xorb %dh, %dh
@@ -55,17 +55,26 @@ find_active_partition:
/* Print failure message */
movw $10f, %si
- movw $(20f-10f), %cx
-1: movw $0x0007, %bx
+ jmp boot_error
+10: .asciz "Could not locate active partition\r\n"
+
+/*
+ * Print failure message and boot next device
+ *
+ * Parameters:
+ * %si : Failure string
+ */
+boot_error:
+ cld
+ movw $0x0007, %bx
movb $0x0e, %ah
- lodsb
+1: lodsb
+ testb %al, %al
+ je 99f
int $0x10
- loop 1b
-
- /* Boot next device */
+ jmp 1b
+99: /* Boot next device */
int $0x18
-10: .ascii "Could not locate active partition\r\n"
-20:
/*
* Process partition table
@@ -149,7 +158,7 @@ process_partition:
read_boot_sector:
pushw %ax
movw $1, %ax
- call *read_sector
+ call *read_sectors
jc 99f
cmpw $0xaa55, %es:(510)
je 99f
@@ -158,7 +167,7 @@ read_boot_sector:
ret
/*
- * Read single sector to %es:0000 and verify 0x55aa signature
+ * Read sectors to %es:0000
*
* Parameters:
* %dl : BIOS drive number
@@ -171,7 +180,7 @@ read_boot_sector:
* Returns:
* CF set on error
*/
-read_sector: .word read_chs
+read_sectors: .word read_chs
read_chs:
/* Read sectors using C/H/S address */
diff --git a/src/arch/i386/prefix/hdprefix.S b/src/arch/i386/prefix/hdprefix.S
index 2a6dc8e9..68392d2c 100644
--- a/src/arch/i386/prefix/hdprefix.S
+++ b/src/arch/i386/prefix/hdprefix.S
@@ -1,301 +1,63 @@
-#warning "Needs fixing up for gpxe"
-
-#if 0
-
-/****************************************************************\
-
-hdprefix.S Copyright (C) 2005 Per Dalgas Jakobsen
-
-This code has been inspired/derived by the OSLoader by Vladislav Aleksandrov.
-http://www.programmersheaven.com/zone5/cat469/40546.htm.
-
-This software may be used and distributed according to the terms
-of the GNU Public License (GPL), incorporated herein by reference.
-
-hdprefix.S is loaded at 0x0000:0x7c00 by the bios-startup routines.
-
-Actions performed by hdprefix:
-1) Load the MBR to LOADSEG:0
-2) Check which partition is active (or try first partition if none active)
-3) Check wether LBA is supported.
-3a) LBA
-3a1) Load PAYLOAD_SECTS sectors from chosen partition to LOADSEG:0
-3b) CHS (standard)
-3b1) Load PAYLOAD_SECTS sectors from chosen partition to LOADSEG:0
-4) Check loaded bootsector for BOOTMAGIC code.
-5) Jump to payload LOADSEG:ENTRYPOINT.
-
-Output with failure points (!#):
----
-Loading (!1)partition #
-Std. BIOS(!2) | Ext. BIOS(!3)
-Booting...(!4)
-(!5)
----
-
-!1: Failed to load MBR with Int13,ah=2.
-!2: Failed to load bootrecord+payload with Int13,ah=2.
-!3: Failed to load bootrecord+payload with Int13,ah=42.
-!4: Invalid BOOTMAGIC in loaded bootrecord.
-!5: Jumping to payload.
-
-\*****************************************************************/
-
-.equ BOOTSEG, 0x07c0
-.equ LOADSEG, 0x1000
-.equ ENTRYPOINT, _start
-
-.equ BOOTMAGIC, 0x0aa55
-
-.equ partition_table, 0x1be
-.equ partition_rec_size, 0x10
-
-.equ boot_ind, 0 /* 80h=active */
-.equ start_head, 1
-.equ start_sector, 2 /* bits 0-5 */
-.equ start_cyl, 3 /* bits 8,9 in bits 6,7 of sector */
-.equ os_ind, 4 /* os indicator */
-.equ end_head, 5
-.equ end_sector, 6 /* bits 0-5 */
-.equ end_track, 7 /* bits 8,9 in bits 6,7 of sector */
-.equ nsect, 8 /* sectors preceding partition */
-.equ lenght, 0x0c /* length of partition in sectors */
-
-/-------------------------------------------------------------
-
- .arch i386
.text
- .section ".prefix", "ax", @progbits
+ .arch i386
+ .section ".prefix", "awx", @progbits
.code16
-
-bootstart:
- jmp $BOOTSEG,$_go /* reload cs:ip */
-
-
-/****************************************************************/
-/* support routines. */
-/*--------------------------------------------------------------*/
-_failed:
- movw $BOOTSEG,%ax
- movw %ax,%ds
- movw $_failed_msg_end-_failed_msg,%cx
- movw $_failed_msg,%si
- call _print_str
-
- /* stop execution - should probably have option to auto-reboot after delay. */
-_failed_loop:
- jmp _failed_loop
-
-/*--------------------------------------------------------------*/
-_print_str:
- /* cx = count, ds:si = string. */
- movw $0x0007,%bx
- movb $0x0e,%ah
-_print_loop:
- lodsb
- int $0x10
- loop _print_loop
- ret
-
-/*--------------------------------------------------------------*/
-_print_char:
- /* al = char. */
- movw $0x0007,%bx
- movb $0x0e,%ah
- int $0x10
- ret
-
-/*--------------------------------------------------------------*/
-_print_nl:
- /* - */
- movb $0x0d,%al
- call _print_char
- movb $0x0a,%al
- call _print_char
- ret
-
-/*--------------------------------------------------------------*/
-_print_hex:
- /* dx = value */
- movb $0x0e,%ah /* write char, tty mode */
- movw $0x0007,%bx /* page 0, attribute 7 (normal) */
- call _print_digit
- call _print_digit
- call _print_digit
- /* fall through */
-_print_digit:
- rolw $4,%dx /* rotate so that lowest 4 bits are used */
- movb $0x0f,%al /* mask for nibble */
- andb %dl,%al
- addb $0x90,%al /* convert al to ascii hex (four instructions) */
- daa
- adcb $0x40,%al
- daa
- int $0x10
- ret
-
-/****************************************************************/
-
-
-_go:
- cli
- movw $BOOTSEG,%ax
- movw %ax,%ds
- movw %ax,%ss
- movw $0x2000,%sp /* good large stack. */
- sti
- cld
- movw $LOADSEG,%ax
- movw %ax,%es
-
- movw $_load_msg_end-_load_msg,%cx
- movw $_load_msg,%si
- call _print_str
-
-/*--- load MBR so we can use its partition table. ---*/
- xorw %bx,%bx
- movw $0x0001,%cx /* chs: 0,0,1 */
- movb %bh,%dh /* - */
- movb $0x80,%dl
- movw $0x0201,%ax /* read one sector (MBR) */
- int $0x13
- jc _failed
-
-/*--- find the active partition ---*/
- movw $_part_msg_end-_part_msg,%cx
- movw $_part_msg,%si
- call _print_str
-
- movw $partition_table,%di
- movw $4,%cx
-_partition_loop:
- cmpb $0x80,%es:(%di) /* active? */
- je _partition_found
- addw $partition_rec_size,%di
- loop _partition_loop
-
- /*- no partitions marked active - use 1. partition. */
- movw $partition_table,%di
- movw $4,%cx
-
-_partition_found:
- movb $'5',%al /* convert to ascii */
- subb %cl,%al
- call _print_char
- call _print_nl
-
-/*--- check for lba support ---*/
- movw $0x55aa,%bx
- movb $0x80,%dl
- movb $0x41,%ah
- int $0x13
- jc __bios
- cmpw $0x0aa55,%bx
- jnz __bios
- testb $1,%cl
- jz __bios
-
-/*--- use lba bios calls to read sectors ---*/
-_lba:
- movw $_extbios_msg_end-_extbios_msg,%cx
- movw $_extbios_msg,%si
- call _print_str
-
- movw %es:nsect(%di),%ax
- movw %ax,_bios_lba_low
- movw %es:nsect+2(%di),%ax
- movw %ax,_bios_lba_high
- movb $0x80,%dl
- movw $_disk_address_packet,%si
- movw $0x4200,%ax /* read */
- int $0x13
- jc _failed
- jmp __loaded
-
-/*--- use standard bios calls to read sectors ---*/
-__bios:
- movw $_stdbios_msg_end-_stdbios_msg,%cx
- movw $_stdbios_msg,%si
- call _print_str
-
- movw _disk_address_packet+2(,1),%ax /* only low byte is used. */
- xorw %bx,%bx
- movw %es:start_sector(%di),%cx
- movb %es:start_head(%di),%dh
- movb $0x80,%dl
- movb $0x02,%ah
- int $0x13
- jc _failed
-
-__loaded:
- movw $_boot_msg_end-_boot_msg,%cx
- movw $_boot_msg,%si
- call _print_str
-
- /* check if it has a valid bootrecord. */
- cmpw $BOOTMAGIC,%es:510(,1)
- jne _failed
- call _print_nl
-
- /* call the payload. */
- pushl $0 /* No parameters to preserve for exit path */
- pushw $0 /* Use prefix exit path mechanism */
- jmp $LOADSEG,$ENTRYPOINT
-
- .section ".text16", "ax", @progbits
- .globl prefix_exit
-prefix_exit:
- int $0x19 /* should try to boot machine */
- .globl prefix_exit_end
-prefix_exit_end:
- .previous
-
-
-/*--------------------------------------------------------------*/
-
-_load_msg: .ascii "Loading "
-_load_msg_end:
-_part_msg: .ascii "partition "
-_part_msg_end:
-_boot_msg: .ascii "Booting..."
-_boot_msg_end:
-_stdbios_msg: .ascii "Std. BIOS\r\n"
-_stdbios_msg_end:
-_extbios_msg: .ascii "Ext. BIOS\r\n"
-_extbios_msg_end:
-_failed_msg: .ascii "FAILED!!!\r\n"
-_failed_msg_end:
-
-
-/*--------------------------------------------------------------*/
-
-_disk_address_packet:
- .byte 0x10 /* size of the packet */
- .byte 0 /* reserved */
- .word _verbatim_size_sct /* number of sectors to read */
- .word 0x0000 /* offset */
- .word LOADSEG /* segment of buffer */
-_bios_lba_low: .word 0
-_bios_lba_high: .word 0
- .word 0
- .word 0
-
- .rept 32
- .byte 0
- .endr
-
-
-/*--- Partition table ------------------------------------------*/
-
- .org 446, 0
- .rept 64
- .byte 0
- .endr
-
-
-/*--- Magic code -----------------------------------------------*/
- .org 510, 0
- .word BOOTMAGIC
-
-/*** END ********************************************************/
-#endif
+ .org 0
+
+ movw $load_image, %bp
+ jmp find_active_partition
+
+#include "bootpart.S"
+
+load_image:
+ movw $_rom_size, %bp
+1: /* Truncate read length to end of track */
+ movzwl %bp, %eax
+ movw $1, %ax
+ /* Read sectors */
+ 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 */
+ // hmmmm
+ /* Loop until whole image is read */
+ subw %ax, %bp
+ jne 1b
+ ljmp $BOOT_SEG, $start_image
+
+load_failed:
+ movw $10f, %si
+ jmp boot_error
+10: .asciz "Could not load gPXE\r\n"
+
+ .org 510
+ .byte 0x55, 0xaa
+
+start_image:
+ 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 %eax /* discard */
+
+ /* Boot next device */
+ int $0x18