Merge tpm 2018/03/07

-----BEGIN PGP SIGNATURE-----
 
 iQEcBAABAgAGBQJan94lAAoJEHWtZYAqC0IRu+8H/0CUEGgV7N0+y0/4Zo6+Wy1z
 tgmGkaZP7f4aVtbaor2nGER93wD5PLdV0Gm9fcl1U80qVqyn+ralCQekid6xDYuC
 pW7Wd3XCdk4ME5ifGPa+9j2DjqflL4+QzP08umgfdf8ZLLNFmy5qsixi22BjeuNF
 IOwWt8fvqFfYc+okgAgn3GyGklmD+VSOVco3V77/y3nT6/nipRgWDbN6SlrcvZtr
 Q0nL67/doeiNeqv7Nz7vwTEgm/VL/s8/Qiz2vZd3/S9Y0XRLQj/XH9LT7NISqpf2
 2hrMWRI/f7MGsJFfP4YiYr47oa7/ODQpoZW/rXohPU9XCeRSNmJQgEh9FhjPseo=
 =ie5s
 -----END PGP SIGNATURE-----

Merge remote-tracking branch 'remotes/stefanberger/tags/pull-tpm-2018-03-07-1' into staging

Merge tpm 2018/03/07

# gpg: Signature made Wed 07 Mar 2018 12:42:13 GMT
# gpg:                using RSA key 75AD65802A0B4211
# gpg: Good signature from "Stefan Berger <stefanb@linux.vnet.ibm.com>"
# gpg: WARNING: This key is not certified with a trusted signature!
# gpg:          There is no indication that the signature belongs to the owner.
# Primary key fingerprint: B818 B9CA DF90 89C2 D5CE  C66B 75AD 6580 2A0B 4211

* remotes/stefanberger/tags/pull-tpm-2018-03-07-1:
  tpm: convert tpm_tis.c to use trace-events
  tpm: convert tpm_emulator.c to use trace-events
  tpm: convert tpm_util.c to use trace-events
  tpm: convert tpm_passthrough.c to use trace-events
  tpm: convert tpm_crb.c to use trace-events

Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
Peter Maydell 2018-03-08 12:56:39 +00:00
commit 0ab4537f08
7 changed files with 135 additions and 114 deletions

View File

@ -233,6 +233,7 @@ trace-events-subdirs += hw/alpha
trace-events-subdirs += hw/hppa trace-events-subdirs += hw/hppa
trace-events-subdirs += hw/xen trace-events-subdirs += hw/xen
trace-events-subdirs += hw/ide trace-events-subdirs += hw/ide
trace-events-subdirs += hw/tpm
trace-events-subdirs += ui trace-events-subdirs += ui
trace-events-subdirs += audio trace-events-subdirs += audio
trace-events-subdirs += net trace-events-subdirs += net

View File

@ -29,6 +29,7 @@
#include "sysemu/reset.h" #include "sysemu/reset.h"
#include "tpm_int.h" #include "tpm_int.h"
#include "tpm_util.h" #include "tpm_util.h"
#include "trace.h"
typedef struct CRBState { typedef struct CRBState {
DeviceState parent_obj; DeviceState parent_obj;
@ -44,14 +45,6 @@ typedef struct CRBState {
#define CRB(obj) OBJECT_CHECK(CRBState, (obj), TYPE_TPM_CRB) #define CRB(obj) OBJECT_CHECK(CRBState, (obj), TYPE_TPM_CRB)
#define DEBUG_CRB 0
#define DPRINTF(fmt, ...) do { \
if (DEBUG_CRB) { \
printf(fmt, ## __VA_ARGS__); \
} \
} while (0)
#define CRB_INTF_TYPE_CRB_ACTIVE 0b1 #define CRB_INTF_TYPE_CRB_ACTIVE 0b1
#define CRB_INTF_VERSION_CRB 0b1 #define CRB_INTF_VERSION_CRB 0b1
#define CRB_INTF_CAP_LOCALITY_0_ONLY 0b0 #define CRB_INTF_CAP_LOCALITY_0_ONLY 0b0
@ -91,8 +84,8 @@ static uint64_t tpm_crb_mmio_read(void *opaque, hwaddr addr,
unsigned offset = addr & 3; unsigned offset = addr & 3;
uint32_t val = *(uint32_t *)regs >> (8 * offset); uint32_t val = *(uint32_t *)regs >> (8 * offset);
DPRINTF("CRB read 0x" TARGET_FMT_plx " len:%u val: 0x%" PRIx32 "\n", trace_tpm_crb_mmio_read(addr, size, val);
addr, size, val);
return val; return val;
} }
@ -100,8 +93,8 @@ static void tpm_crb_mmio_write(void *opaque, hwaddr addr,
uint64_t val, unsigned size) uint64_t val, unsigned size)
{ {
CRBState *s = CRB(opaque); CRBState *s = CRB(opaque);
DPRINTF("CRB write 0x" TARGET_FMT_plx " len:%u val: 0x%" PRIx64 "\n",
addr, size, val); trace_tpm_crb_mmio_write(addr, size, val);
switch (addr) { switch (addr) {
case A_CRB_CTRL_REQ: case A_CRB_CTRL_REQ:

View File

@ -40,14 +40,7 @@
#include "qapi/clone-visitor.h" #include "qapi/clone-visitor.h"
#include "qapi/qapi-visit-tpm.h" #include "qapi/qapi-visit-tpm.h"
#include "chardev/char-fe.h" #include "chardev/char-fe.h"
#include "trace.h"
#define DEBUG_TPM 0
#define DPRINTF(fmt, ...) do { \
if (DEBUG_TPM) { \
fprintf(stderr, "tpm-emulator:"fmt"\n", ## __VA_ARGS__); \
} \
} while (0)
#define TYPE_TPM_EMULATOR "tpm-emulator" #define TYPE_TPM_EMULATOR "tpm-emulator"
#define TPM_EMULATOR(obj) \ #define TPM_EMULATOR(obj) \
@ -152,13 +145,12 @@ static int tpm_emulator_set_locality(TPMEmulator *tpm_emu, uint8_t locty_number,
{ {
ptm_loc loc; ptm_loc loc;
DPRINTF("%s : locality: 0x%x", __func__, locty_number);
if (tpm_emu->cur_locty_number == locty_number) { if (tpm_emu->cur_locty_number == locty_number) {
return 0; return 0;
} }
DPRINTF("setting locality : 0x%x", locty_number); trace_tpm_emulator_set_locality(locty_number);
loc.u.req.loc = locty_number; loc.u.req.loc = locty_number;
if (tpm_emulator_ctrlcmd(tpm_emu, CMD_SET_LOCALITY, &loc, if (tpm_emulator_ctrlcmd(tpm_emu, CMD_SET_LOCALITY, &loc,
sizeof(loc), sizeof(loc)) < 0) { sizeof(loc), sizeof(loc)) < 0) {
@ -184,7 +176,7 @@ static void tpm_emulator_handle_request(TPMBackend *tb, TPMBackendCmd *cmd,
{ {
TPMEmulator *tpm_emu = TPM_EMULATOR(tb); TPMEmulator *tpm_emu = TPM_EMULATOR(tb);
DPRINTF("processing TPM command"); trace_tpm_emulator_handle_request();
if (tpm_emulator_set_locality(tpm_emu, cmd->locty, errp) < 0 || if (tpm_emulator_set_locality(tpm_emu, cmd->locty, errp) < 0 ||
tpm_emulator_unix_tx_bufs(tpm_emu, cmd->in, cmd->in_len, tpm_emulator_unix_tx_bufs(tpm_emu, cmd->in, cmd->in_len,
@ -196,7 +188,6 @@ static void tpm_emulator_handle_request(TPMBackend *tb, TPMBackendCmd *cmd,
static int tpm_emulator_probe_caps(TPMEmulator *tpm_emu) static int tpm_emulator_probe_caps(TPMEmulator *tpm_emu)
{ {
DPRINTF("%s", __func__);
if (tpm_emulator_ctrlcmd(tpm_emu, CMD_GET_CAPABILITY, if (tpm_emulator_ctrlcmd(tpm_emu, CMD_GET_CAPABILITY,
&tpm_emu->caps, 0, sizeof(tpm_emu->caps)) < 0) { &tpm_emu->caps, 0, sizeof(tpm_emu->caps)) < 0) {
error_report("tpm-emulator: probing failed : %s", strerror(errno)); error_report("tpm-emulator: probing failed : %s", strerror(errno));
@ -205,7 +196,7 @@ static int tpm_emulator_probe_caps(TPMEmulator *tpm_emu)
tpm_emu->caps = be64_to_cpu(tpm_emu->caps); tpm_emu->caps = be64_to_cpu(tpm_emu->caps);
DPRINTF("capabilities : 0x%"PRIx64, tpm_emu->caps); trace_tpm_emulator_probe_caps(tpm_emu->caps);
return 0; return 0;
} }
@ -294,7 +285,7 @@ static int tpm_emulator_set_buffer_size(TPMBackend *tb,
*actual_size = be32_to_cpu(psbs.u.resp.buffersize); *actual_size = be32_to_cpu(psbs.u.resp.buffersize);
} }
DPRINTF("buffer size: %u, min: %u, max: %u\n", trace_tpm_emulator_set_buffer_size(
be32_to_cpu(psbs.u.resp.buffersize), be32_to_cpu(psbs.u.resp.buffersize),
be32_to_cpu(psbs.u.resp.minsize), be32_to_cpu(psbs.u.resp.minsize),
be32_to_cpu(psbs.u.resp.maxsize)); be32_to_cpu(psbs.u.resp.maxsize));
@ -315,7 +306,7 @@ static int tpm_emulator_startup_tpm(TPMBackend *tb, size_t buffersize)
goto err_exit; goto err_exit;
} }
DPRINTF("%s", __func__); trace_tpm_emulator_startup_tpm();
if (tpm_emulator_ctrlcmd(tpm_emu, CMD_INIT, &init, sizeof(init), if (tpm_emulator_ctrlcmd(tpm_emu, CMD_INIT, &init, sizeof(init),
sizeof(init)) < 0) { sizeof(init)) < 0) {
error_report("tpm-emulator: could not send INIT: %s", error_report("tpm-emulator: could not send INIT: %s",
@ -349,7 +340,7 @@ static bool tpm_emulator_get_tpm_established_flag(TPMBackend *tb)
strerror(errno)); strerror(errno));
return false; return false;
} }
DPRINTF("got established flag: %0x", est.u.resp.bit); trace_tpm_emulator_get_tpm_established_flag(est.u.resp.bit);
tpm_emu->established_flag_cached = 1; tpm_emu->established_flag_cached = 1;
tpm_emu->established_flag = (est.u.resp.bit != 0); tpm_emu->established_flag = (est.u.resp.bit != 0);
@ -396,7 +387,7 @@ static void tpm_emulator_cancel_cmd(TPMBackend *tb)
ptm_res res; ptm_res res;
if (!TPM_EMULATOR_IMPLEMENTS_ALL_CAPS(tpm_emu, PTM_CAP_CANCEL_TPM_CMD)) { if (!TPM_EMULATOR_IMPLEMENTS_ALL_CAPS(tpm_emu, PTM_CAP_CANCEL_TPM_CMD)) {
DPRINTF("Backend does not support CANCEL_TPM_CMD"); trace_tpm_emulator_cancel_cmd_not_supt();
return; return;
} }
@ -522,8 +513,16 @@ static int tpm_emulator_handle_device_opts(TPMEmulator *tpm_emu, QemuOpts *opts)
goto err; goto err;
} }
DPRINTF("TPM Version %s", tpm_emu->tpm_version == TPM_VERSION_1_2 ? "1.2" : switch (tpm_emu->tpm_version) {
(tpm_emu->tpm_version == TPM_VERSION_2_0 ? "2.0" : "Unspecified")); case TPM_VERSION_1_2:
trace_tpm_emulator_handle_device_opts_tpm12();
break;
case TPM_VERSION_2_0:
trace_tpm_emulator_handle_device_opts_tpm2();
break;
default:
trace_tpm_emulator_handle_device_opts_unspec();
}
if (tpm_emulator_probe_caps(tpm_emu) || if (tpm_emulator_probe_caps(tpm_emu) ||
tpm_emulator_check_caps(tpm_emu)) { tpm_emulator_check_caps(tpm_emu)) {
@ -533,7 +532,8 @@ static int tpm_emulator_handle_device_opts(TPMEmulator *tpm_emu, QemuOpts *opts)
return tpm_emulator_block_migration(tpm_emu); return tpm_emulator_block_migration(tpm_emu);
err: err:
DPRINTF("Startup error"); trace_tpm_emulator_handle_device_opts_startup_error();
return -1; return -1;
} }
@ -574,7 +574,8 @@ static void tpm_emulator_inst_init(Object *obj)
{ {
TPMEmulator *tpm_emu = TPM_EMULATOR(obj); TPMEmulator *tpm_emu = TPM_EMULATOR(obj);
DPRINTF("%s", __func__); trace_tpm_emulator_inst_init();
tpm_emu->options = g_new0(TPMEmulatorOptions, 1); tpm_emu->options = g_new0(TPMEmulatorOptions, 1);
tpm_emu->cur_locty_number = ~0; tpm_emu->cur_locty_number = ~0;
qemu_mutex_init(&tpm_emu->mutex); qemu_mutex_init(&tpm_emu->mutex);

View File

@ -32,14 +32,7 @@
#include "qapi/clone-visitor.h" #include "qapi/clone-visitor.h"
#include "qapi/qapi-visit-tpm.h" #include "qapi/qapi-visit-tpm.h"
#include "tpm_util.h" #include "tpm_util.h"
#include "trace.h"
#define DEBUG_TPM 0
#define DPRINTF(fmt, ...) do { \
if (DEBUG_TPM) { \
fprintf(stderr, fmt, ## __VA_ARGS__); \
} \
} while (0)
#define TYPE_TPM_PASSTHROUGH "tpm-passthrough" #define TYPE_TPM_PASSTHROUGH "tpm-passthrough"
#define TPM_PASSTHROUGH(obj) \ #define TPM_PASSTHROUGH(obj) \
@ -138,7 +131,7 @@ static void tpm_passthrough_handle_request(TPMBackend *tb, TPMBackendCmd *cmd,
{ {
TPMPassthruState *tpm_pt = TPM_PASSTHROUGH(tb); TPMPassthruState *tpm_pt = TPM_PASSTHROUGH(tb);
DPRINTF("tpm_passthrough: processing command %p\n", cmd); trace_tpm_passthrough_handle_request(cmd);
tpm_passthrough_unix_tx_bufs(tpm_pt, cmd->in, cmd->in_len, tpm_passthrough_unix_tx_bufs(tpm_pt, cmd->in, cmd->in_len,
cmd->out, cmd->out_len, &cmd->selftest_done, cmd->out, cmd->out_len, &cmd->selftest_done,
@ -147,7 +140,7 @@ static void tpm_passthrough_handle_request(TPMBackend *tb, TPMBackendCmd *cmd,
static void tpm_passthrough_reset(TPMBackend *tb) static void tpm_passthrough_reset(TPMBackend *tb)
{ {
DPRINTF("tpm_passthrough: CALL TO TPM_RESET!\n"); trace_tpm_passthrough_reset();
tpm_passthrough_cancel_cmd(tb); tpm_passthrough_cancel_cmd(tb);
} }

View File

@ -31,6 +31,7 @@
#include "sysemu/tpm_backend.h" #include "sysemu/tpm_backend.h"
#include "tpm_int.h" #include "tpm_int.h"
#include "tpm_util.h" #include "tpm_util.h"
#include "trace.h"
#define TPM_TIS_NUM_LOCALITIES 5 /* per spec */ #define TPM_TIS_NUM_LOCALITIES 5 /* per spec */
#define TPM_TIS_LOCALITY_SHIFT 12 #define TPM_TIS_LOCALITY_SHIFT 12
@ -86,12 +87,6 @@ typedef struct TPMState {
#define DEBUG_TIS 0 #define DEBUG_TIS 0
#define DPRINTF(fmt, ...) do { \
if (DEBUG_TIS) { \
printf(fmt, ## __VA_ARGS__); \
} \
} while (0)
/* local prototypes */ /* local prototypes */
static uint64_t tpm_tis_mmio_read(void *opaque, hwaddr addr, static uint64_t tpm_tis_mmio_read(void *opaque, hwaddr addr,
@ -107,19 +102,17 @@ static uint8_t tpm_tis_locality_from_addr(hwaddr addr)
static void tpm_tis_show_buffer(const unsigned char *buffer, static void tpm_tis_show_buffer(const unsigned char *buffer,
size_t buffer_size, const char *string) size_t buffer_size, const char *string)
{ {
#ifdef DEBUG_TIS
uint32_t len, i; uint32_t len, i;
len = MIN(tpm_cmd_get_size(buffer), buffer_size); len = MIN(tpm_cmd_get_size(buffer), buffer_size);
DPRINTF("tpm_tis: %s length = %d\n", string, len); printf("tpm_tis: %s length = %d\n", string, len);
for (i = 0; i < len; i++) { for (i = 0; i < len; i++) {
if (i && !(i % 16)) { if (i && !(i % 16)) {
DPRINTF("\n"); printf("\n");
} }
DPRINTF("%.2X ", buffer[i]); printf("%.2X ", buffer[i]);
} }
DPRINTF("\n"); printf("\n");
#endif
} }
/* /*
@ -146,8 +139,10 @@ static void tpm_tis_sts_set(TPMLocality *l, uint32_t flags)
*/ */
static void tpm_tis_tpm_send(TPMState *s, uint8_t locty) static void tpm_tis_tpm_send(TPMState *s, uint8_t locty)
{ {
if (DEBUG_TIS) {
tpm_tis_show_buffer(s->buffer, s->be_buffer_size, tpm_tis_show_buffer(s->buffer, s->be_buffer_size,
"tpm_tis: To TPM"); "tpm_tis: To TPM");
}
/* /*
* rw_offset serves as length indicator for length of data; * rw_offset serves as length indicator for length of data;
@ -175,7 +170,7 @@ static void tpm_tis_raise_irq(TPMState *s, uint8_t locty, uint32_t irqmask)
if ((s->loc[locty].inte & TPM_TIS_INT_ENABLED) && if ((s->loc[locty].inte & TPM_TIS_INT_ENABLED) &&
(s->loc[locty].inte & irqmask)) { (s->loc[locty].inte & irqmask)) {
DPRINTF("tpm_tis: Raising IRQ for flag %08x\n", irqmask); trace_tpm_tis_raise_irq(irqmask);
qemu_irq_raise(s->irq); qemu_irq_raise(s->irq);
s->loc[locty].ints |= irqmask; s->loc[locty].ints |= irqmask;
} }
@ -223,7 +218,7 @@ static void tpm_tis_new_active_locality(TPMState *s, uint8_t new_active_locty)
s->active_locty = new_active_locty; s->active_locty = new_active_locty;
DPRINTF("tpm_tis: Active locality is now %d\n", s->active_locty); trace_tpm_tis_new_active_locality(s->active_locty);
if (TPM_TIS_IS_VALID_LOCTY(new_active_locty)) { if (TPM_TIS_IS_VALID_LOCTY(new_active_locty)) {
/* set flags on the new active locality */ /* set flags on the new active locality */
@ -242,7 +237,7 @@ static void tpm_tis_abort(TPMState *s, uint8_t locty)
{ {
s->rw_offset = 0; s->rw_offset = 0;
DPRINTF("tpm_tis: tis_abort: new active locality is %d\n", s->next_locty); trace_tpm_tis_abort(s->next_locty);
/* /*
* Need to react differently depending on who's aborting now and * Need to react differently depending on who's aborting now and
@ -310,8 +305,10 @@ static void tpm_tis_request_completed(TPMIf *ti, int ret)
s->loc[locty].state = TPM_TIS_STATE_COMPLETION; s->loc[locty].state = TPM_TIS_STATE_COMPLETION;
s->rw_offset = 0; s->rw_offset = 0;
if (DEBUG_TIS) {
tpm_tis_show_buffer(s->buffer, s->be_buffer_size, tpm_tis_show_buffer(s->buffer, s->be_buffer_size,
"tpm_tis: From TPM"); "tpm_tis: From TPM");
}
if (TPM_TIS_IS_VALID_LOCTY(s->next_locty)) { if (TPM_TIS_IS_VALID_LOCTY(s->next_locty)) {
tpm_tis_abort(s, locty); tpm_tis_abort(s, locty);
@ -339,8 +336,7 @@ static uint32_t tpm_tis_data_read(TPMState *s, uint8_t locty)
tpm_tis_sts_set(&s->loc[locty], TPM_TIS_STS_VALID); tpm_tis_sts_set(&s->loc[locty], TPM_TIS_STS_VALID);
tpm_tis_raise_irq(s, locty, TPM_TIS_INT_STS_VALID); tpm_tis_raise_irq(s, locty, TPM_TIS_INT_STS_VALID);
} }
DPRINTF("tpm_tis: tpm_tis_data_read byte 0x%02x [%d]\n", trace_tpm_tis_data_read(ret, s->rw_offset - 1);
ret, s->rw_offset - 1);
} }
return ret; return ret;
@ -364,29 +360,29 @@ static void tpm_tis_dump_state(void *opaque, hwaddr addr)
hwaddr base = addr & ~0xfff; hwaddr base = addr & ~0xfff;
TPMState *s = opaque; TPMState *s = opaque;
DPRINTF("tpm_tis: active locality : %d\n" printf("tpm_tis: active locality : %d\n"
"tpm_tis: state of locality %d : %d\n" "tpm_tis: state of locality %d : %d\n"
"tpm_tis: register dump:\n", "tpm_tis: register dump:\n",
s->active_locty, s->active_locty,
locty, s->loc[locty].state); locty, s->loc[locty].state);
for (idx = 0; regs[idx] != 0xfff; idx++) { for (idx = 0; regs[idx] != 0xfff; idx++) {
DPRINTF("tpm_tis: 0x%04x : 0x%08x\n", regs[idx], printf("tpm_tis: 0x%04x : 0x%08x\n", regs[idx],
(int)tpm_tis_mmio_read(opaque, base + regs[idx], 4)); (int)tpm_tis_mmio_read(opaque, base + regs[idx], 4));
} }
DPRINTF("tpm_tis: r/w offset : %d\n" printf("tpm_tis: r/w offset : %d\n"
"tpm_tis: result buffer : ", "tpm_tis: result buffer : ",
s->rw_offset); s->rw_offset);
for (idx = 0; for (idx = 0;
idx < MIN(tpm_cmd_get_size(&s->buffer), s->be_buffer_size); idx < MIN(tpm_cmd_get_size(&s->buffer), s->be_buffer_size);
idx++) { idx++) {
DPRINTF("%c%02x%s", printf("%c%02x%s",
s->rw_offset == idx ? '>' : ' ', s->rw_offset == idx ? '>' : ' ',
s->buffer[idx], s->buffer[idx],
((idx & 0xf) == 0xf) ? "\ntpm_tis: " : ""); ((idx & 0xf) == 0xf) ? "\ntpm_tis: " : "");
} }
DPRINTF("\n"); printf("\n");
} }
#endif #endif
@ -506,7 +502,7 @@ static uint64_t tpm_tis_mmio_read(void *opaque, hwaddr addr,
val >>= shift; val >>= shift;
} }
DPRINTF("tpm_tis: read.%u(%08x) = %08x\n", size, (int)addr, (int)val); trace_tpm_tis_mmio_read(size, addr, val);
return val; return val;
} }
@ -527,10 +523,10 @@ static void tpm_tis_mmio_write(void *opaque, hwaddr addr,
uint16_t len; uint16_t len;
uint32_t mask = (size == 1) ? 0xff : ((size == 2) ? 0xffff : ~0); uint32_t mask = (size == 1) ? 0xff : ((size == 2) ? 0xffff : ~0);
DPRINTF("tpm_tis: write.%u(%08x) = %08x\n", size, (int)addr, (int)val); trace_tpm_tis_mmio_write(size, addr, val);
if (locty == 4) { if (locty == 4) {
DPRINTF("tpm_tis: Access to locality 4 only allowed from hardware\n"); trace_tpm_tis_mmio_write_locty4();
return; return;
} }
@ -560,20 +556,18 @@ static void tpm_tis_mmio_write(void *opaque, hwaddr addr,
if ((val & TPM_TIS_ACCESS_ACTIVE_LOCALITY)) { if ((val & TPM_TIS_ACCESS_ACTIVE_LOCALITY)) {
/* give up locality if currently owned */ /* give up locality if currently owned */
if (s->active_locty == locty) { if (s->active_locty == locty) {
DPRINTF("tpm_tis: Releasing locality %d\n", locty); trace_tpm_tis_mmio_write_release_locty(locty);
uint8_t newlocty = TPM_TIS_NO_LOCALITY; uint8_t newlocty = TPM_TIS_NO_LOCALITY;
/* anybody wants the locality ? */ /* anybody wants the locality ? */
for (c = TPM_TIS_NUM_LOCALITIES - 1; c >= 0; c--) { for (c = TPM_TIS_NUM_LOCALITIES - 1; c >= 0; c--) {
if ((s->loc[c].access & TPM_TIS_ACCESS_REQUEST_USE)) { if ((s->loc[c].access & TPM_TIS_ACCESS_REQUEST_USE)) {
DPRINTF("tpm_tis: Locality %d requests use.\n", c); trace_tpm_tis_mmio_write_locty_req_use(c);
newlocty = c; newlocty = c;
break; break;
} }
} }
DPRINTF("tpm_tis: TPM_TIS_ACCESS_ACTIVE_LOCALITY: " trace_tpm_tis_mmio_write_next_locty(newlocty);
"Next active locality: %d\n",
newlocty);
if (TPM_TIS_IS_VALID_LOCTY(newlocty)) { if (TPM_TIS_IS_VALID_LOCTY(newlocty)) {
set_new_locty = 0; set_new_locty = 0;
@ -627,10 +621,10 @@ static void tpm_tis_mmio_write(void *opaque, hwaddr addr,
} }
s->loc[locty].access |= TPM_TIS_ACCESS_SEIZE; s->loc[locty].access |= TPM_TIS_ACCESS_SEIZE;
DPRINTF("tpm_tis: TPM_TIS_ACCESS_SEIZE: "
"Locality %d seized from locality %d\n", trace_tpm_tis_mmio_write_locty_seized(locty, s->active_locty);
locty, s->active_locty); trace_tpm_tis_mmio_write_init_abort();
DPRINTF("tpm_tis: TPM_TIS_ACCESS_SEIZE: Initiating abort.\n");
set_new_locty = 0; set_new_locty = 0;
tpm_tis_prep_abort(s, s->active_locty, locty); tpm_tis_prep_abort(s, s->active_locty, locty);
break; break;
@ -677,7 +671,7 @@ static void tpm_tis_mmio_write(void *opaque, hwaddr addr,
s->loc[locty].ints &= ~val; s->loc[locty].ints &= ~val;
if (s->loc[locty].ints == 0) { if (s->loc[locty].ints == 0) {
qemu_irq_lower(s->irq); qemu_irq_lower(s->irq);
DPRINTF("tpm_tis: Lowering IRQ\n"); trace_tpm_tis_mmio_write_lowering_irq();
} }
} }
s->loc[locty].ints &= ~(val & TPM_TIS_INTERRUPTS_SUPPORTED); s->loc[locty].ints &= ~(val & TPM_TIS_INTERRUPTS_SUPPORTED);
@ -725,8 +719,7 @@ static void tpm_tis_mmio_write(void *opaque, hwaddr addr,
case TPM_TIS_STATE_EXECUTION: case TPM_TIS_STATE_EXECUTION:
case TPM_TIS_STATE_RECEPTION: case TPM_TIS_STATE_RECEPTION:
/* abort currently running command */ /* abort currently running command */
DPRINTF("tpm_tis: %s: Initiating abort.\n", trace_tpm_tis_mmio_write_init_abort();
__func__);
tpm_tis_prep_abort(s, locty, locty); tpm_tis_prep_abort(s, locty, locty);
break; break;
@ -780,8 +773,7 @@ static void tpm_tis_mmio_write(void *opaque, hwaddr addr,
s->loc[locty].state == TPM_TIS_STATE_COMPLETION) { s->loc[locty].state == TPM_TIS_STATE_COMPLETION) {
/* drop the byte */ /* drop the byte */
} else { } else {
DPRINTF("tpm_tis: Data to send to TPM: %08x (size=%d)\n", trace_tpm_tis_mmio_write_data2send(val, size);
(int)val, size);
if (s->loc[locty].state == TPM_TIS_STATE_READY) { if (s->loc[locty].state == TPM_TIS_STATE_READY) {
s->loc[locty].state = TPM_TIS_STATE_RECEPTION; s->loc[locty].state = TPM_TIS_STATE_RECEPTION;
tpm_tis_sts_set(&s->loc[locty], tpm_tis_sts_set(&s->loc[locty],

View File

@ -28,14 +28,7 @@
#include "exec/memory.h" #include "exec/memory.h"
#include "sysemu/tpm_backend.h" #include "sysemu/tpm_backend.h"
#include "hw/qdev.h" #include "hw/qdev.h"
#include "trace.h"
#define DEBUG_TPM 0
#define DPRINTF(fmt, ...) do { \
if (DEBUG_TPM) { \
fprintf(stderr, "tpm-util:"fmt"\n", ## __VA_ARGS__); \
} \
} while (0)
/* tpm backend property */ /* tpm backend property */
@ -279,10 +272,11 @@ int tpm_util_get_buffer_size(int tpm_fd, TPMVersion tpm_version,
if (be32_to_cpu(tpm_resp.hdr.len) != sizeof(tpm_resp) || if (be32_to_cpu(tpm_resp.hdr.len) != sizeof(tpm_resp) ||
be32_to_cpu(tpm_resp.len) != sizeof(uint32_t)) { be32_to_cpu(tpm_resp.len) != sizeof(uint32_t)) {
DPRINTF("tpm_resp->hdr.len = %u, expected = %zu\n", trace_tpm_util_get_buffer_size_hdr_len(
be32_to_cpu(tpm_resp.hdr.len), sizeof(tpm_resp)); be32_to_cpu(tpm_resp.hdr.len),
DPRINTF("tpm_resp->len = %u, expected = %zu\n", sizeof(tpm_resp));
be32_to_cpu(tpm_resp.len), sizeof(uint32_t)); trace_tpm_util_get_buffer_size_len(be32_to_cpu(tpm_resp.len),
sizeof(uint32_t));
error_report("tpm_util: Got unexpected response to " error_report("tpm_util: Got unexpected response to "
"TPM_GetCapability; errcode: 0x%x", "TPM_GetCapability; errcode: 0x%x",
be32_to_cpu(tpm_resp.hdr.errcode)); be32_to_cpu(tpm_resp.hdr.errcode));
@ -327,9 +321,10 @@ int tpm_util_get_buffer_size(int tpm_fd, TPMVersion tpm_version,
if (be32_to_cpu(tpm2_resp.hdr.len) != sizeof(tpm2_resp) || if (be32_to_cpu(tpm2_resp.hdr.len) != sizeof(tpm2_resp) ||
be32_to_cpu(tpm2_resp.count) != 2) { be32_to_cpu(tpm2_resp.count) != 2) {
DPRINTF("tpm2_resp->hdr.len = %u, expected = %zu\n", trace_tpm_util_get_buffer_size_hdr_len2(
be32_to_cpu(tpm2_resp.hdr.len), sizeof(tpm2_resp)); be32_to_cpu(tpm2_resp.hdr.len),
DPRINTF("tpm2_resp->len = %u, expected = %u\n", sizeof(tpm2_resp));
trace_tpm_util_get_buffer_size_len2(
be32_to_cpu(tpm2_resp.count), 2); be32_to_cpu(tpm2_resp.count), 2);
error_report("tpm_util: Got unexpected response to " error_report("tpm_util: Got unexpected response to "
"TPM2_GetCapability; errcode: 0x%x", "TPM2_GetCapability; errcode: 0x%x",
@ -344,7 +339,7 @@ int tpm_util_get_buffer_size(int tpm_fd, TPMVersion tpm_version,
return -EFAULT; return -EFAULT;
} }
DPRINTF("buffersize of device: %zu\n", *buffersize); trace_tpm_util_get_buffer_size(*buffersize);
return 0; return 0;
} }

46
hw/tpm/trace-events Normal file
View File

@ -0,0 +1,46 @@
# See docs/devel/tracing.txt for syntax documentation.
# hw/tpm/tpm_crb.c
tpm_crb_mmio_read(uint64_t addr, unsigned size, uint32_t val) "CRB read 0x" TARGET_FMT_plx " len:%u val: 0x%" PRIx32
tpm_crb_mmio_write(uint64_t addr, unsigned size, uint32_t val) "CRB write 0x" TARGET_FMT_plx " len:%u val: 0x%" PRIx32
# hw/tpm/tpm_passthrough.c
tpm_passthrough_handle_request(void *cmd) "processing command %p"
tpm_passthrough_reset(void) "reset"
# hw/tpm/tpm_util.c
tpm_util_get_buffer_size_hdr_len(uint32_t len, size_t expected) "tpm_resp->hdr.len = %u, expected = %zu"
tpm_util_get_buffer_size_len(uint32_t len, size_t expected) "tpm_resp->len = %u, expected = %zu"
tpm_util_get_buffer_size_hdr_len2(uint32_t len, size_t expected) "tpm2_resp->hdr.len = %u, expected = %zu"
tpm_util_get_buffer_size_len2(uint32_t len, size_t expected) "tpm2_resp->len = %u, expected = %zu"
tpm_util_get_buffer_size(size_t len) "buffersize of device: %zu"
# hw/tpm/tpm_emulator.c
tpm_emulator_set_locality(uint8_t locty) "setting locality to %d"
tpm_emulator_handle_request(void) "processing TPM command"
tpm_emulator_probe_caps(uint64_t caps) "capabilities: 0x%"PRIx64
tpm_emulator_set_buffer_size(uint32_t buffersize, uint32_t minsize, uint32_t maxsize) "buffer size: %u, min: %u, max: %u"
tpm_emulator_startup_tpm(void) "startup"
tpm_emulator_get_tpm_established_flag(uint8_t flag) "got established flag: %d"
tpm_emulator_cancel_cmd_not_supt(void) "Backend does not support CANCEL_TPM_CMD"
tpm_emulator_handle_device_opts_tpm12(void) "TPM Version 1.2"
tpm_emulator_handle_device_opts_tpm2(void) "TPM Version 2"
tpm_emulator_handle_device_opts_unspec(void) "TPM Version Unspecified"
tpm_emulator_handle_device_opts_startup_error(void) "Startup error"
tpm_emulator_inst_init(void) ""
# hw/tpm/tpm_tis.c
tpm_tis_raise_irq(uint32_t irqmask) "Raising IRQ for flag 0x%08x"
tpm_tis_new_active_locality(uint8_t locty) "Active locality is now %d"
tpm_tis_abort(uint8_t locty) "New active locality is %d"
tpm_tis_data_read(uint32_t value, uint32_t off) "byte 0x%02x [%d]"
tpm_tis_mmio_read(unsigned size, uint32_t addr, uint32_t val) " read.%u(0x%08x) = 0x%08x"
tpm_tis_mmio_write(unsigned size, uint32_t addr, uint32_t val) "write.%u(0x%08x) = 0x%08x"
tpm_tis_mmio_write_locty4(void) "Access to locality 4 only allowed from hardware"
tpm_tis_mmio_write_release_locty(uint8_t locty) "Releasing locality %d"
tpm_tis_mmio_write_locty_req_use(uint8_t locty) "Locality %d requests use"
tpm_tis_mmio_write_next_locty(uint8_t locty) "Next active locality is %d"
tpm_tis_mmio_write_locty_seized(uint8_t locty, uint8_t active) "Locality %d seized from locality %d"
tpm_tis_mmio_write_init_abort(void) "Initiating abort"
tpm_tis_mmio_write_lowering_irq(void) "Lowering IRQ"
tpm_tis_mmio_write_data2send(uint32_t value, unsigned size) "Data to send to TPM: 0x%08x (size=%d)"