[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20240621123903.2411843-14-nikunj@amd.com>
Date: Fri, 21 Jun 2024 18:08:52 +0530
From: Nikunj A Dadhania <nikunj@....com>
To: <linux-kernel@...r.kernel.org>, <thomas.lendacky@....com>, <bp@...en8.de>,
<x86@...nel.org>, <kvm@...r.kernel.org>
CC: <mingo@...hat.com>, <tglx@...utronix.de>, <dave.hansen@...ux.intel.com>,
<pgonda@...gle.com>, <seanjc@...gle.com>, <pbonzini@...hat.com>,
<nikunj@....com>
Subject: [PATCH v10 13/24] x86/sev: Make sev-guest driver functional again
After the pure mechanical code movement of core SEV guest driver routines,
SEV guest driver is not yet functional. Export SNP guest messaging APIs for
the sev-guest driver. Drop the stubbed routines in sev-guest driver and use
the newly exported APIs
Signed-off-by: Nikunj A Dadhania <nikunj@....com>
---
arch/x86/include/asm/sev.h | 14 ++++++++++
arch/x86/coco/sev/core.c | 23 +++++++++------
drivers/virt/coco/sev-guest/sev-guest.c | 37 ++-----------------------
3 files changed, 31 insertions(+), 43 deletions(-)
diff --git a/arch/x86/include/asm/sev.h b/arch/x86/include/asm/sev.h
index f16dd1900206..cdd37ad9e4b8 100644
--- a/arch/x86/include/asm/sev.h
+++ b/arch/x86/include/asm/sev.h
@@ -441,6 +441,12 @@ u64 snp_get_unsupported_features(u64 status);
u64 sev_get_status(void);
void sev_show_status(void);
void snp_update_svsm_ca(void);
+bool snp_assign_vmpck(struct snp_guest_dev *snp_dev, unsigned int vmpck_id);
+bool snp_is_vmpck_empty(struct snp_guest_dev *snp_dev);
+int snp_guest_messaging_init(struct snp_guest_dev *snp_dev, u64 secrets_gpa);
+void snp_guest_messaging_exit(struct snp_guest_dev *snp_dev);
+int snp_send_guest_request(struct snp_guest_dev *snp_dev, struct snp_guest_req *req,
+ struct snp_guest_request_ioctl *rio);
static inline void free_shared_pages(void *buf, size_t sz)
{
@@ -511,6 +517,14 @@ static inline u64 snp_get_unsupported_features(u64 status) { return 0; }
static inline u64 sev_get_status(void) { return 0; }
static inline void sev_show_status(void) { }
static inline void snp_update_svsm_ca(void) { }
+static inline bool snp_assign_vmpck(struct snp_guest_dev *snp_dev,
+ unsigned int vmpck_id) { return false; }
+static inline bool snp_is_vmpck_empty(struct snp_guest_dev *snp_dev) { return true; }
+static inline int
+snp_guest_messaging_init(struct snp_guest_dev *snp_dev, u64 secrets_gpa) { return -EINVAL; }
+static inline void snp_guest_messaging_exit(struct snp_guest_dev *snp_dev) { }
+static inline int snp_send_guest_request(struct snp_guest_dev *snp_dev, struct snp_guest_req *req,
+ struct snp_guest_request_ioctl *rio) { return -EINVAL; }
static inline void free_shared_pages(void *buf, size_t sz) { }
static inline void *alloc_shared_pages(size_t sz) { return NULL; }
diff --git a/arch/x86/coco/sev/core.c b/arch/x86/coco/sev/core.c
index 5f5339eda4a9..9f0f8819529c 100644
--- a/arch/x86/coco/sev/core.c
+++ b/arch/x86/coco/sev/core.c
@@ -2614,7 +2614,7 @@ static inline u8 *get_vmpck(struct snp_guest_dev *snp_dev)
return snp_dev->secrets->vmpck[snp_dev->vmpck_id];
}
-static bool __maybe_unused assign_vmpck(struct snp_guest_dev *dev, unsigned int vmpck_id)
+bool snp_assign_vmpck(struct snp_guest_dev *dev, unsigned int vmpck_id)
{
if (!(vmpck_id < VMPCK_MAX_NUM))
return false;
@@ -2623,14 +2623,16 @@ static bool __maybe_unused assign_vmpck(struct snp_guest_dev *dev, unsigned int
return true;
}
+EXPORT_SYMBOL_GPL(snp_assign_vmpck);
-static bool is_vmpck_empty(struct snp_guest_dev *snp_dev)
+bool snp_is_vmpck_empty(struct snp_guest_dev *snp_dev)
{
char zero_key[VMPCK_KEY_LEN] = {0};
u8 *key = get_vmpck(snp_dev);
return !memcmp(key, zero_key, VMPCK_KEY_LEN);
}
+EXPORT_SYMBOL_GPL(snp_is_vmpck_empty);
/*
* If an error is received from the host or AMD Secure Processor (ASP) there
@@ -2653,7 +2655,7 @@ static void snp_disable_vmpck(struct snp_guest_dev *snp_dev)
{
u8 *key = get_vmpck(snp_dev);
- if (is_vmpck_empty(snp_dev))
+ if (snp_is_vmpck_empty(snp_dev))
return;
pr_alert("Disabling VMPCK%u communication key to prevent IV reuse.\n", snp_dev->vmpck_id);
@@ -2697,7 +2699,7 @@ static struct aesgcm_ctx *snp_init_crypto(struct snp_guest_dev *snp_dev)
struct aesgcm_ctx *ctx;
u8 *key;
- if (is_vmpck_empty(snp_dev)) {
+ if (snp_is_vmpck_empty(snp_dev)) {
pr_err("VM communication key VMPCK%u is invalid\n", snp_dev->vmpck_id);
return NULL;
}
@@ -2878,9 +2880,9 @@ static int __handle_guest_request(struct snp_guest_dev *snp_dev, struct snp_gues
return rc;
}
-static int __maybe_unused snp_send_guest_request(struct snp_guest_dev *snp_dev,
- struct snp_guest_req *req,
- struct snp_guest_request_ioctl *rio)
+int snp_send_guest_request(struct snp_guest_dev *snp_dev,
+ struct snp_guest_req *req,
+ struct snp_guest_request_ioctl *rio)
{
u64 seqno;
int rc;
@@ -2927,8 +2929,9 @@ static int __maybe_unused snp_send_guest_request(struct snp_guest_dev *snp_dev,
return 0;
}
+EXPORT_SYMBOL_GPL(snp_send_guest_request);
-static int __maybe_unused snp_guest_messaging_init(struct snp_guest_dev *snp_dev, u64 secrets_gpa)
+int snp_guest_messaging_init(struct snp_guest_dev *snp_dev, u64 secrets_gpa)
{
int ret = -ENOMEM;
@@ -2982,8 +2985,9 @@ static int __maybe_unused snp_guest_messaging_init(struct snp_guest_dev *snp_dev
return ret;
}
+EXPORT_SYMBOL_GPL(snp_guest_messaging_init);
-static void __maybe_unused snp_guest_messaging_exit(struct snp_guest_dev *snp_dev)
+void snp_guest_messaging_exit(struct snp_guest_dev *snp_dev)
{
if (!snp_dev)
return;
@@ -2995,3 +2999,4 @@ static void __maybe_unused snp_guest_messaging_exit(struct snp_guest_dev *snp_de
kfree(snp_dev->secret_request);
iounmap(snp_dev->secrets);
}
+EXPORT_SYMBOL_GPL(snp_guest_messaging_exit);
diff --git a/drivers/virt/coco/sev-guest/sev-guest.c b/drivers/virt/coco/sev-guest/sev-guest.c
index 228bf0db93b3..0631271e5b9c 100644
--- a/drivers/virt/coco/sev-guest/sev-guest.c
+++ b/drivers/virt/coco/sev-guest/sev-guest.c
@@ -44,12 +44,6 @@ static u32 vmpck_id = VMPCK_MAX_NUM;
module_param(vmpck_id, uint, 0444);
MODULE_PARM_DESC(vmpck_id, "The VMPCK ID to use when communicating with the PSP.");
-static bool is_vmpck_empty(struct snp_guest_dev *snp_dev)
-{
- /* Place holder function to be removed after code movement */
- return true;
-}
-
static inline struct snp_guest_dev *to_snp_dev(struct file *file)
{
struct miscdevice *dev = file->private_data;
@@ -57,13 +51,6 @@ static inline struct snp_guest_dev *to_snp_dev(struct file *file)
return container_of(dev, struct snp_guest_dev, misc);
}
-static int snp_send_guest_request(struct snp_guest_dev *snp_dev, struct snp_guest_req *req,
- struct snp_guest_request_ioctl *rio)
-{
- /* Place holder function to be removed after code movement */
- return -EIO;
-}
-
struct snp_req_resp {
sockptr_t req_data;
sockptr_t resp_data;
@@ -268,7 +255,7 @@ static long snp_guest_ioctl(struct file *file, unsigned int ioctl, unsigned long
return -EINVAL;
/* Check if the VMPCK is not empty */
- if (is_vmpck_empty(snp_dev)) {
+ if (snp_is_vmpck_empty(snp_dev)) {
dev_err_ratelimited(snp_dev->dev, "VMPCK is disabled\n");
return -ENOTTY;
}
@@ -305,12 +292,6 @@ static const struct file_operations snp_guest_fops = {
.unlocked_ioctl = snp_guest_ioctl,
};
-static bool assign_vmpck(struct snp_guest_dev *dev, unsigned int vmpck_id)
-{
- /* Place holder function to be removed after code movement */
- return false;
-}
-
struct snp_msg_report_resp_hdr {
u32 status;
u32 report_size;
@@ -484,7 +465,7 @@ static int sev_report_new(struct tsm_report *report, void *data)
return -ENOMEM;
/* Check if the VMPCK is not empty */
- if (is_vmpck_empty(snp_dev)) {
+ if (snp_is_vmpck_empty(snp_dev)) {
dev_err_ratelimited(snp_dev->dev, "VMPCK is disabled\n");
return -ENOTTY;
}
@@ -608,18 +589,6 @@ static void unregister_sev_tsm(void *data)
tsm_unregister(&sev_tsm_ops);
}
-static int snp_guest_messaging_init(struct snp_guest_dev *snp_dev, u64 secrets_gpa)
-{
- /* Place holder function to be removed after code movement */
- return 0;
-}
-
-static void snp_guest_messaging_exit(struct snp_guest_dev *snp_dev)
-{
- /* Place holder function to be removed after code movement */
- return;
-}
-
static int __init sev_guest_probe(struct platform_device *pdev)
{
struct sev_guest_platform_data *data;
@@ -645,7 +614,7 @@ static int __init sev_guest_probe(struct platform_device *pdev)
vmpck_id = snp_vmpl;
ret = -EINVAL;
- if (!assign_vmpck(snp_dev, vmpck_id)) {
+ if (!snp_assign_vmpck(snp_dev, vmpck_id)) {
dev_err(dev, "Invalid VMPCK%d communication key\n", vmpck_id);
return ret;
}
--
2.34.1
Powered by blists - more mailing lists