diff --git a/EdkCompatibilityPkg/Compatibility/MpServicesOnFrameworkMpServicesThunk/IA32/MpFuncs.S b/EdkCompatibilityPkg/Compatibility/MpServicesOnFrameworkMpServicesThunk/IA32/MpFuncs.S index 6fd2c1d8f2..84fd473292 100644 --- a/EdkCompatibilityPkg/Compatibility/MpServicesOnFrameworkMpServicesThunk/IA32/MpFuncs.S +++ b/EdkCompatibilityPkg/Compatibility/MpServicesOnFrameworkMpServicesThunk/IA32/MpFuncs.S @@ -1,7 +1,7 @@ #------------------------------------------------------------------------------ # IA32 assembly file for AP startup vector. # -# Copyright (c) 2009 - 2010, Intel Corporation. All rights reserved.
+# Copyright (c) 2009 - 2012, Intel Corporation. All rights reserved.
# This program and the accompanying materials # are licensed and made available under the terms and conditions of the BSD License # which accompanies this distribution. The full text of the license may be found at @@ -100,11 +100,21 @@ ProtectedModeStart: # protected mode entry point # movl $0x1b, %ecx rdmsr + + btl $10, %eax # Check for x2apic mode + jnc LegacyApicMode + movl $0x802, %ecx # Read APIC_ID + rdmsr + movl %eax, %ebx # ebx == apicid + jmp GetCpuNumber + +LegacyApicMode: andl $0xfffff000, %eax addl $0x20, %eax movl (%eax), %ebx - shrl $24, %ebx - + shrl $24, %ebx # ebx == apicid + +GetCpuNumber: xorl %ecx, %ecx movl %esi,%edi addl $ProcessorNumber, %edi diff --git a/EdkCompatibilityPkg/Compatibility/MpServicesOnFrameworkMpServicesThunk/X64/MpFuncs.S b/EdkCompatibilityPkg/Compatibility/MpServicesOnFrameworkMpServicesThunk/X64/MpFuncs.S index 6ea0f3e690..9585d32241 100644 --- a/EdkCompatibilityPkg/Compatibility/MpServicesOnFrameworkMpServicesThunk/X64/MpFuncs.S +++ b/EdkCompatibilityPkg/Compatibility/MpServicesOnFrameworkMpServicesThunk/X64/MpFuncs.S @@ -1,7 +1,7 @@ #------------------------------------------------------------------------------ # X64 assembly file for AP startup vector. # -# Copyright (c) 2009 - 2010, Intel Corporation. All rights reserved.
+# Copyright (c) 2009 - 2012, Intel Corporation. All rights reserved.
# This program and the accompanying materials # are licensed and made available under the terms and conditions of the BSD License # which accompanies this distribution. The full text of the license may be found at @@ -134,11 +134,21 @@ LongModeStart: # movl $0x1b, %ecx rdmsr + + btl $10, %eax # Check for x2apic mode + jnc LegacyApicMode + movl $0x802, %ecx # Read APIC_ID + rdmsr + movl %eax, %ebx # ebx == apicid + jmp GetCpuNumber + +LegacyApicMode: andl $0xfffff000, %eax addl $0x20, %eax movl (%eax), %ebx - shrl $24, %ebx + shrl $24, %ebx # ebx == apicid +GetCpuNumber: xorq %rcx, %rcx movl %esi,%edi addl $ProcessorNumberLocation, %edi