[PATCH v3 8/9] target/i386: SEV: Add support for setting TSC frequency for Secure TSC

Naveen N Rao (AMD) posted 9 patches 2 weeks, 3 days ago
Maintainers: Eric Blake <eblake@redhat.com>, Markus Armbruster <armbru@redhat.com>, Paolo Bonzini <pbonzini@redhat.com>, "Daniel P. Berrangé" <berrange@redhat.com>, Eduardo Habkost <eduardo@habkost.net>, Zhao Liu <zhao1.liu@intel.com>, Marcelo Tosatti <mtosatti@redhat.com>
[PATCH v3 8/9] target/i386: SEV: Add support for setting TSC frequency for Secure TSC
Posted by Naveen N Rao (AMD) 2 weeks, 3 days ago
Add support for configuring the TSC frequency when Secure TSC is enabled
in SEV-SNP guests through a new "tsc-frequency" property on SEV-SNP
guest objects, similar to the vCPU-specific property used by regular
guests and TDX. A new property is needed since SEV-SNP guests require
the TSC frequency to be specified during early SNP_LAUNCH_START command
before any vCPUs are created.

The user-provided TSC frequency is set through KVM_SET_TSC_KHZ before
issuing KVM_SEV_SNP_LAUNCH_START.

Attempts to set TSC frequency on both the SEV_SNP object and the cpu
object result in an error from KVM (on the vCPU ioctl), so do not add
separate checks for the same.

Sample command-line:
  -machine q35,confidential-guest-support=sev0 \
  -object sev-snp-guest,id=sev0,cbitpos=51,reduced-phys-bits=1,secure-tsc=on,tsc-frequency=2500000000

Co-developed-by: Ketan Chaturvedi <Ketan.Chaturvedi@amd.com>
Signed-off-by: Ketan Chaturvedi <Ketan.Chaturvedi@amd.com>
Co-developed-by: Nikunj A Dadhania <nikunj@amd.com>
Signed-off-by: Nikunj A Dadhania <nikunj@amd.com>
Signed-off-by: Naveen N Rao (AMD) <naveen@kernel.org>
---
 target/i386/sev.c | 46 ++++++++++++++++++++++++++++++++++++++++++++++
 qapi/qom.json     |  6 +++++-
 2 files changed, 51 insertions(+), 1 deletion(-)

diff --git a/target/i386/sev.c b/target/i386/sev.c
index af8222b8ceb3..56d7cc9e6901 100644
--- a/target/i386/sev.c
+++ b/target/i386/sev.c
@@ -178,6 +178,7 @@ struct SevSnpGuestState {
     char *id_auth_base64;
     uint8_t *id_auth;
     char *host_data;
+    uint32_t tsc_khz;
 
     struct kvm_sev_snp_launch_start kvm_start_conf;
     struct kvm_sev_snp_launch_finish kvm_finish_conf;
@@ -536,6 +537,13 @@ static int check_sev_features(SevCommonState *sev_common, uint64_t sev_features,
                    __func__, sev_features, sev_common->supported_sev_features);
         return -1;
     }
+    if (sev_snp_enabled() && SEV_SNP_GUEST(sev_common)->tsc_khz &&
+        !(sev_features & SVM_SEV_FEAT_SECURE_TSC)) {
+        error_setg(errp,
+                   "%s: TSC frequency can only be set if Secure TSC is enabled",
+                   __func__);
+        return -1;
+    }
     return 0;
 }
 
@@ -1085,6 +1093,19 @@ sev_snp_launch_start(SevCommonState *sev_common)
             return 1;
     }
 
+    if (is_sev_feature_set(sev_common, SVM_SEV_FEAT_SECURE_TSC) &&
+        sev_snp_guest->tsc_khz) {
+        rc = -EINVAL;
+        if (kvm_check_extension(kvm_state, KVM_CAP_VM_TSC_CONTROL)) {
+            rc = kvm_vm_ioctl(kvm_state, KVM_SET_TSC_KHZ, sev_snp_guest->tsc_khz);
+        }
+        if (rc < 0) {
+            error_report("%s: Unable to set Secure TSC frequency to %u kHz ret=%d",
+                         __func__, sev_snp_guest->tsc_khz, rc);
+            return 1;
+        }
+    }
+
     rc = sev_ioctl(sev_common->sev_fd, KVM_SEV_SNP_LAUNCH_START,
                    start, &fw_error);
     if (rc < 0) {
@@ -3132,6 +3153,28 @@ static void sev_snp_guest_set_secure_tsc(Object *obj, bool value, Error **errp)
     sev_set_feature(SEV_COMMON(obj), SVM_SEV_FEAT_SECURE_TSC, value);
 }
 
+static void
+sev_snp_guest_get_tsc_frequency(Object *obj, Visitor *v, const char *name,
+                                void *opaque, Error **errp)
+{
+    uint32_t value = SEV_SNP_GUEST(obj)->tsc_khz * 1000;
+
+    visit_type_uint32(v, name, &value, errp);
+}
+
+static void
+sev_snp_guest_set_tsc_frequency(Object *obj, Visitor *v, const char *name,
+                                void *opaque, Error **errp)
+{
+    uint32_t value;
+
+    if (!visit_type_uint32(v, name, &value, errp)) {
+        return;
+    }
+
+    SEV_SNP_GUEST(obj)->tsc_khz = value / 1000;
+}
+
 static void
 sev_snp_guest_class_init(ObjectClass *oc, const void *data)
 {
@@ -3170,6 +3213,9 @@ sev_snp_guest_class_init(ObjectClass *oc, const void *data)
     object_class_property_add_bool(oc, "secure-tsc",
                                   sev_snp_guest_get_secure_tsc,
                                   sev_snp_guest_set_secure_tsc);
+    object_class_property_add(oc, "tsc-frequency", "uint32",
+                              sev_snp_guest_get_tsc_frequency,
+                              sev_snp_guest_set_tsc_frequency, NULL, NULL);
 }
 
 static void
diff --git a/qapi/qom.json b/qapi/qom.json
index c7dd2dd1b095..5daaf065b6b7 100644
--- a/qapi/qom.json
+++ b/qapi/qom.json
@@ -1104,6 +1104,9 @@
 # @secure-tsc: enable Secure TSC
 #     (default: false) (since 10.2)
 #
+# @tsc-frequency: set secure TSC frequency.  Only valid if Secure TSC
+#     is enabled (default: zero) (since 10.2)
+#
 # Since: 9.1
 ##
 { 'struct': 'SevSnpGuestProperties',
@@ -1116,7 +1119,8 @@
             '*author-key-enabled': 'bool',
             '*host-data': 'str',
             '*vcek-disabled': 'bool',
-            '*secure-tsc': 'bool' } }
+            '*secure-tsc': 'bool',
+            '*tsc-frequency': 'uint32' } }
 
 ##
 # @TdxGuestProperties:
-- 
2.51.0
Re: [PATCH v3 8/9] target/i386: SEV: Add support for setting TSC frequency for Secure TSC
Posted by Markus Armbruster 1 week, 1 day ago
Pardon my ignorance...

"Naveen N Rao (AMD)" <naveen@kernel.org> writes:

> Add support for configuring the TSC frequency when Secure TSC is enabled
> in SEV-SNP guests through a new "tsc-frequency" property on SEV-SNP
> guest objects, similar to the vCPU-specific property used by regular
> guests and TDX.

Which property exactly?

>                 A new property is needed since SEV-SNP guests require
> the TSC frequency to be specified during early SNP_LAUNCH_START command
> before any vCPUs are created.

Sounds awkward.

Do the two properties set the same thing at different times?

> The user-provided TSC frequency is set through KVM_SET_TSC_KHZ before
> issuing KVM_SEV_SNP_LAUNCH_START.
>
> Attempts to set TSC frequency on both the SEV_SNP object and the cpu
> object result in an error from KVM (on the vCPU ioctl), so do not add
> separate checks for the same.
>
> Sample command-line:
>   -machine q35,confidential-guest-support=sev0 \
>   -object sev-snp-guest,id=sev0,cbitpos=51,reduced-phys-bits=1,secure-tsc=on,tsc-frequency=2500000000
>
> Co-developed-by: Ketan Chaturvedi <Ketan.Chaturvedi@amd.com>
> Signed-off-by: Ketan Chaturvedi <Ketan.Chaturvedi@amd.com>
> Co-developed-by: Nikunj A Dadhania <nikunj@amd.com>
> Signed-off-by: Nikunj A Dadhania <nikunj@amd.com>
> Signed-off-by: Naveen N Rao (AMD) <naveen@kernel.org>

[...]

> diff --git a/qapi/qom.json b/qapi/qom.json
> index c7dd2dd1b095..5daaf065b6b7 100644
> --- a/qapi/qom.json
> +++ b/qapi/qom.json
> @@ -1104,6 +1104,9 @@
>  # @secure-tsc: enable Secure TSC
>  #     (default: false) (since 10.2)
>  #
> +# @tsc-frequency: set secure TSC frequency.  Only valid if Secure TSC
> +#     is enabled (default: zero) (since 10.2)

Is this likely to remain the only property that's only valied when
@secure-tsc is true?

> +#
>  # Since: 9.1
>  ##
>  { 'struct': 'SevSnpGuestProperties',
> @@ -1116,7 +1119,8 @@
>              '*author-key-enabled': 'bool',
>              '*host-data': 'str',
>              '*vcek-disabled': 'bool',
> -            '*secure-tsc': 'bool' } }
> +            '*secure-tsc': 'bool',
> +            '*tsc-frequency': 'uint32' } }
>  
>  ##
>  # @TdxGuestProperties:
Re: [PATCH v3 8/9] target/i386: SEV: Add support for setting TSC frequency for Secure TSC
Posted by Naveen N Rao 1 week ago
On Thu, Nov 06, 2025 at 01:09:37PM +0100, Markus Armbruster wrote:
> Pardon my ignorance...
> 
> "Naveen N Rao (AMD)" <naveen@kernel.org> writes:
> 
> > Add support for configuring the TSC frequency when Secure TSC is enabled
> > in SEV-SNP guests through a new "tsc-frequency" property on SEV-SNP
> > guest objects, similar to the vCPU-specific property used by regular
> > guests and TDX.
> 
> Which property exactly?

Same name: tsc-frequency specified with '-cpu'

> 
> >                 A new property is needed since SEV-SNP guests require
> > the TSC frequency to be specified during early SNP_LAUNCH_START command
> > before any vCPUs are created.
> 
> Sounds awkward.
> 
> Do the two properties set the same thing at different times?

Yes. For regular guests, TSC frequency is set using a vCPU ioctl.  
However, TDX and SEV-SNP (with Secure TSC) require the TSC frequency to 
be set as a VM property (there is a VM ioctl for this purpose).

This was Tom's question too (see v2): is there any way to re-use 
'tsc-frequency' specified with '-cpu' for Secure TSC.

> 
> > The user-provided TSC frequency is set through KVM_SET_TSC_KHZ before
> > issuing KVM_SEV_SNP_LAUNCH_START.
> >
> > Attempts to set TSC frequency on both the SEV_SNP object and the cpu
> > object result in an error from KVM (on the vCPU ioctl), so do not add
> > separate checks for the same.
> >
> > Sample command-line:
> >   -machine q35,confidential-guest-support=sev0 \
> >   -object sev-snp-guest,id=sev0,cbitpos=51,reduced-phys-bits=1,secure-tsc=on,tsc-frequency=2500000000
> >
> > Co-developed-by: Ketan Chaturvedi <Ketan.Chaturvedi@amd.com>
> > Signed-off-by: Ketan Chaturvedi <Ketan.Chaturvedi@amd.com>
> > Co-developed-by: Nikunj A Dadhania <nikunj@amd.com>
> > Signed-off-by: Nikunj A Dadhania <nikunj@amd.com>
> > Signed-off-by: Naveen N Rao (AMD) <naveen@kernel.org>
> 
> [...]
> 
> > diff --git a/qapi/qom.json b/qapi/qom.json
> > index c7dd2dd1b095..5daaf065b6b7 100644
> > --- a/qapi/qom.json
> > +++ b/qapi/qom.json
> > @@ -1104,6 +1104,9 @@
> >  # @secure-tsc: enable Secure TSC
> >  #     (default: false) (since 10.2)
> >  #
> > +# @tsc-frequency: set secure TSC frequency.  Only valid if Secure TSC
> > +#     is enabled (default: zero) (since 10.2)
> 
> Is this likely to remain the only property that's only valied when
> @secure-tsc is true?

At this stage, yes. I am not aware of anything else that is specific to 
Secure TSC.


- Naveen
Re: [PATCH v3 8/9] target/i386: SEV: Add support for setting TSC frequency for Secure TSC
Posted by Daniel P. Berrangé 1 week ago
On Fri, Nov 07, 2025 at 02:21:24PM +0530, Naveen N Rao wrote:
> On Thu, Nov 06, 2025 at 01:09:37PM +0100, Markus Armbruster wrote:
> > Pardon my ignorance...
> > 
> > "Naveen N Rao (AMD)" <naveen@kernel.org> writes:
> > 
> > > Add support for configuring the TSC frequency when Secure TSC is enabled
> > > in SEV-SNP guests through a new "tsc-frequency" property on SEV-SNP
> > > guest objects, similar to the vCPU-specific property used by regular
> > > guests and TDX.
> > 
> > Which property exactly?
> 
> Same name: tsc-frequency specified with '-cpu'
> 
> > 
> > >                 A new property is needed since SEV-SNP guests require
> > > the TSC frequency to be specified during early SNP_LAUNCH_START command
> > > before any vCPUs are created.
> > 
> > Sounds awkward.
> > 
> > Do the two properties set the same thing at different times?
> 
> Yes. For regular guests, TSC frequency is set using a vCPU ioctl.  
> However, TDX and SEV-SNP (with Secure TSC) require the TSC frequency to 
> be set as a VM property (there is a VM ioctl for this purpose).

The '-cpu' arg is global to the VM, so even though the ioctl is per-VCPU,
a single '-cpu ...,tsc-frequency=NNN' argument applies universally to all
the vCPUs in regular guests. 

> This was Tom's question too (see v2): is there any way to re-use 
> 'tsc-frequency' specified with '-cpu' for Secure TSC.

I see no reason why we can't simply use the existing '-cpu tsc-frequency'
value. Fetch the CPU 0 object and query its "tsc-frequency" property,
and just assume all non-0 CPUs have the same tsc-frequency, since we
don't provide a way to set it differently per-CPU IIUC.


With regards,
Daniel
-- 
|: https://berrange.com      -o-    https://www.flickr.com/photos/dberrange :|
|: https://libvirt.org         -o-            https://fstop138.berrange.com :|
|: https://entangle-photo.org    -o-    https://www.instagram.com/dberrange :|
Re: [PATCH v3 8/9] target/i386: SEV: Add support for setting TSC frequency for Secure TSC
Posted by Naveen N Rao 4 days, 9 hours ago
On Fri, Nov 07, 2025 at 09:59:46AM +0000, Daniel P. Berrangé wrote:
> On Fri, Nov 07, 2025 at 02:21:24PM +0530, Naveen N Rao wrote:
> > On Thu, Nov 06, 2025 at 01:09:37PM +0100, Markus Armbruster wrote:
> > > Pardon my ignorance...
> > > 
> > > "Naveen N Rao (AMD)" <naveen@kernel.org> writes:
> > > 
> > > > Add support for configuring the TSC frequency when Secure TSC is enabled
> > > > in SEV-SNP guests through a new "tsc-frequency" property on SEV-SNP
> > > > guest objects, similar to the vCPU-specific property used by regular
> > > > guests and TDX.
> > > 
> > > Which property exactly?
> > 
> > Same name: tsc-frequency specified with '-cpu'
> > 
> > > 
> > > >                 A new property is needed since SEV-SNP guests require
> > > > the TSC frequency to be specified during early SNP_LAUNCH_START command
> > > > before any vCPUs are created.
> > > 
> > > Sounds awkward.
> > > 
> > > Do the two properties set the same thing at different times?
> > 
> > Yes. For regular guests, TSC frequency is set using a vCPU ioctl.  
> > However, TDX and SEV-SNP (with Secure TSC) require the TSC frequency to 
> > be set as a VM property (there is a VM ioctl for this purpose).
> 
> The '-cpu' arg is global to the VM, so even though the ioctl is per-VCPU,
> a single '-cpu ...,tsc-frequency=NNN' argument applies universally to all
> the vCPUs in regular guests. 
> 
> > This was Tom's question too (see v2): is there any way to re-use 
> > 'tsc-frequency' specified with '-cpu' for Secure TSC.
> 
> I see no reason why we can't simply use the existing '-cpu tsc-frequency'
> value. Fetch the CPU 0 object and query its "tsc-frequency" property,
> and just assume all non-0 CPUs have the same tsc-frequency, since we
> don't provide a way to set it differently per-CPU IIUC.

I might be missing something obvious, but did you mean using 
'qemu_get_cpu(0)' or 'first_cpu' in sev_snp_launch_start()?  That 
doesn't seem to work (both are NULL).


Thanks,
Naveen
Re: [PATCH v3 8/9] target/i386: SEV: Add support for setting TSC frequency for Secure TSC
Posted by Markus Armbruster 1 week ago
Naveen N Rao <naveen@kernel.org> writes:

> On Thu, Nov 06, 2025 at 01:09:37PM +0100, Markus Armbruster wrote:
>> Pardon my ignorance...
>> 
>> "Naveen N Rao (AMD)" <naveen@kernel.org> writes:
>> 
>> > Add support for configuring the TSC frequency when Secure TSC is enabled
>> > in SEV-SNP guests through a new "tsc-frequency" property on SEV-SNP
>> > guest objects, similar to the vCPU-specific property used by regular
>> > guests and TDX.
>> 
>> Which property exactly?
>
> Same name: tsc-frequency specified with '-cpu'

Thanks.  It's x86_64-cpu property tsc-frequency.

>> 
>> >                 A new property is needed since SEV-SNP guests require
>> > the TSC frequency to be specified during early SNP_LAUNCH_START command
>> > before any vCPUs are created.
>> 
>> Sounds awkward.
>> 
>> Do the two properties set the same thing at different times?
>
> Yes. For regular guests, TSC frequency is set using a vCPU ioctl.  
> However, TDX and SEV-SNP (with Secure TSC) require the TSC frequency to 
> be set as a VM property (there is a VM ioctl for this purpose).
>
> This was Tom's question too (see v2): is there any way to re-use 
> 'tsc-frequency' specified with '-cpu' for Secure TSC.

Hmm, let's see whether I can guess how this stuff works.  Please correct
my misunderstandings.

When machine property confidential-guest-support is null, it's a regular
guest.

If it points to a sev-guest object, it's SEV.

If it points to a sev-snp-guest object, it's SEV-SNP.

If it points to a tdx-guest object, it's TDX.

Normally, the TSC frequency is specified with x86_64-cpu property
tsc-frequency.

Can different CPUs have different frequencies?

In certain cases (SEV-SNP or TDX guest with Secure TSC), tsc-frequency
needs to be configured before any CPUs are created.  You're implementing
this for SEV-SNP, and you chose to create a sev-snp property
tsc-frequency for this.

What happens when I enable Secure TSC with sev-snp property
"secure-tsc": true, but don't set property tsc-frequency?

What happens when I do set it, and then also set the CPU property?  To
the same frequency?  To a different frequency?

>> > The user-provided TSC frequency is set through KVM_SET_TSC_KHZ before
>> > issuing KVM_SEV_SNP_LAUNCH_START.
>> >
>> > Attempts to set TSC frequency on both the SEV_SNP object and the cpu
>> > object result in an error from KVM (on the vCPU ioctl), so do not add
>> > separate checks for the same.
>> >
>> > Sample command-line:
>> >   -machine q35,confidential-guest-support=sev0 \
>> >   -object sev-snp-guest,id=sev0,cbitpos=51,reduced-phys-bits=1,secure-tsc=on,tsc-frequency=2500000000
>> >
>> > Co-developed-by: Ketan Chaturvedi <Ketan.Chaturvedi@amd.com>
>> > Signed-off-by: Ketan Chaturvedi <Ketan.Chaturvedi@amd.com>
>> > Co-developed-by: Nikunj A Dadhania <nikunj@amd.com>
>> > Signed-off-by: Nikunj A Dadhania <nikunj@amd.com>
>> > Signed-off-by: Naveen N Rao (AMD) <naveen@kernel.org>
>> 
>> [...]
>> 
>> > diff --git a/qapi/qom.json b/qapi/qom.json
>> > index c7dd2dd1b095..5daaf065b6b7 100644
>> > --- a/qapi/qom.json
>> > +++ b/qapi/qom.json
>> > @@ -1104,6 +1104,9 @@
>> >  # @secure-tsc: enable Secure TSC
>> >  #     (default: false) (since 10.2)
>> >  #
>> > +# @tsc-frequency: set secure TSC frequency.  Only valid if Secure TSC
>> > +#     is enabled (default: zero) (since 10.2)
>> 
>> Is this likely to remain the only property that's only valied when
>> @secure-tsc is true?
>
> At this stage, yes. I am not aware of anything else that is specific to 
> Secure TSC.

Alright, this makes "only valid if" reasonable.
Re: [PATCH v3 8/9] target/i386: SEV: Add support for setting TSC frequency for Secure TSC
Posted by Naveen N Rao 4 days, 9 hours ago
On Fri, Nov 07, 2025 at 10:49:30AM +0100, Markus Armbruster wrote:
> Naveen N Rao <naveen@kernel.org> writes:
> 
> > On Thu, Nov 06, 2025 at 01:09:37PM +0100, Markus Armbruster wrote:
> >> Pardon my ignorance...
> >> 
> >> "Naveen N Rao (AMD)" <naveen@kernel.org> writes:
> >> 
> >> > Add support for configuring the TSC frequency when Secure TSC is enabled
> >> > in SEV-SNP guests through a new "tsc-frequency" property on SEV-SNP
> >> > guest objects, similar to the vCPU-specific property used by regular
> >> > guests and TDX.
> >> 
> >> Which property exactly?
> >
> > Same name: tsc-frequency specified with '-cpu'
> 
> Thanks.  It's x86_64-cpu property tsc-frequency.

Ok.

> 
> >> 
> >> >                 A new property is needed since SEV-SNP guests require
> >> > the TSC frequency to be specified during early SNP_LAUNCH_START command
> >> > before any vCPUs are created.
> >> 
> >> Sounds awkward.
> >> 
> >> Do the two properties set the same thing at different times?
> >
> > Yes. For regular guests, TSC frequency is set using a vCPU ioctl.  
> > However, TDX and SEV-SNP (with Secure TSC) require the TSC frequency to 
> > be set as a VM property (there is a VM ioctl for this purpose).
> >
> > This was Tom's question too (see v2): is there any way to re-use 
> > 'tsc-frequency' specified with '-cpu' for Secure TSC.
> 
> Hmm, let's see whether I can guess how this stuff works.  Please correct
> my misunderstandings.
> 
> When machine property confidential-guest-support is null, it's a regular
> guest.
> 
> If it points to a sev-guest object, it's SEV.

Yes, or a SEV-ES guest.

> 
> If it points to a sev-snp-guest object, it's SEV-SNP.
> 
> If it points to a tdx-guest object, it's TDX.
> 
> Normally, the TSC frequency is specified with x86_64-cpu property
> tsc-frequency.
> 
> Can different CPUs have different frequencies?

I believe Daniel has answered this in his reply.

> 
> In certain cases (SEV-SNP or TDX guest with Secure TSC), tsc-frequency

nit: TDX guest, or SEV-SNP with Secure TSC.

> needs to be configured before any CPUs are created.  You're implementing
> this for SEV-SNP, and you chose to create a sev-snp property
> tsc-frequency for this.
> 
> What happens when I enable Secure TSC with sev-snp property
> "secure-tsc": true, but don't set property tsc-frequency?

KVM uses the host default if tsc-frequency is not explicitly specified.

> 
> What happens when I do set it, and then also set the CPU property?  To
> the same frequency?  To a different frequency?

From the commit log:
  Attempts to set TSC frequency on both the SEV_SNP object and the cpu
  object result in an error from KVM (on the vCPU ioctl), so do not add
  separate checks for the same.

If the same frequency is specified in both places, then no error is 
thrown.


Thanks,
Naveen