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:
@@ -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();
|
||||||
|
|
||||||
|
@@ -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
|
||||||
|
|
||||||
|
@@ -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);
|
||||||
|
|
||||||
|
@@ -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 */
|
||||||
|
@@ -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 */
|
||||||
|
@@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user