From a146d58ca0375a12f23dc5a4bd25adfa3423114f Mon Sep 17 00:00:00 2001 From: Aaron Durbin Date: Fri, 8 Feb 2013 16:56:51 -0600 Subject: ramstage: prepare for relocation The current ramstage code contains uses of symbols that cause issues when the ramstage is relocatable. There are 2 scenarios resolved by this patch: 1. Absolute symbols that are actually sizes/limits. The symbols are problematic when relocating a program because there is no way to distinguish a symbol that shouldn't be relocated and one that can. The only way to handle these symbols is to write a program to post process the relocations and keep a whitelist of ones that shouldn't be relocated. I don't believe that is a route that should be taken so fix the users of these sizes/limits encoded as absolute symbols to calculate the size at runtime or dereference a variable in memory containing the size/limit. 2. Absoulte symbols that were relocated to a fixed address. These absolute symbols are generated by assembly files to be placed at a fixed location. Again, these symbols are problematic because one can't distinguish a symbol that can't be relocated. The symbols are again resolved at runtime to allow for proper relocation. For the symbols defining a size either use 2 symbols and calculate the difference or provide a variable in memory containing the size. Change-Id: I1ef2bfe6fd531308218bcaac5dcccabf8edf932c Signed-off-by: Aaron Durbin Reviewed-on: http://review.coreboot.org/2789 Tested-by: build bot (Jenkins) Reviewed-by: Marc Jones --- src/device/oprom/realmode/x86_asm.S | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) (limited to 'src/device/oprom/realmode/x86_asm.S') diff --git a/src/device/oprom/realmode/x86_asm.S b/src/device/oprom/realmode/x86_asm.S index 56ebb3a885..54cf374025 100644 --- a/src/device/oprom/realmode/x86_asm.S +++ b/src/device/oprom/realmode/x86_asm.S @@ -36,7 +36,8 @@ __idt_handler: movb $0, %al /* This instruction gets modified */ ljmp $0, $__interrupt_handler_16bit .globl __idt_handler_size -__idt_handler_size = ( . - __idt_handler) +__idt_handler_size: + .long . - __idt_handler /* In order to be independent of coreboot's position in RAM @@ -47,7 +48,6 @@ __idt_handler_size = ( . - __idt_handler) __realmode_code: /* Realmode IDT pointer structure. */ - .globl __realmode_idt __realmode_idt = RELOCATED(.) .word 1023 /* 16 bit limit */ .long 0 /* 24 bit base */ @@ -67,13 +67,13 @@ __registers = RELOCATED(.) .long 0 /* 20 - EDI */ /* 256 byte buffer, used by int10 */ - .globl __buffer -__buffer = RELOCATED(.) + .globl __realmode_buffer +__realmode_buffer: .skip 256 .code32 .globl __realmode_call -__realmode_call = RELOCATED(.) +__realmode_call: /* save all registers to the stack */ pusha pushf @@ -204,7 +204,7 @@ __lcall_instr = RELOCATED(.) ret .globl __realmode_interrupt -__realmode_interrupt = RELOCATED(.) +__realmode_interrupt: /* save all registers to the stack */ pusha pushf @@ -408,6 +408,7 @@ __interrupt_handler_16bit = RELOCATED(.) iret .globl __realmode_code_size -__realmode_code_size = (. - __realmode_code) +__realmode_code_size: + .long . - __realmode_code .code32 -- cgit v1.2.3