From: H. Peter Anvin Date: Mon, 5 Feb 2007 01:24:10 +0000 (-0800) Subject: Fix numerous problems in the new MBR code. X-Git-Tag: syslinux-3.36-pre5^0 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=a86b90de0542948b61f24d7a39652d54761d50b9;p=profile%2Fivi%2Fsyslinux.git Fix numerous problems in the new MBR code. --- diff --git a/mbr/Makefile b/mbr/Makefile index 1772d14..75da448 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 82dc5a6..81e5dd0 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 0000000..d14ba80 --- /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) } +}