mirror-linux/drivers/crypto/ccp
Borislav Petkov (AMD) 46834d90a9 crypto: ccp - Always pass in an error pointer to __sev_platform_shutdown_locked()
When

  9770b428b1 ("crypto: ccp - Move dev_info/err messages for SEV/SNP init and shutdown")

moved the error messages dumping so that they don't need to be issued by
the callers, it missed the case where __sev_firmware_shutdown() calls
__sev_platform_shutdown_locked() with a NULL argument which leads to
a NULL ptr deref on the shutdown path, during suspend to disk:

  #PF: supervisor read access in kernel mode
  #PF: error_code(0x0000) - not-present page
  PGD 0 P4D 0
  Oops: Oops: 0000 [#1] SMP NOPTI
  CPU: 0 UID: 0 PID: 983 Comm: hib.sh Not tainted 6.17.0-rc4+ #1 PREEMPT(voluntary)
  Hardware name: Supermicro Super Server/H12SSL-i, BIOS 2.5 09/08/2022
  RIP: 0010:__sev_platform_shutdown_locked.cold+0x0/0x21 [ccp]

That rIP is:

  00000000000006fd <__sev_platform_shutdown_locked.cold>:
   6fd:   8b 13                   mov    (%rbx),%edx
   6ff:   48 8b 7d 00             mov    0x0(%rbp),%rdi
   703:   89 c1                   mov    %eax,%ecx

  Code: 74 05 31 ff 41 89 3f 49 8b 3e 89 ea 48 c7 c6 a0 8e 54 a0 41 bf 92 ff ff ff e8 e5 2e 09 e1 c6 05 2a d4 38 00 01 e9 26 af ff ff <8b> 13 48 8b 7d 00 89 c1 48 c7 c6 18 90 54 a0 89 44 24 04 e8 c1 2e
  RSP: 0018:ffffc90005467d00 EFLAGS: 00010282
  RAX: 00000000ffffff92 RBX: 0000000000000000 RCX: 0000000000000000
  			     ^^^^^^^^^^^^^^^^
and %rbx is nice and clean.

  Call Trace:
   <TASK>
   __sev_firmware_shutdown.isra.0
   sev_dev_destroy
   psp_dev_destroy
   sp_destroy
   pci_device_shutdown
   device_shutdown
   kernel_power_off
   hibernate.cold
   state_store
   kernfs_fop_write_iter
   vfs_write
   ksys_write
   do_syscall_64
   entry_SYSCALL_64_after_hwframe

Pass in a pointer to the function-local error var in the caller.

With that addressed, suspending the ccp shows the error properly at
least:

  ccp 0000:47:00.1: sev command 0x2 timed out, disabling PSP
  ccp 0000:47:00.1: SEV: failed to SHUTDOWN error 0x0, rc -110
  SEV-SNP: Leaking PFN range 0x146800-0x146a00
  SEV-SNP: PFN 0x146800 unassigned, dumping non-zero entries in 2M PFN region: [0x146800 - 0x146a00]
  ...
  ccp 0000:47:00.1: SEV-SNP firmware shutdown failed, rc -16, error 0x0
  ACPI: PM: Preparing to enter system sleep state S5
  kvm: exiting hardware virtualization
  reboot: Power down

Btw, this driver is crying to be cleaned up to pass in a proper I/O
struct which can be used to store information between the different
functions, otherwise stuff like that will happen in the future again.

Fixes: 9770b428b1 ("crypto: ccp - Move dev_info/err messages for SEV/SNP init and shutdown")
Signed-off-by: Borislav Petkov (AMD) <bp@alien8.de>
Cc: <stable@kernel.org>
Reviewed-by: Ashish Kalra <ashish.kalra@amd.com>
Acked-by: Tom Lendacky <thomas.lendacky@amd.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
2025-09-13 12:07:44 +08:00
..
Kconfig crypto: ccp - Have it depend on AMD_IOMMU 2024-02-13 12:21:15 +01:00
Makefile crypto: ccp - Move security attributes to their own file 2024-06-07 19:46:39 +08:00
ccp-crypto-aes-cmac.c crypto: ccp - Set DMA alignment explicitly 2022-12-09 18:45:00 +08:00
ccp-crypto-aes-galois.c crypto: ccp - Set DMA alignment explicitly 2022-12-09 18:45:00 +08:00
ccp-crypto-aes-xts.c crypto: ccp - Set DMA alignment explicitly 2022-12-09 18:45:00 +08:00
ccp-crypto-aes.c crypto: ccp - Add missing header inclusions 2025-04-16 15:16:21 +08:00
ccp-crypto-des3.c crypto: ccp - Add missing header inclusions 2025-04-16 15:16:21 +08:00
ccp-crypto-main.c crypto: ccp - Add missing header inclusions 2025-04-16 15:16:21 +08:00
ccp-crypto-rsa.c crypto: ccp - Set DMA alignment explicitly 2022-12-09 18:45:00 +08:00
ccp-crypto-sha.c crypto: ccp - Set DMA alignment explicitly 2022-12-09 18:45:00 +08:00
ccp-crypto.h
ccp-debugfs.c crypto: ccp - Fix crash when rebind ccp device for ccp.ko 2025-07-07 15:31:43 +12:00
ccp-dev-v3.c crypto: ccp - Make use of the helper macro kthread_run() 2021-10-29 21:04:04 +08:00
ccp-dev-v5.c crypto: ccp - Make use of the helper macro kthread_run() 2021-10-29 21:04:04 +08:00
ccp-dev.c crypto: ccp - no need to initialise statics to 0 2021-11-20 15:06:38 +11:00
ccp-dev.h crypto: ccp - fix typo in comment 2022-06-10 16:40:18 +08:00
ccp-dmaengine.c crypto: ccp - Failure on re-initialization due to duplicate sysfs filename 2023-01-20 18:29:31 +08:00
ccp-ops.c crypto: ccp - reduce stack usage in ccp_run_aes_gcm_cmd 2025-07-27 22:41:45 +10:00
dbc.c crypto: ccp - Use scoped guard for mutex 2024-12-14 17:21:43 +08:00
dbc.h crypto: ccp - Add support for DBC over PSP mailbox 2023-09-15 18:29:46 +08:00
hsti.c crypto: ccp - Move message about TSME being enabled later in init 2024-06-07 19:46:39 +08:00
hsti.h crypto: ccp - Add support for getting security attributes on some older systems 2024-06-07 19:46:39 +08:00
platform-access.c crypto: ccp - Avoid discarding errors in psp_send_platform_access_msg() 2024-02-24 08:41:20 +08:00
platform-access.h crypto: ccp - Add support for ringing a platform doorbell 2023-03-17 11:16:43 +08:00
psp-dev.c crypto: ccp - Move message about TSME being enabled later in init 2024-06-07 19:46:39 +08:00
psp-dev.h crypto: ccp - Add support for getting security attributes on some older systems 2024-06-07 19:46:39 +08:00
sev-dev.c crypto: ccp - Always pass in an error pointer to __sev_platform_shutdown_locked() 2025-09-13 12:07:44 +08:00
sev-dev.h crypto: ccp: Handle legacy SEV commands when SNP is enabled 2024-01-29 20:34:18 +01:00
sp-dev.c crypto: ccp: Add external API interface for PSP module initialization 2025-02-14 18:39:19 -05:00
sp-dev.h crypto: ccp - Remove unused declaration sp_get_master() 2024-08-30 18:22:31 +08:00
sp-pci.c crypto: ccp - Add missing bootloader info reg for pspv6 2025-06-13 17:26:16 +08:00
sp-platform.c crypto: drivers - Switch back to struct platform_driver::remove() 2024-10-19 08:44:30 +08:00
tee-dev.c crypto: ccp - Move direct access to some PSP registers out of TEE 2023-09-15 18:29:45 +08:00
tee-dev.h crypto: ccp - Move direct access to some PSP registers out of TEE 2023-09-15 18:29:45 +08:00