Message ID | 20220317135913.2166202-13-xiaoyao.li@intel.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | TDX QEMU support | expand |
On Thu, Mar 17, 2022 at 09:58:49PM +0800, Xiaoyao Li wrote: > Add sept-ve-disable property for tdx-guest object. It's used to > configure bit 28 of TD attributes. What is this? > --- a/qapi/qom.json > +++ b/qapi/qom.json > @@ -792,10 +792,13 @@ > # > # @attributes: TDX guest's attributes (default: 0) > # > +# @sept-ve-disable: attributes.sept-ve-disable[bit 28] (default: 0) I'd suggest to document this here. thanks, Gerd
On 3/22/2022 5:02 PM, Gerd Hoffmann wrote: > On Thu, Mar 17, 2022 at 09:58:49PM +0800, Xiaoyao Li wrote: >> Add sept-ve-disable property for tdx-guest object. It's used to >> configure bit 28 of TD attributes. > > What is this? It seems this bit doesn't show up in the public spec yet. Bit 28 (SEPT_VE_DISABLE): Disable EPT violation conversion to #VE ON guest TD ACCESS of PENDING pages. The TDX architecture requires a private page to be accepted before using. If guest accesses a not-accepted (pending) page it will get #VE. For some OS, e.g., Linux TD guest, it doesn't want the #VE on pending page so it will set this bit. >> --- a/qapi/qom.json >> +++ b/qapi/qom.json >> @@ -792,10 +792,13 @@ >> # >> # @attributes: TDX guest's attributes (default: 0) >> # >> +# @sept-ve-disable: attributes.sept-ve-disable[bit 28] (default: 0) > > I'd suggest to document this here. > > thanks, > Gerd >
On Thu, Mar 24, 2022 at 02:52:10PM +0800, Xiaoyao Li wrote: > On 3/22/2022 5:02 PM, Gerd Hoffmann wrote: > > On Thu, Mar 17, 2022 at 09:58:49PM +0800, Xiaoyao Li wrote: > > > Add sept-ve-disable property for tdx-guest object. It's used to > > > configure bit 28 of TD attributes. > > > > What is this? > > It seems this bit doesn't show up in the public spec yet. > > Bit 28 (SEPT_VE_DISABLE): Disable EPT violation conversion to #VE ON guest > TD ACCESS of PENDING pages. > > The TDX architecture requires a private page to be accepted before using. If > guest accesses a not-accepted (pending) page it will get #VE. > > For some OS, e.g., Linux TD guest, it doesn't want the #VE on pending page > so it will set this bit. Hmm. That looks rather pointless to me. The TDX patches for OVMF add a #VE handler, so I suspect every guest wants #VE exceptions if even the firmware cares to install a handler ... Also: What will happen instead? EPT fault delivered to the host? take care, Gerd
On 3/24/2022 3:57 PM, Gerd Hoffmann wrote: > On Thu, Mar 24, 2022 at 02:52:10PM +0800, Xiaoyao Li wrote: >> On 3/22/2022 5:02 PM, Gerd Hoffmann wrote: >>> On Thu, Mar 17, 2022 at 09:58:49PM +0800, Xiaoyao Li wrote: >>>> Add sept-ve-disable property for tdx-guest object. It's used to >>>> configure bit 28 of TD attributes. >>> >>> What is this? >> >> It seems this bit doesn't show up in the public spec yet. >> >> Bit 28 (SEPT_VE_DISABLE): Disable EPT violation conversion to #VE ON guest >> TD ACCESS of PENDING pages. >> >> The TDX architecture requires a private page to be accepted before using. If >> guest accesses a not-accepted (pending) page it will get #VE. >> >> For some OS, e.g., Linux TD guest, it doesn't want the #VE on pending page >> so it will set this bit. > > Hmm. That looks rather pointless to me. The TDX patches for OVMF add a > #VE handler, so I suspect every guest wants #VE exceptions if even the > firmware cares to install a handler ... #VE can be triggered in various situations. e.g., CPUID on some leaves, and RD/WRMSR on some MSRs. #VE on pending page is just one of the sources, Linux just wants to disable this kind of #VE since it wants to prevent unexpected #VE during SYSCALL gap. > Also: What will happen instead? EPT fault delivered to the host? Yes. > take care, > Gerd >
Hi, > #VE can be triggered in various situations. e.g., CPUID on some leaves, and > RD/WRMSR on some MSRs. #VE on pending page is just one of the sources, Linux > just wants to disable this kind of #VE since it wants to prevent unexpected > #VE during SYSCALL gap. Linux guests can't disable those on their own? Requiring this being configured on the host looks rather fragile to me ... take care, Gerd
On 3/24/2022 5:37 PM, Gerd Hoffmann wrote: > Hi, > >> #VE can be triggered in various situations. e.g., CPUID on some leaves, and >> RD/WRMSR on some MSRs. #VE on pending page is just one of the sources, Linux >> just wants to disable this kind of #VE since it wants to prevent unexpected >> #VE during SYSCALL gap. > > Linux guests can't disable those on their own? Requiring this being > configured on the host looks rather fragile to me ... Yes, current TDX architecture doesn't allow TD guest to do so. Maybe in the future, it can be allowed, maybe. > take care, > Gerd >
On Thu, Mar 24, 2022 at 10:37:25AM +0100, Gerd Hoffmann <kraxel@redhat.com> wrote: > > #VE can be triggered in various situations. e.g., CPUID on some leaves, and > > RD/WRMSR on some MSRs. #VE on pending page is just one of the sources, Linux > > just wants to disable this kind of #VE since it wants to prevent unexpected > > #VE during SYSCALL gap. > > Linux guests can't disable those on their own? Requiring this being > configured on the host looks rather fragile to me ... Guest can get the attributes. (But can't change it). If the attributes isn't what the guest expects, the guest can stop working itself.
diff --git a/qapi/qom.json b/qapi/qom.json index 1415ab22e531..fc380095a42c 100644 --- a/qapi/qom.json +++ b/qapi/qom.json @@ -792,10 +792,13 @@ # # @attributes: TDX guest's attributes (default: 0) # +# @sept-ve-disable: attributes.sept-ve-disable[bit 28] (default: 0) +# # Since: 7.0 ## { 'struct': 'TdxGuestProperties', - 'data': { '*attributes': 'uint64' } } + 'data': { '*attributes': 'uint64', + '*sept-ve-disable': 'bool' } } ## # @ObjectType: diff --git a/target/i386/kvm/tdx.c b/target/i386/kvm/tdx.c index a5cc187edbde..409526765304 100644 --- a/target/i386/kvm/tdx.c +++ b/target/i386/kvm/tdx.c @@ -21,6 +21,8 @@ #include "kvm_i386.h" #include "tdx.h" +#define TDX_TD_ATTRIBUTES_SEPT_VE_DISABLE BIT_ULL(28) + static TdxGuest *tdx_guest; /* It's valid after kvm_confidential_guest_init()->kvm_tdx_init() */ @@ -196,6 +198,24 @@ out: return r; } +static bool tdx_guest_get_sept_ve_disable(Object *obj, Error **errp) +{ + TdxGuest *tdx = TDX_GUEST(obj); + + return !!(tdx->attributes & TDX_TD_ATTRIBUTES_SEPT_VE_DISABLE); +} + +static void tdx_guest_set_sept_ve_disable(Object *obj, bool value, Error **errp) +{ + TdxGuest *tdx = TDX_GUEST(obj); + + if (value) { + tdx->attributes |= TDX_TD_ATTRIBUTES_SEPT_VE_DISABLE; + } else { + tdx->attributes &= ~TDX_TD_ATTRIBUTES_SEPT_VE_DISABLE; + } +} + /* tdx guest */ OBJECT_DEFINE_TYPE_WITH_INTERFACES(TdxGuest, tdx_guest, @@ -211,6 +231,10 @@ static void tdx_guest_init(Object *obj) qemu_mutex_init(&tdx->lock); tdx->attributes = 0; + + object_property_add_bool(obj, "sept-ve-disable", + tdx_guest_get_sept_ve_disable, + tdx_guest_set_sept_ve_disable); } static void tdx_guest_finalize(Object *obj)
Add sept-ve-disable property for tdx-guest object. It's used to configure bit 28 of TD attributes. Signed-off-by: Xiaoyao Li <xiaoyao.li@intel.com> --- qapi/qom.json | 5 ++++- target/i386/kvm/tdx.c | 24 ++++++++++++++++++++++++ 2 files changed, 28 insertions(+), 1 deletion(-)