Fix numerous problems in the new MBR code. syslinux-3.36-pre5
authorH. Peter Anvin <hpa@zytor.com>
Mon, 5 Feb 2007 01:24:10 +0000 (17:24 -0800)
committerH. Peter Anvin <hpa@zytor.com>
Mon, 5 Feb 2007 01:24:10 +0000 (17:24 -0800)
mbr/Makefile
mbr/mbr.S
mbr/mbr.ld [new file with mode: 0644]

index 1772d14..75da448 100644 (file)
@@ -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 $< $@
index 82dc5a6..81e5dd0 100644 (file)
--- a/mbr/mbr.S
+++ b/mbr/mbr.S
        .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)
-       j     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 (file)
index 0000000..d14ba80
--- /dev/null
@@ -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) }
+}