summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/lib/tpm2_marshaling.c11
-rw-r--r--src/lib/tpm2_tlcl.c13
2 files changed, 15 insertions, 9 deletions
diff --git a/src/lib/tpm2_marshaling.c b/src/lib/tpm2_marshaling.c
index ab9a928444..f4fd3cbc76 100644
--- a/src/lib/tpm2_marshaling.c
+++ b/src/lib/tpm2_marshaling.c
@@ -4,6 +4,7 @@
* found in the LICENSE file.
*/
+#include <arch/early_variables.h>
#include <commonlib/endian.h>
#include <console/console.h>
#include <stdlib.h>
@@ -11,7 +12,7 @@
#include "tpm2_marshaling.h"
-static uint16_t tpm_tag; /* Depends on the command type. */
+static uint16_t tpm_tag CAR_GLOBAL; /* Depends on the command type. */
/*
* Each unmarshaling function receives a pointer to the buffer pointer and a
@@ -268,7 +269,7 @@ static void marshal_common_session_header(void **buffer,
int i;
struct tpm2_session_header session_header;
- tpm_tag = TPM_ST_SESSIONS;
+ car_set_var(tpm_tag, TPM_ST_SESSIONS);
for (i = 0; i < handle_count; i++)
marshal_TPM_HANDLE(buffer, handles[i], buffer_space);
@@ -380,7 +381,7 @@ int tpm_marshal_command(TPM_CC command, void *tpm_command_body,
size_t body_size = max_body_size;
/* Will be modified when marshaling some commands. */
- tpm_tag = TPM_ST_NO_SESSIONS;
+ car_set_var(tpm_tag, TPM_ST_NO_SESSIONS);
switch (command) {
case TPM2_Startup:
@@ -437,7 +438,9 @@ int tpm_marshal_command(TPM_CC command, void *tpm_command_body,
/* Total size includes the header size. */
marshaled_size += sizeof(struct tpm_header);
- marshal_u16(&buffer, tpm_tag, &header_room);
+ uint16_t tpm_tag_value = car_get_var(tpm_tag);
+
+ marshal_u16(&buffer, tpm_tag_value, &header_room);
marshal_u32(&buffer, marshaled_size, &header_room);
marshal_u32(&buffer, command, &header_room);
return marshaled_size;
diff --git a/src/lib/tpm2_tlcl.c b/src/lib/tpm2_tlcl.c
index c8e7e90e7b..7bfd40d810 100644
--- a/src/lib/tpm2_tlcl.c
+++ b/src/lib/tpm2_tlcl.c
@@ -4,6 +4,7 @@
* found in the LICENSE file.
*/
+#include <arch/early_variables.h>
#include <console/console.h>
#include <endian.h>
#include <lib/tpm2_tlcl_structures.h>
@@ -24,10 +25,12 @@ static void *tpm_process_command(TPM_CC command, void *command_body)
ssize_t out_size;
size_t in_size;
/* Command/response buffer. */
- static uint8_t cr_buffer[TPM_BUFFER_SIZE];
+ static uint8_t cr_buffer[TPM_BUFFER_SIZE] CAR_GLOBAL;
+
+ uint8_t *cr_buffer_ptr = car_get_var_ptr(cr_buffer);
out_size = tpm_marshal_command(command, command_body,
- cr_buffer, sizeof(cr_buffer));
+ cr_buffer_ptr, sizeof(cr_buffer));
if (out_size < 0) {
printk(BIOS_ERR, "command %#x, cr size %zd\n",
command, out_size);
@@ -35,13 +38,13 @@ static void *tpm_process_command(TPM_CC command, void *command_body)
}
in_size = sizeof(cr_buffer);
- if (tis_sendrecv(cr_buffer, out_size,
- cr_buffer, &in_size)) {
+ if (tis_sendrecv(cr_buffer_ptr, out_size,
+ cr_buffer_ptr, &in_size)) {
printk(BIOS_ERR, "tpm transaction failed\n");
return NULL;
}
- return tpm_unmarshal_response(command, cr_buffer, in_size);
+ return tpm_unmarshal_response(command, cr_buffer_ptr, in_size);
}