aboutsummaryrefslogtreecommitdiffstats
path: root/mbr/mbr.S
diff options
context:
space:
mode:
authorH. Peter Anvin <hpa@zytor.com>2007-02-04 17:24:10 -0800
committerH. Peter Anvin <hpa@zytor.com>2007-02-04 17:24:10 -0800
commita86b90de0542948b61f24d7a39652d54761d50b9 (patch)
tree8b922a74e654ef0bdf5ea73160f0a2fa6bca27ea /mbr/mbr.S
parent3524223967b08ffdcf7addfc606aaeacd872dac3 (diff)
downloadsyslinux-elf-a86b90de0542948b61f24d7a39652d54761d50b9.tar.gz
syslinux-elf-a86b90de0542948b61f24d7a39652d54761d50b9.tar.xz
syslinux-elf-a86b90de0542948b61f24d7a39652d54761d50b9.zip
Fix numerous problems in the new MBR code.syslinux-3.36-pre5
Diffstat (limited to 'mbr/mbr.S')
-rw-r--r--mbr/mbr.S35
1 files changed, 22 insertions, 13 deletions
diff --git a/mbr/mbr.S b/mbr/mbr.S
index 82dc5a6e..81e5dd00 100644
--- a/mbr/mbr.S
+++ b/mbr/mbr.S
@@ -28,14 +28,21 @@
.code16
.text
-bootsec = 0x7c00
-stack = bootsec
-driveno = (stack-4)
-heads = (stack-6)
-sectors = (stack-8)
+ .globl bootsec
+stack = 0x7c00
+driveno = (stack-6)
+heads = (stack-8)
+sectors = (stack-10)
BIOS_page = 0x462
-
+
+ /* gas/ld has issues with doing this as absolute addresses... */
+ .section ".bootsec", "a", @nobits
+ .globl bootsec
+bootsec:
+ .space 512
+
+ .text
.globl _start
_start:
cli
@@ -74,7 +81,7 @@ next:
jz 1f
/* We have EBIOS; patch in a jump to read_sector_ebios */
- movw $0xeb+((read_sector_ebios-read_sector_cbios+2)<< 8), (read_sector_cbios)
+ movw $0xeb+((read_sector_ebios-read_sector_cbios-2)<< 8), (read_sector_cbios)
1:
popw %dx
@@ -93,7 +100,6 @@ next:
pushl %eax /* Base */
pushl %eax /* Root */
call scan_partition_table
-
/* If we get here, we have no OS */
jmp missing_os
@@ -126,6 +132,7 @@ read_sector_ebios:
movl %eax, 8(%si)
movb $0x42, %ah
read_common:
+ movb (driveno), %dl
int $0x13
ret
@@ -232,11 +239,13 @@ boot:
movl 8(%si), %eax
addl 22(%bp), %eax
movl %eax, 8(%si)
+ pushw %si
call read_sector
+ popw %si
jc disk_error
- cmpw $0xaa55, (bootsec+0x510)
- je missing_os /* Not a valid boot sector */
- movw $stack-6, %sp
+ cmpw $0xaa55, (bootsec+510)
+ jne missing_os /* Not a valid boot sector */
+ movw $driveno, %sp
popw %dx /* dl -> drive number */
popw %di /* es:di -> $PnP vector */
popw %es
@@ -274,10 +283,10 @@ missing_os_msg:
.ascii "Missing operating system."
.byte 0
disk_error_msg:
- .ascii "Failed to load operating system."
+ .ascii "Operating system load error."
.byte 0
too_many_active_msg:
- .ascii "Multiple active partititons."
+ .ascii "Multiple active partitions."
.byte 0
.balign 4