cpu/x86/lapic: Unconditionally use CPUID leaf 0xb if available
Even when we're not in X2APIC mode, the information in CPUID leaf 0xb will be valid if that leaf is implemented on the CPU. Change-Id: I0f1f46fe5091ebeab6dfb4c7e151150cf495d0cb Signed-off-by: Kyösti Mälkki <kyosti.malkki@gmail.com> Reviewed-on: https://review.coreboot.org/c/coreboot/+/58386 Tested-by: build bot (Jenkins) <no-reply@coreboot.org> Reviewed-by: Tim Wawrzynczak <twawrzynczak@chromium.org> Reviewed-by: Wonkyu Kim <wonkyu.kim@intel.com> Reviewed-by: Arthur Heymans <arthur@aheymans.xyz> Reviewed-by: Angel Pons <th3fanbus@gmail.com>
This commit is contained in:
parent
2c079fce45
commit
ceaf959678
|
@ -101,30 +101,25 @@ smm_trampoline32:
|
||||||
* the OS can manipulate the APIC id use the non-changing cpuid result
|
* the OS can manipulate the APIC id use the non-changing cpuid result
|
||||||
* for APIC id (eax). A table is used to handle a discontiguous
|
* for APIC id (eax). A table is used to handle a discontiguous
|
||||||
* APIC id space. */
|
* APIC id space. */
|
||||||
apic_id:
|
|
||||||
mov $LAPIC_BASE_MSR, %ecx
|
|
||||||
rdmsr
|
|
||||||
and $LAPIC_BASE_X2APIC_ENABLED, %eax
|
|
||||||
cmp $LAPIC_BASE_X2APIC_ENABLED, %eax
|
|
||||||
jne xapic
|
|
||||||
|
|
||||||
x2apic:
|
mov $0, %eax
|
||||||
|
cpuid
|
||||||
|
cmp $0xb, %eax
|
||||||
|
jc 1f
|
||||||
mov $0xb, %eax
|
mov $0xb, %eax
|
||||||
mov $0, %ecx
|
mov $0, %ecx
|
||||||
cpuid
|
cpuid
|
||||||
mov %edx, %eax
|
mov %edx, %eax
|
||||||
jmp apicid_end
|
jmp 2f
|
||||||
|
1:
|
||||||
xapic:
|
|
||||||
mov $1, %eax
|
mov $1, %eax
|
||||||
cpuid
|
cpuid
|
||||||
mov %ebx, %eax
|
mov %ebx, %eax
|
||||||
shr $24, %eax
|
shr $24, %eax
|
||||||
|
2:
|
||||||
|
|
||||||
apicid_end:
|
|
||||||
mov $(apic_to_cpu_num), %ebx
|
mov $(apic_to_cpu_num), %ebx
|
||||||
xor %ecx, %ecx
|
xor %ecx, %ecx
|
||||||
|
|
||||||
1:
|
1:
|
||||||
cmp (%ebx, %ecx, 2), %ax
|
cmp (%ebx, %ecx, 2), %ax
|
||||||
je 1f
|
je 1f
|
||||||
|
|
|
@ -126,7 +126,7 @@ static __always_inline int lapic_busy(void)
|
||||||
static __always_inline unsigned int initial_lapicid(void)
|
static __always_inline unsigned int initial_lapicid(void)
|
||||||
{
|
{
|
||||||
uint32_t lapicid;
|
uint32_t lapicid;
|
||||||
if (is_x2apic_mode() && cpuid_get_max_func() >= 0xb)
|
if (cpuid_get_max_func() >= 0xb)
|
||||||
lapicid = cpuid_ext(0xb, 0).edx;
|
lapicid = cpuid_ext(0xb, 0).edx;
|
||||||
else
|
else
|
||||||
lapicid = cpuid_ebx(1) >> 24;
|
lapicid = cpuid_ebx(1) >> 24;
|
||||||
|
|
Loading…
Reference in New Issue