MdePkg/BaseLib: add support for PVALIDATE instruction

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

The PVALIDATE instruction validates or rescinds validation of a guest
page RMP entry. Upon completion, a return code is stored in EAX, rFLAGS
bits OF, ZF, AF, PF and SF are set based on this return code. If the
instruction completed succesfully, the rFLAGS bit CF indicates if the
contents of the RMP entry were changed or not.

For more information about the instruction see AMD APM volume 3.

Cc: James Bottomley <jejb@linux.ibm.com>
Cc: Min Xu <min.m.xu@intel.com>
Cc: Jiewen Yao <jiewen.yao@intel.com>
Cc: Tom Lendacky <thomas.lendacky@amd.com>
Cc: Jordan Justen <jordan.l.justen@intel.com>
Cc: Ard Biesheuvel <ardb+tianocore@kernel.org>
Cc: Laszlo Ersek <lersek@redhat.com>
Cc: Erdem Aktas <erdemaktas@google.com>
Cc: Michael D Kinney <michael.d.kinney@intel.com>
Cc: Liming Gao <gaoliming@byosoft.com.cn>
Cc: Zhiguang Liu <zhiguang.liu@intel.com>
Reviewed-by: Liming Gao <gaoliming@byosoft.com.cn>
Reviewed-by: Laszlo Ersek <lersek@redhat.com>
Signed-off-by: Brijesh Singh <brijesh.singh@amd.com>
Message-Id: <20210519181949.6574-8-brijesh.singh@amd.com>
This commit is contained in:
Brijesh Singh 2021-05-19 13:19:43 -05:00 committed by mergify[bot]
parent dfd41aef78
commit 5a7cbd54a1
4 changed files with 101 additions and 0 deletions

View File

@ -4813,6 +4813,56 @@ SpeculationBarrier (
VOID
);
#if defined (MDE_CPU_X64)
//
// The page size for the PVALIDATE instruction
//
typedef enum {
PvalidatePageSize4K = 0,
PvalidatePageSize2MB,
} PVALIDATE_PAGE_SIZE;
//
// PVALIDATE Return Code.
//
#define PVALIDATE_RET_SUCCESS 0
#define PVALIDATE_RET_FAIL_INPUT 1
#define PVALIDATE_RET_SIZE_MISMATCH 6
//
// The PVALIDATE instruction did not make any changes to the RMP entry.
//
#define PVALIDATE_RET_NO_RMPUPDATE 255
/**
Execute a PVALIDATE instruction to validate or to rescinds validation of a guest
page's RMP entry.
The instruction is available only when CPUID Fn8000_001F_EAX[SNP]=1.
The function is available on X64.
@param[in] PageSize The page size to use.
@param[in] Validate If TRUE, validate the guest virtual address
otherwise invalidate the guest virtual address.
@param[in] Address The guest virtual address.
@retval PVALIDATE_RET_SUCCESS The PVALIDATE instruction succeeded, and
updated the RMP entry.
@retval PVALIDATE_RET_NO_RMPUPDATE The PVALIDATE instruction succeeded, but
did not update the RMP entry.
@return Failure code from the PVALIDATE
instruction.
**/
UINT32
EFIAPI
AsmPvalidate (
IN PVALIDATE_PAGE_SIZE PageSize,
IN BOOLEAN Validate,
IN PHYSICAL_ADDRESS Address
);
#endif
#if defined (MDE_CPU_IA32) || defined (MDE_CPU_X64)
///

View File

@ -33,6 +33,14 @@
DB 0xF3, 0x48, 0x0F, 0xAE, 0xE8
%endmacro
;
; Macro for the PVALIDATE instruction, defined in AMD APM volume 3.
; NASM feature request URL: https://bugzilla.nasm.us/show_bug.cgi?id=3392753
;
%macro PVALIDATE 0
DB 0xF2, 0x0F, 0x01, 0xFF
%endmacro
; NASM provides built-in macros STRUC and ENDSTRUC for structure definition.
; For example, to define a structure called mytype containing a longword,
; a word, a byte and a string of bytes, you might code

View File

@ -317,6 +317,7 @@
X64/GccInlinePriv.c | GCC
X64/EnableDisableInterrupts.nasm
X64/DisablePaging64.nasm
X64/Pvalidate.nasm
X64/RdRand.nasm
X64/XGetBv.nasm
X64/XSetBv.nasm

View File

@ -0,0 +1,42 @@
;-----------------------------------------------------------------------------
;
; Copyright (c) 2021, AMD. All rights reserved.<BR>
; SPDX-License-Identifier: BSD-2-Clause-Patent
;
;-----------------------------------------------------------------------------
%include "Nasm.inc"
SECTION .text
;-----------------------------------------------------------------------------
; UINT32
; EFIAPI
; AsmPvalidate (
; IN UINT32 PageSize
; IN UINT32 Validate,
; IN UINT64 Address
; )
;-----------------------------------------------------------------------------
global ASM_PFX(AsmPvalidate)
ASM_PFX(AsmPvalidate):
mov rax, r8
PVALIDATE
; Save the carry flag.
setc dl
; The PVALIDATE instruction returns the status in rax register.
cmp rax, 0
jne PvalidateExit
; Check the carry flag to determine if RMP entry was updated.
cmp dl, 0
je PvalidateExit
; Return the PVALIDATE_RET_NO_RMPUPDATE.
mov rax, 255
PvalidateExit:
ret