[SeaBIOS] [PATCH 5/8] tpm: Avoid scatter-gather copying in build_and_send_cmd()
Kevin O'Connor
kevin at koconnor.net
Mon Nov 23 02:02:35 CET 2015
Setup the tpm hardware request in a linear area of memory.
Signed-off-by: Kevin O'Connor <kevin at koconnor.net>
---
src/tcgbios.c | 37 +++++++++++++++++--------------------
1 file changed, 17 insertions(+), 20 deletions(-)
diff --git a/src/tcgbios.c b/src/tcgbios.c
index e7adf3f..d4f6288 100644
--- a/src/tcgbios.c
+++ b/src/tcgbios.c
@@ -331,33 +331,30 @@ build_and_send_cmd(u8 locty, u32 ordinal, const u8 *append, u32 append_size,
u8 *resbuffer, u32 return_size, u32 *returnCode,
enum tpmDurationType to_t)
{
- u32 rc;
+ struct {
+ struct tpm_req_header trqh;
+ u8 cmd[64];
+ } PACKED req = {
+ .trqh.tag = cpu_to_be16(TPM_TAG_RQU_CMD),
+ .trqh.totlen = cpu_to_be32(TPM_REQ_HEADER_SIZE + append_size),
+ .trqh.ordinal = cpu_to_be32(ordinal),
+ };
u8 obuffer[64];
- struct tpm_req_header trqh;
struct tpm_rsp_header *trsh = (struct tpm_rsp_header *)obuffer;
- struct iovec iovec[3] = {{ 0 }};
u32 obuffer_len = sizeof(obuffer);
+ memset(obuffer, 0x0, sizeof(obuffer));
- if (return_size > sizeof(obuffer)) {
- dprintf(DEBUG_tcg, "TCGBIOS: size of requested response too big.");
+ if (return_size > sizeof(obuffer) || append_size > sizeof(req.cmd)) {
+ warn_internalerror();
return TCG_FIRMWARE_ERROR;
}
+ if (append_size)
+ memcpy(req.cmd, append, append_size);
- trqh.tag = cpu_to_be16(TPM_TAG_RQU_CMD);
- trqh.totlen = cpu_to_be32(TPM_REQ_HEADER_SIZE + append_size);
- trqh.ordinal = cpu_to_be32(ordinal);
-
- iovec[0].data = &trqh;
- iovec[0].length = TPM_REQ_HEADER_SIZE;
-
- if (append_size) {
- iovec[1].data = append;
- iovec[1].length = append_size;
- }
-
- memset(obuffer, 0x0, sizeof(obuffer));
-
- rc = transmit(locty, iovec, obuffer, &obuffer_len, to_t);
+ struct iovec iovec[2] = {{ 0 }};
+ iovec[0].data = &req;
+ iovec[0].length = TPM_REQ_HEADER_SIZE + append_size;
+ u32 rc = transmit(locty, iovec, obuffer, &obuffer_len, to_t);
if (rc)
return rc;
--
2.5.0
More information about the SeaBIOS
mailing list