summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoremaste <emaste@FreeBSD.org>2017-01-11 00:50:19 +0000
committeremaste <emaste@FreeBSD.org>2017-01-11 00:50:19 +0000
commit000e24c9ac646bc0a20437e98e46cc65009a53c2 (patch)
treeec7fee68de319e25234275a022d877bc8aa922c9
parent20f57463a4cc70abf6f54d548327cafedfe463df (diff)
downloadFreeBSD-src-000e24c9ac646bc0a20437e98e46cc65009a53c2.zip
FreeBSD-src-000e24c9ac646bc0a20437e98e46cc65009a53c2.tar.gz
MFC r310702: btxldr: process all PT_LOAD segments, not just the first two
With default settings GNU ld generates two PT_LOADs for loader.sym while LLD generates three, because it creates a rodata segment. Previously btxldr terminated phdr processing after two PT_LOADs. Remove the early termination to process all PT_LOADs. Sponsored by: The FreeBSD Foundation
-rw-r--r--sys/boot/i386/btx/btxldr/btxldr.S8
1 files changed, 1 insertions, 7 deletions
diff --git a/sys/boot/i386/btx/btxldr/btxldr.S b/sys/boot/i386/btx/btxldr/btxldr.S
index 848b930..7f2b909 100644
--- a/sys/boot/i386/btx/btxldr/btxldr.S
+++ b/sys/boot/i386/btx/btxldr/btxldr.S
@@ -198,7 +198,6 @@ start.3:
call putstr # message
movl $m_segs,%esi # Format string
#endif
- movl $0x2,%edi # Segment count
movl 0x1c(%ebx),%edx # Get e_phoff
addl %ebx,%edx # To pointer
movzwl 0x2c(%ebx),%ecx # Get e_phnum
@@ -216,8 +215,7 @@ start.4: cmpl $0x1,(%edx) # Is p_type PT_LOAD?
call putstr # End message
#endif
pushl %esi # Save
- pushl %edi # working
- pushl %ecx # registers
+ pushl %ecx # working registers
movl 0x4(%edx),%esi # Get p_offset
addl %ebx,%esi # as pointer
movl 0x8(%edx),%edi # Get p_vaddr
@@ -232,13 +230,9 @@ start.4: cmpl $0x1,(%edx) # Is p_type PT_LOAD?
rep # zero
stosb # them
start.5: popl %ecx # Restore
- popl %edi # working
popl %esi # registers
- decl %edi # Segments to do
- je start.7 # If none
start.6: addl $0x20,%edx # To next entry
loop start.4 # Till done
-start.7:
#ifdef BTXLDR_VERBOSE
movl $m_done,%esi # Display done
call putstr # message
OpenPOWER on IntegriCloud