[syslinux:pathbased] core: separate bcopyxx code and data; use linker-generated symbols

syslinux-bot for H. Peter Anvin hpa at zytor.com
Mon Feb 15 17:51:05 PST 2010


Commit-ID:  ead47b56aac1d327fa4788b12e53d04c3eafb198
Gitweb:     http://syslinux.zytor.com/commit/ead47b56aac1d327fa4788b12e53d04c3eafb198
Author:     H. Peter Anvin <hpa at zytor.com>
AuthorDate: Mon, 15 Feb 2010 17:47:09 -0800
Committer:  H. Peter Anvin <hpa at zytor.com>
CommitDate: Mon, 15 Feb 2010 17:47:09 -0800

core: separate bcopyxx code and data; use linker-generated symbols

Separate out bcopyxx code and data, and use linker-generated barrier
symbols instead of inline label hacks.  This makes it possible to link
code into the bcopyxx area if need be.

Signed-off-by: H. Peter Anvin <hpa at zytor.com>


---
 core/bcopyxx.inc |   36 +++++++++++++++---------------------
 core/comboot.inc |    3 ++-
 core/layout.inc  |    6 ++++--
 core/syslinux.ld |   22 ++++++++++++++++++----
 4 files changed, 39 insertions(+), 28 deletions(-)

diff --git a/core/bcopyxx.inc b/core/bcopyxx.inc
index abaafa7..c669b7a 100644
--- a/core/bcopyxx.inc
+++ b/core/bcopyxx.inc
@@ -29,9 +29,8 @@
 ;
 
 		bits 32
-		section .bcopyxx
+		section .bcopyxx.text
 		align 16
-bcopyxx_start	equ $
 ;
 ; pm_bcopy:
 ;
@@ -212,17 +211,18 @@ pm_shuffle:
 		lea edx,[edi+ecx+15]	; EDX <- where to relocate our code to
 		and edx,~15		; Align 16 to benefit the GDT
 		call pm_bcopy
-		mov edi,edx
-		mov esi,bcopyxx_start
-		mov ecx,bcopyxx_dwords
-		lea eax,[edx+.safe-bcopyxx_start]	; Resume point
+		mov esi,__bcopyxx_start	; Absolute source address
+		mov edi,edx		; Absolute target address
+		sub edx,esi		; EDX <- address delta
+		mov ecx,__bcopyxx_dwords
+		lea eax,[edx+.safe]	; Resume point
 		; Relocate this code
 		rep movsd
 		jmp eax			; Jump to safe location
 .safe:
 		; Give ourselves a safe stack
-		lea esp,[edx+bcopyxx_stack+bcopyxx_end-bcopyxx_start]
-		add edx,bcopy_gdt-bcopyxx_start
+		lea esp,[edx+bcopyxx_stack+__bcopyxx_end]
+		add edx,bcopy_gdt	; EDX <- new GDT
 		mov [edx+2],edx		; GDT self-pointer
 		lgdt [edx]		; Switch to local GDT
 
@@ -266,9 +266,7 @@ pm_shuffle_16:
 		mov ss,edx
 		jmp PM_CS16:0
 
-		align 4
-RM_IDT_ptr:	dw 0FFFFh		; Length (nonsense, but matches CPU)
-		dd 0			; Offset
+		section	.bcopyxx.data
 
 		alignz 16
 ; GDT descriptor entry
@@ -303,16 +301,6 @@ bcopy_gdt:
 		dd 00cf9300h		; present, dpl 0, cover all 4G
 
 bcopy_gdt_size:	equ $-bcopy_gdt
-
-		alignz 4
-bcopyxx_end	equ $			; *Must* be dword-aligned!
-bcopyxx_len	equ $-bcopyxx_start
-bcopyxx_dwords	equ bcopyxx_len >> 2
-
-bcopyxx_stack	equ 128			; We want this much stack
-		; The +15 is for alignment
-bcopyxx_safe	equ bcopyxx_len + bcopyxx_stack + 15
-
 ;
 ; Space for a dummy task state segment.  It should never be actually
 ; accessed, but just in case it is, point to a chunk of memory that
@@ -320,5 +308,11 @@ bcopyxx_safe	equ bcopyxx_len + bcopyxx_stack + 15
 ;
 DummyTSS	equ 0x580
 
+		align 4
+RM_IDT_ptr:	dw 0FFFFh		; Length (nonsense, but matches CPU)
+		dd 0			; Offset
+
+bcopyxx_stack	equ 128			; We want this much stack
+
 		bits 16
 		section .text16
diff --git a/core/comboot.inc b/core/comboot.inc
index 6a4c9b9..74ec55d 100644
--- a/core/comboot.inc
+++ b/core/comboot.inc
@@ -944,7 +944,8 @@ comapi_closedir:
 ; INT 22h AX=0023h	Query shuffler size
 ;
 comapi_shufsize:
-		mov P_CX,bcopyxx_safe
+		; +15 is padding to guarantee alignment
+		mov P_CX,__bcopyxx_len + 15
 		ret
 
 ;
diff --git a/core/layout.inc b/core/layout.inc
index 7823b62..5099802 100644
--- a/core/layout.inc
+++ b/core/layout.inc
@@ -76,8 +76,9 @@ RBFG_brainfuck:	resb 2048		; Bigger than an Ethernet packet...
 		section .init		exec write progbits align=1
 		section .text16		exec write progbits align=1
 		section .textnr		exec nowrite progbits align=1
-		section .bcopyxx	exec write progbits align=16
-		section .data16		write progbits align=16
+		section .bcopyxx.text	exec nowrite progbits align=16
+		section .bcopyxx.data	noexec write progbits align=16
+		section .data16		noexec write progbits align=16
 
 		section .adv		write nobits align=512
 
@@ -96,6 +97,7 @@ RBFG_brainfuck:	resb 2048		; Bigger than an Ethernet packet...
 		SECINFO uibss
 		SECINFO config
 		SECINFO replacestub
+		SECINFO bcopyxx
 
 		SECINFO pm_code
 		SECINFO high_clear
diff --git a/core/syslinux.ld b/core/syslinux.ld
index 0c709a0..df7242e 100644
--- a/core/syslinux.ld
+++ b/core/syslinux.ld
@@ -125,12 +125,26 @@ SECTIONS
 	__textnr_dwords = (__textnr_len + 3) >> 2;
 
 	. = ALIGN(16);
-	.bcopyxx : {
+	__bcopyxx_start = .;
+
+	.bcopyxx.text : {
 		FILL(0x90909090)
-		__bcopyxx_start = .;
-		*(.bcopyxx)
-		__bcopyxx_end = .;
+		__bcopyxx_text_start = .;
+		*(.bcopyxx.text)
+		__bcopyxx_text_end = .;
+	}
+	__bcopyxx_text_len = __bcopyxx_text_end - __bcopyxx_text_start;
+	__bcopyxx_text_dwords = (__bcopyxx_text_len + 3) >> 2;
+
+	.bcopyxx.data : {
+		__bcopyxx_data_start = .;
+		*(.bcopyxx.text)
+		__bcopyxx_data_end = .;
 	}
+	__bcopyxx_data_len = __bcopyxx_data_end - __bcopyxx_data_start;
+	__bcopyxx_data_dwords = (__bcopyxx_data_len + 3) >> 2;
+
+	__bcopyxx_end = .;
 	__bcopyxx_len = __bcopyxx_end - __bcopyxx_start;
 	__bcopyxx_dwords = (__bcopyxx_len + 3) >> 2;
 



More information about the Syslinux-commits mailing list