If PcdDxeNxMemoryProtectionPolicy is set to enable protection for memory of EfiBootServicesCode, EfiConventionalMemory, the BIOS will hang at a page fault exception during MP initialization. The root cause is that the AP wake up buffer, which is below 1MB and used to hold both AP init code and data, is type of EfiConventionalMemory (not really allocated because of potential conflict with legacy code), and is marked as non-executable. During the transition from real address mode to long mode, the AP init code has to enable paging which will then cause itself a page fault exception because it's just running in non-executable memory. The solution is splitting AP wake up buffer into two part: lower part is still below 1MB and shared with legacy system, higher part is really allocated memory of BootServicesCode type. The init code in the memory below 1MB will not enable paging but just switch to protected mode and jump to higher memory, in which the init code will enable paging and switch to long mode. Cc: Jiewen Yao <jiewen.yao@intel.com> Cc: Ruiyu Ni <ruiyu.ni@intel.com> Cc: Eric Dong <eric.dong@intel.com> Cc: Laszlo Ersek <lersek@redhat.com> Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Jian J Wang <jian.j.wang@intel.com> Reviewed-by: Eric Dong <eric.dong@intel.com>
49 lines
2.3 KiB
PHP
49 lines
2.3 KiB
PHP
;------------------------------------------------------------------------------ ;
|
|
; Copyright (c) 2015 - 2017, Intel Corporation. All rights reserved.<BR>
|
|
; 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
|
|
; http://opensource.org/licenses/bsd-license.php.
|
|
;
|
|
; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
|
; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
|
;
|
|
; Module Name:
|
|
;
|
|
; MpEqu.inc
|
|
;
|
|
; Abstract:
|
|
;
|
|
; This is the equates file for Multiple Processor support
|
|
;
|
|
;-------------------------------------------------------------------------------
|
|
|
|
VacantFlag equ 00h
|
|
NotVacantFlag equ 0ffh
|
|
|
|
CPU_SWITCH_STATE_IDLE equ 0
|
|
CPU_SWITCH_STATE_STORED equ 1
|
|
CPU_SWITCH_STATE_LOADED equ 2
|
|
|
|
LockLocation equ (RendezvousFunnelProcEnd - RendezvousFunnelProcStart)
|
|
StackStartAddressLocation equ LockLocation + 08h
|
|
StackSizeLocation equ LockLocation + 10h
|
|
ApProcedureLocation equ LockLocation + 18h
|
|
GdtrLocation equ LockLocation + 20h
|
|
IdtrLocation equ LockLocation + 2Ah
|
|
BufferStartLocation equ LockLocation + 34h
|
|
ModeOffsetLocation equ LockLocation + 3Ch
|
|
ApIndexLocation equ LockLocation + 44h
|
|
CodeSegmentLocation equ LockLocation + 4Ch
|
|
DataSegmentLocation equ LockLocation + 54h
|
|
EnableExecuteDisableLocation equ LockLocation + 5Ch
|
|
Cr3Location equ LockLocation + 64h
|
|
InitFlagLocation equ LockLocation + 6Ch
|
|
CpuInfoLocation equ LockLocation + 74h
|
|
NumApsExecutingLocation equ LockLocation + 7Ch
|
|
InitializeFloatingPointUnitsAddress equ LockLocation + 8Ch
|
|
ModeTransitionMemoryLocation equ LockLocation + 94h
|
|
ModeTransitionSegmentLocation equ LockLocation + 98h
|
|
ModeHighMemoryLocation equ LockLocation + 9Ah
|
|
ModeHighSegmentLocation equ LockLocation + 9Eh
|