MdePkg: Clean up GHCB field offsets and save area

BZ: https://bugzilla.tianocore.org/show_bug.cgi?id=3008

Use OFFSET_OF () and sizeof () to calculate the GHCB register field
offsets instead of hardcoding the values in the GHCB_REGISTER enum.
Define only fields that are used per the GHCB specification, which will
result in removing some fields and adding others.

Also, remove the DR7 field from the GHCB_SAVE_AREA structure since it is
not used/defined in the GHCB specification and then rename the reserved
fields as appropriate.

Cc: Michael D Kinney <michael.d.kinney@intel.com>
Cc: Liming Gao <gaoliming@byosoft.com.cn>
Cc: Zhiguang Liu <zhiguang.liu@intel.com>
Signed-off-by: Tom Lendacky <thomas.lendacky@amd.com>
Message-Id: <5e9245c7600b9b2d55dd7586b8df28b91b75b72b.1604685192.git.thomas.lendacky@amd.com>
Reviewed-by: Liming Gao <gaoliming@byosoft.com.cn>
This commit is contained in:
Tom Lendacky 2020-11-06 11:53:03 -06:00 committed by mergify[bot]
parent 8c610e6075
commit 990ab937c2
1 changed files with 17 additions and 26 deletions

View File

@ -82,35 +82,10 @@
#define IOIO_SEG_DS (BIT11 | BIT10)
typedef enum {
GhcbCpl = 25,
GhcbRflags = 46,
GhcbRip,
GhcbRsp = 59,
GhcbRax = 63,
GhcbRcx = 97,
GhcbRdx,
GhcbRbx,
GhcbRbp = 101,
GhcbRsi,
GhcbRdi,
GhcbR8,
GhcbR9,
GhcbR10,
GhcbR11,
GhcbR12,
GhcbR13,
GhcbR14,
GhcbR15,
GhcbXCr0 = 125,
} GHCB_REGISTER;
typedef PACKED struct {
UINT8 Reserved1[203];
UINT8 Cpl;
UINT8 Reserved2[148];
UINT64 Dr7;
UINT8 Reserved3[144];
UINT8 Reserved8[300];
UINT64 Rax;
UINT8 Reserved4[264];
UINT64 Rcx;
@ -136,6 +111,22 @@ typedef PACKED struct {
UINT32 GhcbUsage;
} GHCB;
#define GHCB_SAVE_AREA_QWORD_OFFSET(RegisterField) \
(OFFSET_OF (GHCB, SaveArea.RegisterField) / sizeof (UINT64))
typedef enum {
GhcbCpl = GHCB_SAVE_AREA_QWORD_OFFSET (Cpl),
GhcbRax = GHCB_SAVE_AREA_QWORD_OFFSET (Rax),
GhcbRbx = GHCB_SAVE_AREA_QWORD_OFFSET (Rbx),
GhcbRcx = GHCB_SAVE_AREA_QWORD_OFFSET (Rcx),
GhcbRdx = GHCB_SAVE_AREA_QWORD_OFFSET (Rdx),
GhcbXCr0 = GHCB_SAVE_AREA_QWORD_OFFSET (XCr0),
GhcbSwExitCode = GHCB_SAVE_AREA_QWORD_OFFSET (SwExitCode),
GhcbSwExitInfo1 = GHCB_SAVE_AREA_QWORD_OFFSET (SwExitInfo1),
GhcbSwExitInfo2 = GHCB_SAVE_AREA_QWORD_OFFSET (SwExitInfo2),
GhcbSwScratch = GHCB_SAVE_AREA_QWORD_OFFSET (SwScratch),
} GHCB_REGISTER;
typedef union {
struct {
UINT32 Lower32Bits;