[PATCH v4 00/14] Add Secure TSC support for SNP guests

Nikunj A Dadhania posted 14 patches 2 years, 4 months ago
There is a newer version of this series
arch/x86/Kconfig                        |   1 +
arch/x86/boot/compressed/sev.c          |   2 +-
arch/x86/coco/core.c                    |   3 +
arch/x86/include/asm/sev-guest.h        | 175 +++++++
arch/x86/include/asm/sev.h              |  19 +-
arch/x86/include/asm/svm.h              |   6 +-
arch/x86/include/asm/x86_init.h         |   2 +
arch/x86/kernel/kvmclock.c              |   2 +-
arch/x86/kernel/sev-shared.c            |   7 +
arch/x86/kernel/sev.c                   | 631 +++++++++++++++++++++--
arch/x86/kernel/tsc.c                   |   2 +-
arch/x86/kernel/x86_init.c              |   2 +
arch/x86/mm/mem_encrypt.c               |  13 +-
arch/x86/mm/mem_encrypt_amd.c           |   6 +
drivers/virt/coco/sev-guest/Kconfig     |   2 -
drivers/virt/coco/sev-guest/sev-guest.c | 650 +++---------------------
drivers/virt/coco/sev-guest/sev-guest.h |  63 ---
include/linux/cc_platform.h             |   8 +
18 files changed, 881 insertions(+), 713 deletions(-)
create mode 100644 arch/x86/include/asm/sev-guest.h
delete mode 100644 drivers/virt/coco/sev-guest/sev-guest.h
[PATCH v4 00/14] Add Secure TSC support for SNP guests
Posted by Nikunj A Dadhania 2 years, 4 months ago
Secure TSC allows guests to securely use RDTSC/RDTSCP instructions as the
parameters being used cannot be changed by hypervisor once the guest is
launched. More details in the AMD64 APM Vol 2, Section "Secure TSC".

During the boot-up of the secondary cpus, SecureTSC enabled guests need to query
TSC info from AMD Security Processor. This communication channel is encrypted
between the AMD Security Processor and the guest, the hypervisor is just the
conduit to deliver the guest messages to the AMD Security Processor. Each
message is protected with an AEAD (AES-256 GCM). See "SEV Secure Nested Paging
Firmware ABI Specification" document (currently at
https://www.amd.com/system/files/TechDocs/56860.pdf) section "TSC Info"

Use a minimal GCM library to encrypt/decrypt SNP Guest messages to communicate
with the AMD Security Processor which is available at early boot.

SEV-guest driver has the implementation for guest and AMD Security Processor
communication. As the TSC_INFO needs to be initialized during early boot before
smp cpus are started, move most of the sev-guest driver code to kernel/sev.c and
provide well defined APIs to the sev-guest driver to use the interface to avoid
code-duplication.

Patches:
01-07: Preparation and movement of sev-guest driver code
08-14: SecureTSC enablement patches.

Testing SecureTSC
-----------------

SecureTSC hypervisor patches based on top of SEV-SNP UPM series:
https://github.com/nikunjad/linux/tree/snp-host-latest-securetsc

QEMU changes:
https://github.com/nikunjad/qemu/tree/snp_securetsc

QEMU commandline SEV-SNP-UPM with SecureTSC:

  qemu-system-x86_64 -cpu EPYC-Milan-v2,+secure-tsc \
    -object memory-backend-memfd-private,id=ram1,size=1G,share=true \
    -object sev-snp-guest,id=sev0,cbitpos=51,reduced-phys-bits=1,secure-tsc=on \
    -machine q35,confidential-guest-support=sev0,memory-backend=ram1,kvm-type=protected \
    ...

Changelog:
----------
v4:
* Drop handle_guest_request() and handle_guest_request_ext()
* Drop NULL check for key
* Corrected commit subject
* Added Reviewed-by from Tom

v3:
* Updated commit messages
* Made snp_setup_psp_messaging() generic that is accessed by both the
  kernel and the driver
* Moved most of the context information to sev.c, sev-guest driver
  does not need to know the secrets page layout anymore
* Add CC_ATTR_GUEST_SECURE_TSC early in the series therefore it can be 
  used in later patches.
* Removed data_gpa and data_npages from struct snp_req_data, as certs_data 
  and its size is passed to handle_guest_request_ext()
* Make vmpck_id as unsigned int
* Dropped unnecessary usage of memzero_explicit()
* Cache secrets_pa instead of remapping the cc_blob always
* Rebase on top of v6.4 kernel
https://lore.kernel.org/lkml/20230722111909.15166-1-nikunj@amd.com/

v2:
* Rebased on top of v6.3-rc3 that has Boris's sev-guest cleanup series
  https://lore.kernel.org/r/20230307192449.24732-1-bp@alien8.de/

v1: https://lore.kernel.org/r/20230130120327.977460-1-nikunj@amd.com/

Nikunj A Dadhania (14):
  virt: sev-guest: Use AES GCM crypto library
  virt: sev-guest: Move mutex to SNP guest device structure
  virt: sev-guest: Replace dev_dbg with pr_debug
  virt: sev-guest: Add SNP guest request structure
  virt: sev-guest: Add vmpck_id to snp_guest_dev struct
  x86/sev: Cache the secrets page address
  x86/sev: Move and reorganize sev guest request api
  x86/mm: Add generic guest initialization hook
  x86/sev: Add Secure TSC support for SNP guests
  x86/sev: Change TSC MSR behavior for Secure TSC enabled guests
  x86/sev: Prevent RDTSC/RDTSCP interception for Secure TSC enabled
    guests
  x86/kvmclock: Skip kvmclock when Secure TSC is available
  x86/tsc: Mark Secure TSC as reliable clocksource
  x86/sev: Enable Secure TSC for SNP guests

 arch/x86/Kconfig                        |   1 +
 arch/x86/boot/compressed/sev.c          |   2 +-
 arch/x86/coco/core.c                    |   3 +
 arch/x86/include/asm/sev-guest.h        | 175 +++++++
 arch/x86/include/asm/sev.h              |  19 +-
 arch/x86/include/asm/svm.h              |   6 +-
 arch/x86/include/asm/x86_init.h         |   2 +
 arch/x86/kernel/kvmclock.c              |   2 +-
 arch/x86/kernel/sev-shared.c            |   7 +
 arch/x86/kernel/sev.c                   | 631 +++++++++++++++++++++--
 arch/x86/kernel/tsc.c                   |   2 +-
 arch/x86/kernel/x86_init.c              |   2 +
 arch/x86/mm/mem_encrypt.c               |  13 +-
 arch/x86/mm/mem_encrypt_amd.c           |   6 +
 drivers/virt/coco/sev-guest/Kconfig     |   2 -
 drivers/virt/coco/sev-guest/sev-guest.c | 650 +++---------------------
 drivers/virt/coco/sev-guest/sev-guest.h |  63 ---
 include/linux/cc_platform.h             |   8 +
 18 files changed, 881 insertions(+), 713 deletions(-)
 create mode 100644 arch/x86/include/asm/sev-guest.h
 delete mode 100644 drivers/virt/coco/sev-guest/sev-guest.h


base-commit: 6995e2de6891c724bfeb2db33d7b87775f913ad1
-- 
2.34.1
Re: [PATCH v4 00/14] Add Secure TSC support for SNP guests
Posted by Nikunj A. Dadhania 2 years, 3 months ago
On 8/14/2023 11:22 AM, Nikunj A Dadhania wrote:
> Secure TSC allows guests to securely use RDTSC/RDTSCP instructions as the
> parameters being used cannot be changed by hypervisor once the guest is
> launched. More details in the AMD64 APM Vol 2, Section "Secure TSC".
> 
> During the boot-up of the secondary cpus, SecureTSC enabled guests need to query
> TSC info from AMD Security Processor. This communication channel is encrypted
> between the AMD Security Processor and the guest, the hypervisor is just the
> conduit to deliver the guest messages to the AMD Security Processor. Each
> message is protected with an AEAD (AES-256 GCM). See "SEV Secure Nested Paging
> Firmware ABI Specification" document (currently at
> https://www.amd.com/system/files/TechDocs/56860.pdf) section "TSC Info"
> 
> Use a minimal GCM library to encrypt/decrypt SNP Guest messages to communicate
> with the AMD Security Processor which is available at early boot.
> 
> SEV-guest driver has the implementation for guest and AMD Security Processor
> communication. As the TSC_INFO needs to be initialized during early boot before
> smp cpus are started, move most of the sev-guest driver code to kernel/sev.c and
> provide well defined APIs to the sev-guest driver to use the interface to avoid
> code-duplication.
> 
> Patches:
> 01-07: Preparation and movement of sev-guest driver code
> 08-14: SecureTSC enablement patches.
> 
> Testing SecureTSC
> -----------------
> 
> SecureTSC hypervisor patches based on top of SEV-SNP UPM series:
> https://github.com/nikunjad/linux/tree/snp-host-latest-securetsc
> 
> QEMU changes:
> https://github.com/nikunjad/qemu/tree/snp_securetsc
> 
> QEMU commandline SEV-SNP-UPM with SecureTSC:
> 
>   qemu-system-x86_64 -cpu EPYC-Milan-v2,+secure-tsc \
>     -object memory-backend-memfd-private,id=ram1,size=1G,share=true \
>     -object sev-snp-guest,id=sev0,cbitpos=51,reduced-phys-bits=1,secure-tsc=on \
>     -machine q35,confidential-guest-support=sev0,memory-backend=ram1,kvm-type=protected \
>     ...
> 
> Changelog:
> ----------
> v4:
> * Drop handle_guest_request() and handle_guest_request_ext()
> * Drop NULL check for key
> * Corrected commit subject
> * Added Reviewed-by from Tom

A gentle reminder.

Regards
Nikunj
Re: [PATCH v4 00/14] Add Secure TSC support for SNP guests
Posted by Nikunj A. Dadhania 2 years, 2 months ago
On 8/28/2023 9:17 AM, Nikunj A. Dadhania wrote:
> On 8/14/2023 11:22 AM, Nikunj A Dadhania wrote:
>> Secure TSC allows guests to securely use RDTSC/RDTSCP instructions as the
>> parameters being used cannot be changed by hypervisor once the guest is
>> launched. More details in the AMD64 APM Vol 2, Section "Secure TSC".
>>
...
>>
>> Changelog:
>> ----------
>> v4:
>> * Drop handle_guest_request() and handle_guest_request_ext()
>> * Drop NULL check for key
>> * Corrected commit subject
>> * Added Reviewed-by from Tom
> 
> A gentle reminder.


Ping ?

Regards
Nikunj
Re: [PATCH v4 00/14] Add Secure TSC support for SNP guests
Posted by Borislav Petkov 2 years, 2 months ago
On Wed, Oct 04, 2023 at 11:05:14AM +0530, Nikunj A. Dadhania wrote:
> On 8/28/2023 9:17 AM, Nikunj A. Dadhania wrote:
> > On 8/14/2023 11:22 AM, Nikunj A Dadhania wrote:
> >> Secure TSC allows guests to securely use RDTSC/RDTSCP instructions as the
> >> parameters being used cannot be changed by hypervisor once the guest is
> >> launched. More details in the AMD64 APM Vol 2, Section "Secure TSC".
> >>
> ...
> >>
> >> Changelog:
> >> ----------
> >> v4:
> >> * Drop handle_guest_request() and handle_guest_request_ext()
> >> * Drop NULL check for key
> >> * Corrected commit subject
> >> * Added Reviewed-by from Tom
> > 
> > A gentle reminder.
> 
> 
> Ping ?

Pong.

How about you find other SEV patches on LKML which are waiting for
review and review them, while waiting for yours?

Thx.

-- 
Regards/Gruss,
    Boris.

https://people.kernel.org/tglx/notes-about-netiquette
Re: [PATCH v4 00/14] Add Secure TSC support for SNP guests
Posted by Nikunj A. Dadhania 2 years, 2 months ago
On 10/4/2023 12:31 PM, Borislav Petkov wrote:
> On Wed, Oct 04, 2023 at 11:05:14AM +0530, Nikunj A. Dadhania wrote:
>> On 8/28/2023 9:17 AM, Nikunj A. Dadhania wrote:
>>> On 8/14/2023 11:22 AM, Nikunj A Dadhania wrote:
>>>> Secure TSC allows guests to securely use RDTSC/RDTSCP instructions as the
>>>> parameters being used cannot be changed by hypervisor once the guest is
>>>> launched. More details in the AMD64 APM Vol 2, Section "Secure TSC".
>>>>
>> ...
>>>>
>>>> Changelog:
>>>> ----------
>>>> v4:
>>>> * Drop handle_guest_request() and handle_guest_request_ext()
>>>> * Drop NULL check for key
>>>> * Corrected commit subject
>>>> * Added Reviewed-by from Tom
>>>
>>> A gentle reminder.
>>
>>
>> Ping ?
> 
> Pong.
> 
> How about you find other SEV patches on LKML which are waiting for
> review and review them, while waiting for yours?

That is a good idea and I wasn't aware that this may work as a good bribe [1] :-)

Regards,
Nikunj

[1] https://lore.kernel.org/all/20230816081942.GBZNyGnk%2FK+nDuBzsC@fat_crate.local/
Re: [PATCH v4 00/14] Add Secure TSC support for SNP guests
Posted by Borislav Petkov 2 years, 2 months ago
On Thu, Oct 05, 2023 at 07:27:43PM +0530, Nikunj A. Dadhania wrote:
> That is a good idea and I wasn't aware that this may work as a good bribe [1] :-)

Whatever it takes to get you folks to review each other's patches and
get more involved in the community.

:-)

-- 
Regards/Gruss,
    Boris.

https://people.kernel.org/tglx/notes-about-netiquette