aboutsummaryrefslogtreecommitdiffstats
path: root/meta/recipes-devtools/qemu/qemu/0009-tpm-passthrough-move-reusable-code-to-utils.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta/recipes-devtools/qemu/qemu/0009-tpm-passthrough-move-reusable-code-to-utils.patch')
-rw-r--r--meta/recipes-devtools/qemu/qemu/0009-tpm-passthrough-move-reusable-code-to-utils.patch182
1 files changed, 182 insertions, 0 deletions
diff --git a/meta/recipes-devtools/qemu/qemu/0009-tpm-passthrough-move-reusable-code-to-utils.patch b/meta/recipes-devtools/qemu/qemu/0009-tpm-passthrough-move-reusable-code-to-utils.patch
new file mode 100644
index 0000000000..8670b8a0d3
--- /dev/null
+++ b/meta/recipes-devtools/qemu/qemu/0009-tpm-passthrough-move-reusable-code-to-utils.patch
@@ -0,0 +1,182 @@
+From b8322aaa2f31995e1b7b776e7efae68416573bc3 Mon Sep 17 00:00:00 2001
+From: Amarnath Valluri <amarnath.valluri@intel.com>
+Date: Wed, 29 Mar 2017 15:36:47 +0300
+Subject: [PATCH 09/12] tpm-passthrough: move reusable code to utils
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Signed-off-by: Amarnath Valluri <amarnath.valluri@intel.com>
+Reviewed-by: Stefan Berger <stefanb@linux.vnet.ibm.com>
+Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
+
+Upstream-Status: Backport [4a3d80980ebf71d8faf9d0ce2e2e23bdda5728df]
+---
+ hw/tpm/tpm_passthrough.c | 64 ++++--------------------------------------------
+ hw/tpm/tpm_util.c | 25 +++++++++++++++++++
+ hw/tpm/tpm_util.h | 4 +++
+ 3 files changed, 34 insertions(+), 59 deletions(-)
+
+diff --git a/hw/tpm/tpm_passthrough.c b/hw/tpm/tpm_passthrough.c
+index 22d3460550..e6ace28b04 100644
+--- a/hw/tpm/tpm_passthrough.c
++++ b/hw/tpm/tpm_passthrough.c
+@@ -68,27 +68,6 @@ typedef struct TPMPassthruState TPMPassthruState;
+
+ static void tpm_passthrough_cancel_cmd(TPMBackend *tb);
+
+-static int tpm_passthrough_unix_write(int fd, const uint8_t *buf, uint32_t len)
+-{
+- int ret, remain;
+-
+- remain = len;
+- while (remain > 0) {
+- ret = write(fd, buf, remain);
+- if (ret < 0) {
+- if (errno != EINTR && errno != EAGAIN) {
+- return -1;
+- }
+- } else if (ret == 0) {
+- break;
+- } else {
+- buf += ret;
+- remain -= ret;
+- }
+- }
+- return len - remain;
+-}
+-
+ static int tpm_passthrough_unix_read(int fd, uint8_t *buf, uint32_t len)
+ {
+ int ret;
+@@ -102,45 +81,12 @@ static int tpm_passthrough_unix_read(int fd, uint8_t *buf, uint32_t len)
+ }
+ return ret;
+ }
+-
+-static uint32_t tpm_passthrough_get_size_from_buffer(const uint8_t *buf)
+-{
+- struct tpm_resp_hdr *resp = (struct tpm_resp_hdr *)buf;
+-
+- return be32_to_cpu(resp->len);
+-}
+-
+-/*
+- * Write an error message in the given output buffer.
+- */
+-static void tpm_write_fatal_error_response(uint8_t *out, uint32_t out_len)
+-{
+- if (out_len >= sizeof(struct tpm_resp_hdr)) {
+- struct tpm_resp_hdr *resp = (struct tpm_resp_hdr *)out;
+-
+- resp->tag = cpu_to_be16(TPM_TAG_RSP_COMMAND);
+- resp->len = cpu_to_be32(sizeof(struct tpm_resp_hdr));
+- resp->errcode = cpu_to_be32(TPM_FAIL);
+- }
+-}
+-
+-static bool tpm_passthrough_is_selftest(const uint8_t *in, uint32_t in_len)
+-{
+- struct tpm_req_hdr *hdr = (struct tpm_req_hdr *)in;
+-
+- if (in_len >= sizeof(*hdr)) {
+- return (be32_to_cpu(hdr->ordinal) == TPM_ORD_ContinueSelfTest);
+- }
+-
+- return false;
+-}
+-
+ static int tpm_passthrough_unix_tx_bufs(TPMPassthruState *tpm_pt,
+ const uint8_t *in, uint32_t in_len,
+ uint8_t *out, uint32_t out_len,
+ bool *selftest_done)
+ {
+- int ret;
++ ssize_t ret;
+ bool is_selftest;
+ const struct tpm_resp_hdr *hdr;
+
+@@ -148,9 +94,9 @@ static int tpm_passthrough_unix_tx_bufs(TPMPassthruState *tpm_pt,
+ tpm_pt->tpm_executing = true;
+ *selftest_done = false;
+
+- is_selftest = tpm_passthrough_is_selftest(in, in_len);
++ is_selftest = tpm_util_is_selftest(in, in_len);
+
+- ret = tpm_passthrough_unix_write(tpm_pt->tpm_fd, in, in_len);
++ ret = qemu_write_full(tpm_pt->tpm_fd, (const void *)in, (size_t)in_len);
+ if (ret != in_len) {
+ if (!tpm_pt->tpm_op_canceled || errno != ECANCELED) {
+ error_report("tpm_passthrough: error while transmitting data "
+@@ -170,7 +116,7 @@ static int tpm_passthrough_unix_tx_bufs(TPMPassthruState *tpm_pt,
+ strerror(errno), errno);
+ }
+ } else if (ret < sizeof(struct tpm_resp_hdr) ||
+- tpm_passthrough_get_size_from_buffer(out) != ret) {
++ be32_to_cpu(((struct tpm_resp_hdr *)out)->len) != ret) {
+ ret = -1;
+ error_report("tpm_passthrough: received invalid response "
+ "packet from TPM");
+@@ -183,7 +129,7 @@ static int tpm_passthrough_unix_tx_bufs(TPMPassthruState *tpm_pt,
+
+ err_exit:
+ if (ret < 0) {
+- tpm_write_fatal_error_response(out, out_len);
++ tpm_util_write_fatal_error_response(out, out_len);
+ }
+
+ tpm_pt->tpm_executing = false;
+diff --git a/hw/tpm/tpm_util.c b/hw/tpm/tpm_util.c
+index 7b35429725..fb929f6e92 100644
+--- a/hw/tpm/tpm_util.c
++++ b/hw/tpm/tpm_util.c
+@@ -24,6 +24,31 @@
+ #include "tpm_int.h"
+
+ /*
++ * Write an error message in the given output buffer.
++ */
++void tpm_util_write_fatal_error_response(uint8_t *out, uint32_t out_len)
++{
++ if (out_len >= sizeof(struct tpm_resp_hdr)) {
++ struct tpm_resp_hdr *resp = (struct tpm_resp_hdr *)out;
++
++ resp->tag = cpu_to_be16(TPM_TAG_RSP_COMMAND);
++ resp->len = cpu_to_be32(sizeof(struct tpm_resp_hdr));
++ resp->errcode = cpu_to_be32(TPM_FAIL);
++ }
++}
++
++bool tpm_util_is_selftest(const uint8_t *in, uint32_t in_len)
++{
++ struct tpm_req_hdr *hdr = (struct tpm_req_hdr *)in;
++
++ if (in_len >= sizeof(*hdr)) {
++ return (be32_to_cpu(hdr->ordinal) == TPM_ORD_ContinueSelfTest);
++ }
++
++ return false;
++}
++
++/*
+ * A basic test of a TPM device. We expect a well formatted response header
+ * (error response is fine) within one second.
+ */
+diff --git a/hw/tpm/tpm_util.h b/hw/tpm/tpm_util.h
+index df76245e6e..2f7c96146d 100644
+--- a/hw/tpm/tpm_util.h
++++ b/hw/tpm/tpm_util.h
+@@ -24,6 +24,10 @@
+
+ #include "sysemu/tpm_backend.h"
+
++void tpm_util_write_fatal_error_response(uint8_t *out, uint32_t out_len);
++
++bool tpm_util_is_selftest(const uint8_t *in, uint32_t in_len);
++
+ int tpm_util_test_tpmdev(int tpm_fd, TPMVersion *tpm_version);
+
+ #endif /* TPM_TPM_UTIL_H */
+--
+2.11.0
+