From 3ec40a0119587f63411475c76c69f9db24c7598e Mon Sep 17 00:00:00 2001 From: "H. Peter Anvin" Date: Wed, 28 May 2008 22:11:57 -0700 Subject: [PATCH] Fix localboot stack bug; cleanup section handling in the ELF universe Fix and clean up section handling in ELF; fix stack reset in localboot directive (for non-pxelinux, that is.) --- configinit.inc | 8 +++----- cpuinit.inc | 6 +++--- layout.inc | 11 ++++++----- localboot.inc | 5 +---- pxelinux.asm | 13 ------------- syslinux.ld | 46 ++++++++++++++++++++++++++++++---------------- 6 files changed, 43 insertions(+), 46 deletions(-) diff --git a/configinit.inc b/configinit.inc index a5eaf1b38..cf6a814cf 100644 --- a/configinit.inc +++ b/configinit.inc @@ -23,11 +23,9 @@ reset_config: ; Initialize the .config section xor eax,eax - mov si,section..config.start - mov di,section..config.vstart - mov cx,section..config.end.start - sub cx,di - shr cx,2 + mov si,__config_lma + mov di,__config_start + mov cx,__config_dwords rep movsd %ifndef DEPEND diff --git a/cpuinit.inc b/cpuinit.inc index 0d9f4047c..fd62cc772 100644 --- a/cpuinit.inc +++ b/cpuinit.inc @@ -42,9 +42,9 @@ skip_checks: ; ; Initialize the bcopy32 code in low memory ; - mov si,section..bcopy32.start - mov di,__bcopy_start - mov cx,__bcopy_size >> 2 + mov si,__bcopy32_lma + mov di,__bcopy32_start + mov cx,__bcopy32_dwords rep movsd ; diff --git a/layout.inc b/layout.inc index f58ec8fac..51460e143 100644 --- a/layout.inc +++ b/layout.inc @@ -80,11 +80,12 @@ RBFG_brainfuck: resb 2048 ; Bigger than an Ethernet packet... section .bss1 write nobits align=16 ; Symbols from linker script - extern Stack - extern section..bcopy32.start - extern section..config.start - extern section..config.vstart - extern section..config.end.start +%macro SECINFO 1 + extern __%1_start, __%1_lma, __%1_end + extern __%1_len, __%1_dwords +%endmacro + SECINFO bcopy32 + SECINFO config global _start diff --git a/localboot.inc b/localboot.inc index 288d390a3..b6b31deb7 100644 --- a/localboot.inc +++ b/localboot.inc @@ -26,10 +26,7 @@ local_boot: call vgaclearmode - lss sp,[cs:Stack] ; Restore stack pointer - xor dx,dx - mov ds,dx - mov es,dx + RESET_STACK_AND_SEGS dx ; dx <- 0 mov fs,dx mov gs,dx mov si,localboot_msg diff --git a/pxelinux.asm b/pxelinux.asm index c4feee2e0..ce3250bcc 100644 --- a/pxelinux.asm +++ b/pxelinux.asm @@ -271,19 +271,6 @@ _start: mov ds,ax mov es,ax -%ifndef DEPEND -%if TEXT_START != 0x7c00 - ; This is uglier than it should be, but works around - ; some NASM 0.98.38 bugs. - mov di,section..bcopy32.start - add di,__bcopy_size-4 - lea si,[di-(TEXT_START-7C00h)] - lea cx,[di-(TEXT_START-4)] - shr cx,2 - std ; Overlapping areas, copy backwards - rep movsd -%endif -%endif jmp 0:_start1 ; Canonicalize address _start1: mov bp,sp diff --git a/syslinux.ld b/syslinux.ld index d6fa685df..3c55820fd 100644 --- a/syslinux.ld +++ b/syslinux.ld @@ -17,28 +17,36 @@ SECTIONS .earlybss : { __earlybss_start = .; *(.earlybss) - __earlybss_len = . - __earlybss_start; + __earlybss_end = .; } + __earlybss_len = __earlybss_end - __earlybss_start; + __earlybss_dwords = (__earlybss_len + 3) >> 2; .bcopy32 : AT (__bcopy32_lma) { FILL(0x90909090) __bcopy32_start = .; *(.bcopy32) - __bcopy32_len = . - __bcopy32_start; + __bcopy32_end = .; } + __bcopy32_len = __bcopy32_end - __bcopy32_start; + __bcopy32_dwords = (__bcopy32_len + 3) >> 2; .config : AT (__config_lma) { __config_start = .; *(.config) - __config_len = . - __config_start; + __config_end = .; } + __config_len = __config_end - __config_start; + __config_dwords = (__config_len + 3) >> 2; .bss : AT(__bss_start) { __bss_start = .; *(.bss) *(.bss2) - __bss_len = . - __bss_start; + __bss_end = .; } + __bss_len = __bss_end - __bss_start; + __bss_dwords = (__bss_len + 3) >> 2; /* Stack */ @@ -46,8 +54,10 @@ SECTIONS .stack : { __stack_start = .; . += STACK_LEN; - __stack_len = . - __stack_start; + __stack_end = .; } + __stack_len = __stack_end - __stack_start; + __stack_dwords = (__stack_len + 3) >> 2; /* Initialized sections */ @@ -56,8 +66,10 @@ SECTIONS FILL(0x90909090) __text_start = .; *(.text) - __text_len = . - __text_start; + __text_end = .; } + __text_len = __text_end - __text_start; + __text_dwords = (__text_len + 3) >> 2; . = ALIGN(4); __bcopy32_lma = .; @@ -67,8 +79,10 @@ SECTIONS .data : { __data_start = .; *(.data) - __data_len = . - __data_start; + __data_end = .; } + __data_len = __data_end - __data_start; + __data_dwords = (__data_len + 3) >> 2; . = ALIGN(4); __config_lma = .; @@ -80,26 +94,26 @@ SECTIONS .adv : { __adv_start = .; *(.adv) - __adv_len = . - __adv_start; + __adv_end = .; } + __adv_len = __adv_end - __adv_start; + __adv_dwords = (__adv_len + 3) >> 2; /* Late uninitialized sections */ .uibss : { __uibss_start = .; *(.uibss) - __uibss_len = . - __uibss_start; + __uibss_end = .; } + __uibss_len = __uibss_end - __uibss_start; + __uibss_dwords = (__uibss_len + 3) >> 2; .bss1 : { __bss1_start = .; *(.bss1) - __bss1_len = . - __bss1_start; + __bss1_end = .; } - - Stack = __stack_start; - section..bcopy32.start = __bcopy32_lma; - section..config.start = __config_lma; - section..config.vstart = __config_start; - section..config.end.start = __config_start + SIZEOF(.config); + __bss1_len = __bss1_end - __bss1_start; + __bss1_dwords = (__bss1_len + 3) >> 2; }