From b8d44ab8febf8b9fe96644bc679bdd3cb75f83ff Mon Sep 17 00:00:00 2001 From: Stefan Berger Date: Thu, 1 Feb 2018 17:55:50 -0500 Subject: tpm: Split off tpm_crb_reset function MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Split off the tpm_crb_reset function part from tpm_crb_realize that we need to run every time the machine resets. Also register our reset function with the system since TYPE_DEVICE seems to not get a reset otherwise. Signed-off-by: Stefan Berger Reviewed-by: Marc-André Lureau --- hw/tpm/tpm_crb.c | 48 ++++++++++++++++++++++++++++-------------------- 1 file changed, 28 insertions(+), 20 deletions(-) (limited to 'hw') diff --git a/hw/tpm/tpm_crb.c b/hw/tpm/tpm_crb.c index 687d255..b5b8256 100644 --- a/hw/tpm/tpm_crb.c +++ b/hw/tpm/tpm_crb.c @@ -26,6 +26,7 @@ #include "hw/acpi/tpm.h" #include "migration/vmstate.h" #include "sysemu/tpm_backend.h" +#include "sysemu/reset.h" #include "tpm_int.h" #include "tpm_util.h" @@ -210,29 +211,10 @@ static Property tpm_crb_properties[] = { DEFINE_PROP_END_OF_LIST(), }; -static void tpm_crb_realize(DeviceState *dev, Error **errp) +static void tpm_crb_reset(void *dev) { CRBState *s = CRB(dev); - if (!tpm_find()) { - error_setg(errp, "at most one TPM device is permitted"); - return; - } - if (!s->tpmbe) { - error_setg(errp, "'tpmdev' property is required"); - return; - } - - memory_region_init_io(&s->mmio, OBJECT(s), &tpm_crb_memory_ops, s, - "tpm-crb-mmio", sizeof(s->regs)); - memory_region_init_ram(&s->cmdmem, OBJECT(s), - "tpm-crb-cmd", CRB_CTRL_CMD_SIZE, errp); - - memory_region_add_subregion(get_system_memory(), - TPM_CRB_ADDR_BASE, &s->mmio); - memory_region_add_subregion(get_system_memory(), - TPM_CRB_ADDR_BASE + sizeof(s->regs), &s->cmdmem); - tpm_backend_reset(s->tpmbe); ARRAY_FIELD_DP32(s->regs, CRB_INTF_ID, @@ -267,6 +249,32 @@ static void tpm_crb_realize(DeviceState *dev, Error **errp) tpm_backend_startup_tpm(s->tpmbe, s->be_buffer_size); } +static void tpm_crb_realize(DeviceState *dev, Error **errp) +{ + CRBState *s = CRB(dev); + + if (!tpm_find()) { + error_setg(errp, "at most one TPM device is permitted"); + return; + } + if (!s->tpmbe) { + error_setg(errp, "'tpmdev' property is required"); + return; + } + + memory_region_init_io(&s->mmio, OBJECT(s), &tpm_crb_memory_ops, s, + "tpm-crb-mmio", sizeof(s->regs)); + memory_region_init_ram(&s->cmdmem, OBJECT(s), + "tpm-crb-cmd", CRB_CTRL_CMD_SIZE, errp); + + memory_region_add_subregion(get_system_memory(), + TPM_CRB_ADDR_BASE, &s->mmio); + memory_region_add_subregion(get_system_memory(), + TPM_CRB_ADDR_BASE + sizeof(s->regs), &s->cmdmem); + + qemu_register_reset(tpm_crb_reset, dev); +} + static void tpm_crb_class_init(ObjectClass *klass, void *data) { DeviceClass *dc = DEVICE_CLASS(klass); -- cgit v1.1 From a35e15dca3e0654211803cdac39b2603908457f4 Mon Sep 17 00:00:00 2001 From: Stefan Berger Date: Thu, 1 Feb 2018 18:05:10 -0500 Subject: tpm: wrap stX_be_p in tpm_cmd_set_XYZ functions MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Wrap the calls to stl_be_p and stw_be_p in tpm_cmd_set_XYZ functions that are similar to existing getters. Signed-off-by: Stefan Berger Reviewed-by: Marc-André Lureau --- hw/tpm/tpm_util.c | 6 +++--- hw/tpm/tpm_util.h | 15 +++++++++++++++ 2 files changed, 18 insertions(+), 3 deletions(-) (limited to 'hw') diff --git a/hw/tpm/tpm_util.c b/hw/tpm/tpm_util.c index 8abde59..2de52a0 100644 --- a/hw/tpm/tpm_util.c +++ b/hw/tpm/tpm_util.c @@ -106,9 +106,9 @@ const PropertyInfo qdev_prop_tpm = { void tpm_util_write_fatal_error_response(uint8_t *out, uint32_t out_len) { if (out_len >= sizeof(struct tpm_resp_hdr)) { - stw_be_p(out, TPM_TAG_RSP_COMMAND); - stl_be_p(out + 2, sizeof(struct tpm_resp_hdr)); - stl_be_p(out + 6, TPM_FAIL); + tpm_cmd_set_tag(out, TPM_TAG_RSP_COMMAND); + tpm_cmd_set_size(out, sizeof(struct tpm_resp_hdr)); + tpm_cmd_set_error(out, TPM_FAIL); } } diff --git a/hw/tpm/tpm_util.h b/hw/tpm/tpm_util.h index f003d15..f397ac2 100644 --- a/hw/tpm/tpm_util.h +++ b/hw/tpm/tpm_util.h @@ -36,11 +36,21 @@ static inline uint16_t tpm_cmd_get_tag(const void *b) return lduw_be_p(b); } +static inline void tpm_cmd_set_tag(void *b, uint16_t tag) +{ + stw_be_p(b, tag); +} + static inline uint32_t tpm_cmd_get_size(const void *b) { return ldl_be_p(b + 2); } +static inline void tpm_cmd_set_size(void *b, uint32_t size) +{ + stl_be_p(b + 2, size); +} + static inline uint32_t tpm_cmd_get_ordinal(const void *b) { return ldl_be_p(b + 6); @@ -51,6 +61,11 @@ static inline uint32_t tpm_cmd_get_errcode(const void *b) return ldl_be_p(b + 6); } +static inline void tpm_cmd_set_error(void *b, uint32_t error) +{ + stl_be_p(b + 6, error); +} + int tpm_util_get_buffer_size(int tpm_fd, TPMVersion tpm_version, size_t *buffersize); -- cgit v1.1 From 3bd9e16149de3965a9880a20826a28b7b94bd4a7 Mon Sep 17 00:00:00 2001 From: Stefan Berger Date: Fri, 2 Feb 2018 08:39:18 -0500 Subject: tpm: tis: move one-line function into caller MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Stefan Berger Reviewed-by: Marc-André Lureau --- hw/tpm/tpm_tis.c | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) (limited to 'hw') diff --git a/hw/tpm/tpm_tis.c b/hw/tpm/tpm_tis.c index 08f41d2..f81168a 100644 --- a/hw/tpm/tpm_tis.c +++ b/hw/tpm/tpm_tis.c @@ -946,11 +946,6 @@ static const MemoryRegionOps tpm_tis_memory_ops = { }, }; -static int tpm_tis_do_startup_tpm(TPMState *s, size_t buffersize) -{ - return tpm_backend_startup_tpm(s->be_driver, buffersize); -} - /* * Get the TPMVersion of the backend device being used */ @@ -1005,7 +1000,7 @@ static void tpm_tis_reset(DeviceState *dev) s->rw_offset = 0; } - tpm_tis_do_startup_tpm(s, s->be_buffer_size); + tpm_backend_startup_tpm(s->be_driver, s->be_buffer_size); } static const VMStateDescription vmstate_tpm_tis = { -- cgit v1.1