sandybridge: Use calls rather than asm to call to MRC.
Using asm as it's done currently is unsafe because caller-saved registers are not declared as clobbered. Using real call is nicer. regparm((1)) ensures that argument is passed in %eax as expected. Change-Id: I7449182582eaa53d4e473bc834b472edd8ee0d30 Signed-off-by: Vladimir Serbinenko <phcoder@gmail.com> Reviewed-on: http://review.coreboot.org/4675 Tested-by: build bot (Jenkins) Reviewed-by: Patrick Georgi <patrick@georgi-clan.de>
This commit is contained in:
parent
f3c3dae580
commit
c2ee6801e8
|
@ -219,7 +219,7 @@ static void post_system_agent_init(struct pei_data *pei_data)
|
||||||
void sdram_initialize(struct pei_data *pei_data)
|
void sdram_initialize(struct pei_data *pei_data)
|
||||||
{
|
{
|
||||||
struct sys_info sysinfo;
|
struct sys_info sysinfo;
|
||||||
unsigned long entry;
|
int (*entry) (struct pei_data *pei_data) __attribute__ ((regparm(1)));
|
||||||
|
|
||||||
report_platform_info();
|
report_platform_info();
|
||||||
|
|
||||||
|
@ -252,13 +252,11 @@ void sdram_initialize(struct pei_data *pei_data)
|
||||||
|
|
||||||
/* Locate and call UEFI System Agent binary. */
|
/* Locate and call UEFI System Agent binary. */
|
||||||
/* TODO make MRC blob (0xab?) defined in cbfs_core.h. */
|
/* TODO make MRC blob (0xab?) defined in cbfs_core.h. */
|
||||||
entry = (unsigned long)cbfs_get_file_content(
|
entry = cbfs_get_file_content(
|
||||||
CBFS_DEFAULT_MEDIA, "mrc.bin", 0xab, NULL);
|
CBFS_DEFAULT_MEDIA, "mrc.bin", 0xab, NULL);
|
||||||
if (entry) {
|
if (entry) {
|
||||||
int rv;
|
int rv;
|
||||||
asm volatile (
|
rv = entry (pei_data);
|
||||||
"call *%%ecx\n\t"
|
|
||||||
:"=a" (rv) : "c" (entry), "a" (pei_data));
|
|
||||||
if (rv) {
|
if (rv) {
|
||||||
switch (rv) {
|
switch (rv) {
|
||||||
case -1:
|
case -1:
|
||||||
|
|
Loading…
Reference in New Issue