aboutsummaryrefslogtreecommitdiffstats
path: root/mbr
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
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')
-rw-r--r--mbr/Makefile4
-rw-r--r--mbr/mbr.S35
-rw-r--r--mbr/mbr.ld73
3 files changed, 97 insertions, 15 deletions
diff --git a/mbr/Makefile b/mbr/Makefile
index 1772d14e..75da4484 100644
--- a/mbr/Makefile
+++ b/mbr/Makefile
@@ -33,8 +33,8 @@ all: mbr.bin
%.o: %.S
$(CC) $(SFLAGS) -Wa,-a=$*.lst -c -o $@ $<
-mbr.elf: mbr.o
- $(LD) -Ttext 0x600 -e _start -o $@ $^
+mbr.elf: mbr.o mbr.ld
+ $(LD) -T mbr.ld -e _start -o $@ $<
mbr.bin: mbr.elf checksize.pl
$(OBJCOPY) -O binary $< $@
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
diff --git a/mbr/mbr.ld b/mbr/mbr.ld
new file mode 100644
index 00000000..d14ba802
--- /dev/null
+++ b/mbr/mbr.ld
@@ -0,0 +1,73 @@
+/*
+ * Linker script for MBR
+ */
+
+/* Script for -z combreloc: combine and sort reloc sections */
+OUTPUT_FORMAT("elf32-i386", "elf32-i386",
+ "elf32-i386")
+OUTPUT_ARCH(i386)
+EXTERN(_start)
+ENTRY(_start)
+SECTIONS
+{
+ /* Read-only sections, merged into text segment: */
+ . = 0x600;
+ .text :
+ {
+ *(.text*)
+ *(.rodata*)
+ } =0x90909090
+
+ . = ALIGN(4);
+ .data :
+ {
+ *(.data*)
+ }
+
+ . = ALIGN(128);
+ .bss :
+ {
+ *(.bss*)
+ }
+
+ . = 0x7c00;
+ .bootsec :
+ {
+ *(.bootsec)
+ }
+
+ /* Stabs debugging sections. */
+ .stab 0 : { *(.stab) }
+ .stabstr 0 : { *(.stabstr) }
+ .stab.excl 0 : { *(.stab.excl) }
+ .stab.exclstr 0 : { *(.stab.exclstr) }
+ .stab.index 0 : { *(.stab.index) }
+ .stab.indexstr 0 : { *(.stab.indexstr) }
+ .comment 0 : { *(.comment) }
+ /* DWARF debug sections.
+ Symbols in the DWARF debugging sections are relative to the beginning
+ of the section so we begin them at 0. */
+ /* DWARF 1 */
+ .debug 0 : { *(.debug) }
+ .line 0 : { *(.line) }
+ /* GNU DWARF 1 extensions */
+ .debug_srcinfo 0 : { *(.debug_srcinfo) }
+ .debug_sfnames 0 : { *(.debug_sfnames) }
+ /* DWARF 1.1 and DWARF 2 */
+ .debug_aranges 0 : { *(.debug_aranges) }
+ .debug_pubnames 0 : { *(.debug_pubnames) }
+ /* DWARF 2 */
+ .debug_info 0 : { *(.debug_info .gnu.linkonce.wi.*) }
+ .debug_abbrev 0 : { *(.debug_abbrev) }
+ .debug_line 0 : { *(.debug_line) }
+ .debug_frame 0 : { *(.debug_frame) }
+ .debug_str 0 : { *(.debug_str) }
+ .debug_loc 0 : { *(.debug_loc) }
+ .debug_macinfo 0 : { *(.debug_macinfo) }
+ /* SGI/MIPS DWARF 2 extensions */
+ .debug_weaknames 0 : { *(.debug_weaknames) }
+ .debug_funcnames 0 : { *(.debug_funcnames) }
+ .debug_typenames 0 : { *(.debug_typenames) }
+ .debug_varnames 0 : { *(.debug_varnames) }
+ /DISCARD/ : { *(.note.GNU-stack) }
+}