audk/UefiCpuPkg/Library/MpInitLib
Laszlo Ersek dd3fa0cd72 UefiCpuPkg/MpInitLib: support 64-bit AP stack addresses
The cached "CPU_INFO_IN_HOB.ApTopOfStack" field currently has type UINT32.
This is not ideal because the AP stacks are located within
"CpuMpData->Buffer", which is allocated with a plain AllocatePages() call
in MpInitLibInitialize():

  platform  CpuMpPei included  PEI RAM > 4GB  result
  --------  -----------------  -------------  ------
  Ia32      *                  n/a            good
  Ia32X64   no                 n/a            BAD
  Ia32X64   yes                n/a            good
  X64       no                 *              BAD
  X64       yes                no             good
  X64       yes                yes            BAD

- If we are on an Ia32X64 or X64 platform that does not include CpuMpPei,
  then CpuDxe cannot reuse the CPU_INFO_IN_HOB structures preallocated by
  CpuMpPei (through the CpuInitMpLib GUID HOB), and then AllocatePages()
  -- invoked first in 64-bit DXE -- could return an address outside of
  32-bit address space.

- If we are on an X64 platform where the permanent PEI RAM extends above
  the 32-bit address space, then the same issue can surface even if
  CpuMpPei is included: even the original allocation of the
  CPU_INFO_IN_HOB structures, by CpuMpPei, could be satisfied from above
  4GB.

The original "AP init" branch in "X64/MpFuncs.nasm" correctly considers a
64-bit stack start: the "MP_CPU_EXCHANGE_INFO.StackStart" field has type
UINTN, and the code uses QWORD addition and movement to set RSP from it.

Adapt the "GetApicId" branch of "X64/MpFuncs.nasm":

- change the type of "CPU_INFO_IN_HOB.ApTopOfStack" to UINT64,

- remove the explicit truncation to UINT32 in InitializeApData(),

- update the "GetNextProcNumber" iteration size to the new size of
  "CPU_INFO_IN_HOB",

- set RSP with a QWORD movement from "CPU_INFO_IN_HOB.ApTopOfStack".

Because the same CPU_INFO_IN_HOB structure is used by "Ia32/MpFuncs.nasm",
we have to update the "GetNextProcNumber" iteration size there as well.
The ESP setting can be preserved as a DWORD movement from the original
offset (decimal 12), since our integers are little endian.

Cc: Jeff Fan <jeff.fan@intel.com>
Fixes: 845c5be1fd
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Laszlo Ersek <lersek@redhat.com>
Reviewed-by: Jeff Fan <jeff.fan@intel.com>
2016-11-17 10:58:18 +01:00
..
Ia32 UefiCpuPkg/MpInitLib: support 64-bit AP stack addresses 2016-11-17 10:58:18 +01:00
X64 UefiCpuPkg/MpInitLib: support 64-bit AP stack addresses 2016-11-17 10:58:18 +01:00
DxeMpInitLib.inf UefiCpuPkg/DxeMpInitLib: remove duplicate HobLib class dependency 2016-11-17 10:57:33 +01:00
DxeMpInitLib.uni UefiCpuPkg/MpInitLib: Add two instances PeiMpInitLib and DxeMpInitLib 2016-08-17 19:58:07 +08:00
DxeMpLib.c UefiCpuPkg/DxeMpLib: Place APs to suitable state on Legacy OS boot 2016-11-14 09:56:59 +08:00
Microcode.c UefiCpuPkg/MpInitLib: Fix function header comments typo 2016-08-25 16:12:46 +08:00
MpLib.c UefiCpuPkg/MpInitLib: support 64-bit AP stack addresses 2016-11-17 10:58:18 +01:00
MpLib.h UefiCpuPkg/MpInitLib: support 64-bit AP stack addresses 2016-11-17 10:58:18 +01:00
PeiMpInitLib.inf UefiCpuPkg/MpInitLib: Add MicrocodeDetect() and load microcode on BSP 2016-08-17 20:00:23 +08:00
PeiMpInitLib.uni UefiCpuPkg/MpInitLib: Add two instances PeiMpInitLib and DxeMpInitLib 2016-08-17 19:58:07 +08:00
PeiMpLib.c UefiCpuPkg/MpInitLib: Do not wakeup AP if only one processor supported 2016-11-09 16:01:13 +08:00