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