From aff0badb4f2ace3fd6e5d3c5781f3e951ee21b34 Mon Sep 17 00:00:00 2001 From: Elliot Berman Date: Tue, 17 Mar 2020 11:16:57 -0700 Subject: [PATCH] haven: rm: Clean VM Services - Console APIs Standard replies are handled by hh_rm_call() and not by client driver. Thus, clean console APIs to handle hh_rm_call() response accordingly. Change-Id: I9bc49f15e33260a5fe539b141e311fa071e49211 Signed-off-by: Elliot Berman --- drivers/virt/haven/hh_rm_drv_private.h | 8 -- drivers/virt/haven/hh_rm_iface.c | 136 +++++++++++++------------ 2 files changed, 73 insertions(+), 71 deletions(-) diff --git a/drivers/virt/haven/hh_rm_drv_private.h b/drivers/virt/haven/hh_rm_drv_private.h index b71d59353559..8f68668630c8 100644 --- a/drivers/virt/haven/hh_rm_drv_private.h +++ b/drivers/virt/haven/hh_rm_drv_private.h @@ -118,10 +118,6 @@ struct hh_vm_console_common_req_payload { u32 reserved0; } __packed; -struct hh_vm_console_common_resp_payload { - u32 response; -} __packed; - /* Call: CONSOLE_WRITE */ struct hh_vm_console_write_req_payload { u32 vmid; @@ -129,10 +125,6 @@ struct hh_vm_console_write_req_payload { u8 data[0]; } __packed; -struct hh_vm_console_write_resp_payload { - u32 response; -} __packed; - /* Message ID headers */ /* Call: VM_GET_HYP_RESOURCES */ #define HH_RM_RES_TYPE_DB_TX 0 diff --git a/drivers/virt/haven/hh_rm_iface.c b/drivers/virt/haven/hh_rm_iface.c index 4d155bf971fc..619145389cac 100644 --- a/drivers/virt/haven/hh_rm_iface.c +++ b/drivers/virt/haven/hh_rm_iface.c @@ -426,33 +426,35 @@ EXPORT_SYMBOL(hh_rm_vm_start); */ int hh_rm_console_open(hh_vmid_t vmid) { - struct hh_vm_console_common_resp_payload *resp_payload; + void *resp; struct hh_vm_console_common_req_payload req_payload = {0}; size_t resp_payload_size; - int err = 0, reply_err_code = 0; + int reply_err_code = 0; req_payload.vmid = vmid; - resp_payload = hh_rm_call(HH_RM_RPC_MSG_ID_CALL_VM_CONSOLE_OPEN, - &req_payload, sizeof(req_payload), - &resp_payload_size, &reply_err_code); - if (reply_err_code || IS_ERR_OR_NULL(resp_payload)) { - err = PTR_ERR(resp_payload); - pr_err("%s: CONSOLE_OPEN failed with err: %d\n", - __func__, err); - goto out; + resp = hh_rm_call(HH_RM_RPC_MSG_ID_CALL_VM_CONSOLE_OPEN, + &req_payload, sizeof(req_payload), + &resp_payload_size, &reply_err_code); + if (IS_ERR(resp)) { + pr_err("%s: Unable to send CONSOLE_OPEN to RM: %d\n", __func__, + PTR_ERR(resp)); + return PTR_ERR(resp); } - if (resp_payload_size != sizeof(*resp_payload)) { + if (reply_err_code) { + pr_err("%s: CONSOLE_OPEN returned error: %d\n", __func__, + reply_err_code); + return reply_err_code; + } + + if (resp_payload_size) { pr_err("%s: Invalid size received for CONSOLE_OPEN: %u\n", __func__, resp_payload_size); - err = -EINVAL; + return -EINVAL; } - err = err ? : resp_payload->response; - kfree(resp_payload); -out: - return err; + return 0; } EXPORT_SYMBOL(hh_rm_console_open); @@ -462,33 +464,35 @@ EXPORT_SYMBOL(hh_rm_console_open); */ int hh_rm_console_close(hh_vmid_t vmid) { - struct hh_vm_console_common_resp_payload *resp_payload; + void *resp; struct hh_vm_console_common_req_payload req_payload = {0}; size_t resp_payload_size; - int err = 0, reply_err_code = 0; + int reply_err_code = 0; req_payload.vmid = vmid; - resp_payload = hh_rm_call(HH_RM_RPC_MSG_ID_CALL_VM_CONSOLE_CLOSE, - &req_payload, sizeof(req_payload), - &resp_payload_size, &reply_err_code); - if (reply_err_code || IS_ERR_OR_NULL(resp_payload)) { - err = PTR_ERR(resp_payload); - pr_err("%s: CONSOLE_CLOSE failed with err: %d\n", - __func__, err); - goto out; + resp = hh_rm_call(HH_RM_RPC_MSG_ID_CALL_VM_CONSOLE_CLOSE, + &req_payload, sizeof(req_payload), + &resp_payload_size, &reply_err_code); + if (IS_ERR(resp)) { + pr_err("%s: Unable to send CONSOLE_CLOSE to RM: %d\n", __func__, + PTR_ERR(resp)); + return PTR_ERR(resp); } - if (resp_payload_size != sizeof(*resp_payload)) { + if (reply_err_code) { + pr_err("%s: CONSOLE_CLOSE returned error: %d\n", __func__, + reply_err_code); + return reply_err_code; + } + + if (resp_payload_size) { pr_err("%s: Invalid size received for CONSOLE_CLOSE: %u\n", __func__, resp_payload_size); - err = -EINVAL; + return -EINVAL; } - err = err ? : resp_payload->response; - kfree(resp_payload); -out: - return err; + return 0; } EXPORT_SYMBOL(hh_rm_console_close); @@ -500,10 +504,10 @@ EXPORT_SYMBOL(hh_rm_console_close); */ int hh_rm_console_write(hh_vmid_t vmid, const char *buf, size_t size) { - struct hh_vm_console_write_resp_payload *resp_payload; + void *resp; struct hh_vm_console_write_req_payload *req_payload; size_t resp_payload_size; - int err = 0, reply_err_code = 0; + int reply_err_code = 0; size_t req_payload_size = sizeof(*req_payload) + size; if (size < 1 || size > U32_MAX) @@ -518,27 +522,30 @@ int hh_rm_console_write(hh_vmid_t vmid, const char *buf, size_t size) req_payload->num_bytes = size; memcpy(req_payload->data, buf, size); - resp_payload = hh_rm_call(HH_RM_RPC_MSG_ID_CALL_VM_CONSOLE_WRITE, - req_payload, req_payload_size, - &resp_payload_size, &reply_err_code); - if (reply_err_code || IS_ERR_OR_NULL(resp_payload)) { - err = PTR_ERR(resp_payload); - pr_err("%s: CONSOLE_WRITE failed with err: %d\n", - __func__, err); - goto out; + resp = hh_rm_call(HH_RM_RPC_MSG_ID_CALL_VM_CONSOLE_WRITE, + req_payload, req_payload_size, + &resp_payload_size, &reply_err_code); + kfree(req_payload); + + if (IS_ERR(resp)) { + pr_err("%s: Unable to send CONSOLE_WRITE to RM: %d\n", __func__, + PTR_ERR(resp)); + return PTR_ERR(resp); } - if (resp_payload_size != sizeof(*resp_payload)) { + if (reply_err_code) { + pr_err("%s: CONSOLE_WRITE returned error: %d\n", __func__, + reply_err_code); + return reply_err_code; + } + + if (resp_payload_size) { pr_err("%s: Invalid size received for CONSOLE_WRITE: %u\n", __func__, resp_payload_size); - err = -EINVAL; + return -EINVAL; } - err = err ? : resp_payload->response; - kfree(resp_payload); -out: - kfree(req_payload); - return err; + return 0; } EXPORT_SYMBOL(hh_rm_console_write); @@ -548,33 +555,36 @@ EXPORT_SYMBOL(hh_rm_console_write); */ int hh_rm_console_flush(hh_vmid_t vmid) { - struct hh_vm_console_common_resp_payload *resp_payload; + void *resp; struct hh_vm_console_common_req_payload req_payload = {0}; size_t resp_payload_size; - int err = 0, reply_err_code = 0; + int reply_err_code = 0; req_payload.vmid = vmid; - resp_payload = hh_rm_call(HH_RM_RPC_MSG_ID_CALL_VM_CONSOLE_FLUSH, + resp = hh_rm_call(HH_RM_RPC_MSG_ID_CALL_VM_CONSOLE_FLUSH, &req_payload, sizeof(req_payload), &resp_payload_size, &reply_err_code); - if (reply_err_code || IS_ERR_OR_NULL(resp_payload)) { - err = PTR_ERR(resp_payload); - pr_err("%s: CONSOLE_FLUSH failed with err: %d\n", - __func__, err); - goto out; + + if (IS_ERR(resp)) { + pr_err("%s: Unable to send CONSOLE_FLUSH to RM: %d\n", __func__, + PTR_ERR(resp)); + return PTR_ERR(resp); } - if (resp_payload_size != sizeof(*resp_payload)) { + if (reply_err_code) { + pr_err("%s: CONSOLE_FLUSH returned error: %d\n", __func__, + reply_err_code); + return reply_err_code; + } + + if (resp_payload_size) { pr_err("%s: Invalid size received for CONSOLE_FLUSH: %u\n", __func__, resp_payload_size); - err = -EINVAL; + return -EINVAL; } - err = err ? : resp_payload->response; - kfree(resp_payload); -out: - return err; + return 0; } EXPORT_SYMBOL(hh_rm_console_flush);