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:
parent
29e6548ac2
commit
67b9430b36
|
@ -64,9 +64,67 @@ cache_as_ram_setup:
|
||||||
cvtsi2sd %ebx, %xmm1
|
cvtsi2sd %ebx, %xmm1
|
||||||
|
|
||||||
post_code(0xa1)
|
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 */
|
/* Restore the BIST result */
|
||||||
cvtsd2si %xmm0, %edx
|
cvtsd2si %xmm0, %edx
|
||||||
|
@ -77,6 +135,7 @@ cache_as_ram_setup:
|
||||||
pushl %ebx /* init detected */
|
pushl %ebx /* init detected */
|
||||||
pushl %edx /* bist */
|
pushl %edx /* bist */
|
||||||
call cache_as_ram_main
|
call cache_as_ram_main
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Should never see this postcode */
|
/* Should never see this postcode */
|
||||||
post_code(0xaf)
|
post_code(0xaf)
|
||||||
|
@ -108,3 +167,6 @@ disable_cache_as_ram:
|
||||||
ret
|
ret
|
||||||
|
|
||||||
cache_as_ram_setup_out:
|
cache_as_ram_setup_out:
|
||||||
|
#ifdef __x86_64__
|
||||||
|
.code64
|
||||||
|
#endif
|
||||||
|
|
|
@ -56,10 +56,17 @@ static void move_stack_high_mem(void)
|
||||||
memcpy(high_stack, (void *)BSP_STACK_BASE_ADDR, HIGH_ROMSTAGE_STACK_SIZE);
|
memcpy(high_stack, (void *)BSP_STACK_BASE_ADDR, HIGH_ROMSTAGE_STACK_SIZE);
|
||||||
|
|
||||||
/* TODO: We only switch stack on BSP. */
|
/* 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__
|
__asm__
|
||||||
volatile ("add %0, %%esp; add %0, %%ebp; invd"::"g"
|
volatile ("add %0, %%esp; add %0, %%ebp; invd"::"g"
|
||||||
(high_stack - BSP_STACK_BASE_ADDR)
|
(high_stack - BSP_STACK_BASE_ADDR)
|
||||||
:);
|
:);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
static void set_resume_cache(void)
|
static void set_resume_cache(void)
|
||||||
|
|
Loading…
Reference in New Issue