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>
This commit is contained in:
Kyösti Mälkki
2016-12-04 22:17:37 +02:00
parent 3b3a28436f
commit 9d8adc0e3a
7 changed files with 14 additions and 23 deletions

View File

@@ -26,9 +26,6 @@
#include <cpu/x86/smm.h> #include <cpu/x86/smm.h>
#include <string.h> #include <string.h>
extern unsigned char _binary_smm_start;
extern unsigned char _binary_smm_size;
void smm_init(void) void smm_init(void)
{ {
msr_t msr, syscfg_orig, mtrr_aseg_orig; msr_t msr, syscfg_orig, mtrr_aseg_orig;
@@ -63,7 +60,8 @@ void smm_init(void)
enable_cache(); enable_cache();
/* copy the real SMM handler */ /* 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(); wbinvd();
disable_cache(); disable_cache();

View File

@@ -45,9 +45,6 @@ struct smm_stub_params {
*/ */
extern unsigned char _binary_smmstub_start[]; 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. */ /* Per CPU minimum stack size. */
#define SMM_MINIMUM_STACK_SIZE 32 #define SMM_MINIMUM_STACK_SIZE 32

View File

@@ -485,6 +485,10 @@ void mainboard_smi_sleep(u8 slp_typ);
void smi_release_lock(void); void smi_release_lock(void);
#endif #endif
/* This is the SMM handler. */
extern unsigned char _binary_smm_start[];
extern unsigned char _binary_smm_end[];
/* Get PMBASE address */ /* Get PMBASE address */
u16 smm_get_pmbase(void); u16 smm_get_pmbase(void);

View File

@@ -24,9 +24,6 @@
#include "chip.h" #include "chip.h"
#include "sch.h" #include "sch.h"
extern unsigned char _binary_smm_start;
extern unsigned char _binary_smm_size;
/* I945 */ /* I945 */
#define SMRAM 0x9d #define SMRAM 0x9d
#define D_OPEN (1 << 6) #define D_OPEN (1 << 6)
@@ -299,7 +296,8 @@ static void smm_install(void)
D_OPEN | G_SMRAME | C_BASE_SEG); D_OPEN | G_SMRAME | C_BASE_SEG);
/* copy the real SMM handler */ /* 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(); wbinvd();
/* close the SMM memory window and enable normal SMM */ /* close the SMM memory window and enable normal SMM */

View File

@@ -25,9 +25,6 @@
#include <string.h> #include <string.h>
#include "i82801dx.h" #include "i82801dx.h"
extern unsigned char _binary_smm_start;
extern unsigned char _binary_smm_size;
/* I945 */ /* I945 */
#define SMRAM 0x90 #define SMRAM 0x90
#define D_OPEN (1 << 6) #define D_OPEN (1 << 6)
@@ -321,7 +318,8 @@ static void smm_install(void)
D_OPEN | G_SMRAME | C_BASE_SEG); D_OPEN | G_SMRAME | C_BASE_SEG);
/* copy the real SMM handler */ /* 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(); wbinvd();
/* close the SMM memory window and enable normal SMM */ /* close the SMM memory window and enable normal SMM */

View File

@@ -25,9 +25,6 @@
#include <string.h> #include <string.h>
#include "i82801gx.h" #include "i82801gx.h"
extern unsigned char _binary_smm_start;
extern unsigned char _binary_smm_size;
/* I945 */ /* I945 */
#define SMRAM 0x9d #define SMRAM 0x9d
#define D_OPEN (1 << 6) #define D_OPEN (1 << 6)
@@ -345,7 +342,8 @@ static void smm_install(void)
D_OPEN | G_SMRAME | C_BASE_SEG); D_OPEN | G_SMRAME | C_BASE_SEG);
/* copy the real SMM handler */ /* 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(); wbinvd();
} }

View File

@@ -26,9 +26,6 @@
#include <string.h> #include <string.h>
#include "i82801ix.h" #include "i82801ix.h"
extern unsigned char _binary_smm_start;
extern unsigned char _binary_smm_size;
/* I945/GM45 */ /* I945/GM45 */
#define SMRAM 0x9d #define SMRAM 0x9d
#define D_OPEN (1 << 6) #define D_OPEN (1 << 6)
@@ -344,7 +341,8 @@ static void smm_install(void)
D_OPEN | G_SMRAME | C_BASE_SEG); D_OPEN | G_SMRAME | C_BASE_SEG);
/* copy the real SMM handler */ /* 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(); wbinvd();
} }