summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKyösti Mälkki <kyosti.malkki@gmail.com>2016-12-04 22:17:37 +0200
committerKyösti Mälkki <kyosti.malkki@gmail.com>2016-12-11 08:56:40 +0100
commit9d8adc0e3a923e1d201d50344f94a9176e5ec939 (patch)
tree5868a41948f5eda05a1fb8a213c4891d8a631cad
parent3b3a28436f8ef65e2aee80f7367452c2bc136a19 (diff)
x86 SMM: Fix use with RELOCATABLE_RAMSTAGE
The value for _size was not evaluated correctly if ramstage is relocated, make the calculation runtime. While touching it, move symbol declarations to header file. Change-Id: I4402315945771acf1c86a81cac6d43f1fe99a2a2 Signed-off-by: Kyösti Mälkki <kyosti.malkki@gmail.com> Reviewed-on: https://review.coreboot.org/17784 Tested-by: build bot (Jenkins) Reviewed-by: Aaron Durbin <adurbin@chromium.org>
-rw-r--r--src/cpu/amd/smm/smm_init.c6
-rw-r--r--src/cpu/x86/smm/smm_module_loader.c3
-rw-r--r--src/include/cpu/x86/smm.h4
-rw-r--r--src/soc/intel/sch/smi.c6
-rw-r--r--src/southbridge/intel/i82801dx/smi.c6
-rw-r--r--src/southbridge/intel/i82801gx/smi.c6
-rw-r--r--src/southbridge/intel/i82801ix/smi.c6
7 files changed, 14 insertions, 23 deletions
diff --git a/src/cpu/amd/smm/smm_init.c b/src/cpu/amd/smm/smm_init.c
index c87b70109f..4d04cf7762 100644
--- a/src/cpu/amd/smm/smm_init.c
+++ b/src/cpu/amd/smm/smm_init.c
@@ -26,9 +26,6 @@
#include <cpu/x86/smm.h>
#include <string.h>
-extern unsigned char _binary_smm_start;
-extern unsigned char _binary_smm_size;
-
void smm_init(void)
{
msr_t msr, syscfg_orig, mtrr_aseg_orig;
@@ -63,7 +60,8 @@ void smm_init(void)
enable_cache();
/* copy the real SMM handler */
- memcpy((void *)SMM_BASE, &_binary_smm_start, (size_t)&_binary_smm_size);
+ memcpy((void *)SMM_BASE, _binary_smm_start,
+ _binary_smm_end - _binary_smm_start);
wbinvd();
disable_cache();
diff --git a/src/cpu/x86/smm/smm_module_loader.c b/src/cpu/x86/smm/smm_module_loader.c
index 139bce13ab..b8edf3969e 100644
--- a/src/cpu/x86/smm/smm_module_loader.c
+++ b/src/cpu/x86/smm/smm_module_loader.c
@@ -45,9 +45,6 @@ struct smm_stub_params {
*/
extern unsigned char _binary_smmstub_start[];
-/* This is the SMM handler that the stub calls. It is encoded as an rmodule. */
-extern unsigned char _binary_smm_start[];
-
/* Per CPU minimum stack size. */
#define SMM_MINIMUM_STACK_SIZE 32
diff --git a/src/include/cpu/x86/smm.h b/src/include/cpu/x86/smm.h
index 8ea66bae7b..0489ece917 100644
--- a/src/include/cpu/x86/smm.h
+++ b/src/include/cpu/x86/smm.h
@@ -485,6 +485,10 @@ void mainboard_smi_sleep(u8 slp_typ);
void smi_release_lock(void);
#endif
+/* This is the SMM handler. */
+extern unsigned char _binary_smm_start[];
+extern unsigned char _binary_smm_end[];
+
/* Get PMBASE address */
u16 smm_get_pmbase(void);
diff --git a/src/soc/intel/sch/smi.c b/src/soc/intel/sch/smi.c
index 24628e52e6..f79e963ba1 100644
--- a/src/soc/intel/sch/smi.c
+++ b/src/soc/intel/sch/smi.c
@@ -24,9 +24,6 @@
#include "chip.h"
#include "sch.h"
-extern unsigned char _binary_smm_start;
-extern unsigned char _binary_smm_size;
-
/* I945 */
#define SMRAM 0x9d
#define D_OPEN (1 << 6)
@@ -299,7 +296,8 @@ static void smm_install(void)
D_OPEN | G_SMRAME | C_BASE_SEG);
/* copy the real SMM handler */
- memcpy((void *)0xa0000, &_binary_smm_start, (size_t)&_binary_smm_size);
+ memcpy((void *)0xa0000, _binary_smm_start,
+ _binary_smm_end - _binary_smm_start);
wbinvd();
/* close the SMM memory window and enable normal SMM */
diff --git a/src/southbridge/intel/i82801dx/smi.c b/src/southbridge/intel/i82801dx/smi.c
index 71ef5fd8ee..93e28452e0 100644
--- a/src/southbridge/intel/i82801dx/smi.c
+++ b/src/southbridge/intel/i82801dx/smi.c
@@ -25,9 +25,6 @@
#include <string.h>
#include "i82801dx.h"
-extern unsigned char _binary_smm_start;
-extern unsigned char _binary_smm_size;
-
/* I945 */
#define SMRAM 0x90
#define D_OPEN (1 << 6)
@@ -321,7 +318,8 @@ static void smm_install(void)
D_OPEN | G_SMRAME | C_BASE_SEG);
/* copy the real SMM handler */
- memcpy((void *)0xa0000, &_binary_smm_start, (size_t)&_binary_smm_size);
+ memcpy((void *)0xa0000, _binary_smm_start,
+ _binary_smm_end - _binary_smm_start);
wbinvd();
/* close the SMM memory window and enable normal SMM */
diff --git a/src/southbridge/intel/i82801gx/smi.c b/src/southbridge/intel/i82801gx/smi.c
index 3487aabd56..c9d4cd92ca 100644
--- a/src/southbridge/intel/i82801gx/smi.c
+++ b/src/southbridge/intel/i82801gx/smi.c
@@ -25,9 +25,6 @@
#include <string.h>
#include "i82801gx.h"
-extern unsigned char _binary_smm_start;
-extern unsigned char _binary_smm_size;
-
/* I945 */
#define SMRAM 0x9d
#define D_OPEN (1 << 6)
@@ -345,7 +342,8 @@ static void smm_install(void)
D_OPEN | G_SMRAME | C_BASE_SEG);
/* copy the real SMM handler */
- memcpy((void *)0xa0000, &_binary_smm_start, (size_t)&_binary_smm_size);
+ memcpy((void *)0xa0000, _binary_smm_start,
+ _binary_smm_end - _binary_smm_start);
wbinvd();
}
diff --git a/src/southbridge/intel/i82801ix/smi.c b/src/southbridge/intel/i82801ix/smi.c
index 358a1a9ee7..421746df7e 100644
--- a/src/southbridge/intel/i82801ix/smi.c
+++ b/src/southbridge/intel/i82801ix/smi.c
@@ -26,9 +26,6 @@
#include <string.h>
#include "i82801ix.h"
-extern unsigned char _binary_smm_start;
-extern unsigned char _binary_smm_size;
-
/* I945/GM45 */
#define SMRAM 0x9d
#define D_OPEN (1 << 6)
@@ -344,7 +341,8 @@ static void smm_install(void)
D_OPEN | G_SMRAME | C_BASE_SEG);
/* copy the real SMM handler */
- memcpy((void *)0xa0000, &_binary_smm_start, (size_t)&_binary_smm_size);
+ memcpy((void *)0xa0000, _binary_smm_start,
+ _binary_smm_end - _binary_smm_start);
wbinvd();
}