cpu: port amd/agesa to 64bit

Change-Id: I8644b04f4b57db5fc95ec155d3f78d53c63c9831
Signed-off-by: Stefan Reinauer <stefan.reinauer@coreboot.org>
Signed-off-by: Scott Duplichan <scott@notabs.org>
Reviewed-on: http://review.coreboot.org/10579
Tested-by: build bot (Jenkins)
Reviewed-by: Alexandru Gagniuc <mr.nuke.me@gmail.com>
Tested-by: Raptor Engineering Automated Test Stand <noreply@raptorengineeringinc.com>
This commit is contained in:
Stefan Reinauer 2015-06-18 01:14:01 -07:00
parent 29e6548ac2
commit 67b9430b36
2 changed files with 71 additions and 2 deletions

View File

@ -64,9 +64,67 @@ cache_as_ram_setup:
cvtsi2sd %ebx, %xmm1
post_code(0xa1)
AMD_ENABLE_STACK
post_code(0xa1)
#ifdef __x86_64__
/* switch to 64 bit long mode */
.intel_syntax noprefix
mov ecx, esi
add ecx, 0 # core number
xor eax, eax
lea edi, [ecx+0x1000+0x23]
mov dword ptr [ecx+0], edi
mov dword ptr [ecx+4], eax
lea edi, [ecx+0x1000]
mov dword ptr [edi+0x00], 0x000000e3
mov dword ptr [edi+0x04], eax
mov dword ptr [edi+0x08], 0x400000e3
mov dword ptr [edi+0x0c], eax
mov dword ptr [edi+0x10], 0x800000e3
mov dword ptr [edi+0x14], eax
mov dword ptr [edi+0x18], 0xc00000e3
mov dword ptr [edi+0x1c], eax
# load rom based identity mapped page tables
mov eax, ecx
mov cr3,eax
# enable PAE
mov eax, cr4
bts eax, 5
mov cr4, eax
# enable long mode
mov ecx, 0xC0000080
rdmsr
bts eax, 8
wrmsr
# enable paging
mov eax, cr0
bts eax, 31
mov cr0, eax
# use call far to switch to 64-bit code segment
jmp 0x18,.+7
/* Pass the BIST result */
cvtsd2si esi, xmm1
/* Pass the cpu_init_detected */
cvtsd2si edi, xmm0
/* align the stack */
and esp, 0xFFFFFFF0
.code64
call cache_as_ram_main
.code32
.att_syntax prefix
#else
AMD_ENABLE_STACK
/* Restore the BIST result */
cvtsd2si %xmm0, %edx
@ -77,6 +135,7 @@ cache_as_ram_setup:
pushl %ebx /* init detected */
pushl %edx /* bist */
call cache_as_ram_main
#endif
/* Should never see this postcode */
post_code(0xaf)
@ -108,3 +167,6 @@ disable_cache_as_ram:
ret
cache_as_ram_setup_out:
#ifdef __x86_64__
.code64
#endif

View File

@ -56,10 +56,17 @@ static void move_stack_high_mem(void)
memcpy(high_stack, (void *)BSP_STACK_BASE_ADDR, HIGH_ROMSTAGE_STACK_SIZE);
/* TODO: We only switch stack on BSP. */
#ifdef __x86_64__
__asm__
volatile ("add %0, %%rsp; add %0, %%rbp; invd"::"g"
(high_stack - BSP_STACK_BASE_ADDR)
:);
#else
__asm__
volatile ("add %0, %%esp; add %0, %%ebp; invd"::"g"
(high_stack - BSP_STACK_BASE_ADDR)
:);
#endif
}
static void set_resume_cache(void)