bd82x6x: don't use absolute symbols

objcopy -B provides symbols of the form _binary_<name>_(start|end|size).
However, the _size variant is an absoult symbol.  If one wants to
relocate the smi loading the _size symbol will be relocated which is
wrong since it is suppose to be a fixed size. There is no way to
distinguish symbols that shouldn't be relocated vs ones that can.
Instead use the _start and _end variants to determine the size.

Change-Id: I55192992cf36f62a9d8dd896e5fb3043a3eacbd3
Signed-off-by: Aaron Durbin <adurbin@chromium.org>
Reviewed-on: http://review.coreboot.org/2760
Tested-by: build bot (Jenkins)
Reviewed-by: Ronald G. Minnich <rminnich@gmail.com>
This commit is contained in:
Aaron Durbin 2013-02-08 16:14:07 -06:00 committed by Ronald G. Minnich
parent 058d70f163
commit 8aa210bbf0
1 changed files with 3 additions and 2 deletions

View File

@ -35,7 +35,7 @@
#endif #endif
extern unsigned char _binary_smm_start; extern unsigned char _binary_smm_start;
extern unsigned char _binary_smm_size; extern unsigned char _binary_smm_end;
/* While we read PMBASE dynamically in case it changed, let's /* While we read PMBASE dynamically in case it changed, let's
* initialize it with a sane value * initialize it with a sane value
@ -352,7 +352,8 @@ static void smm_install(void)
/* copy the real SMM handler */ /* copy the real SMM handler */
printk(BIOS_DEBUG, "Installing SMM handler to 0x%08x\n", smm_base); printk(BIOS_DEBUG, "Installing SMM handler to 0x%08x\n", smm_base);
memcpy((void *)smm_base, &_binary_smm_start, (size_t)&_binary_smm_size); memcpy((void *)smm_base, &_binary_smm_start,
(size_t)(&_binary_smm_end - &_binary_smm_start));
/* copy the IED header into place */ /* copy the IED header into place */
if (CONFIG_SMM_TSEG_SIZE > IED_SIZE) { if (CONFIG_SMM_TSEG_SIZE > IED_SIZE) {