On Wed, Mar 28, 2018 at 10:59 PM, Stefan Berger <[email protected]> wrote: > Section 5.5.3.2.2 of the CRB specs states that use of the TPM > through the localty control method must first be requested, > otherwise TPM commands will be dropped. This patch makes sure > that the current locality is the active locality and only then > sends off the command for processing. > > Signed-off-by: Stefan Berger <[email protected]>
Reviewed-by: Marc-André Lureau <[email protected]> > --- > hw/tpm/tpm_crb.c | 13 ++++++++++++- > 1 file changed, 12 insertions(+), 1 deletion(-) > > diff --git a/hw/tpm/tpm_crb.c b/hw/tpm/tpm_crb.c > index ee6c87e..520e74e 100644 > --- a/hw/tpm/tpm_crb.c > +++ b/hw/tpm/tpm_crb.c > @@ -76,6 +76,8 @@ enum crb_cancel { > CRB_CANCEL_INVOKE = BIT(0), > }; > > +#define TPM_CRB_NO_LOCALITY 0xff > + > static uint64_t tpm_crb_mmio_read(void *opaque, hwaddr addr, > unsigned size) > { > @@ -95,10 +97,18 @@ static uint64_t tpm_crb_mmio_read(void *opaque, hwaddr > addr, > return val; > } > > +static uint8_t tpm_crb_get_active_locty(CRBState *s) > +{ > + if (!ARRAY_FIELD_EX32(s->regs, CRB_LOC_STATE, locAssigned)) > + return TPM_CRB_NO_LOCALITY; > + return ARRAY_FIELD_EX32(s->regs, CRB_LOC_STATE, activeLocality); > +} > + > static void tpm_crb_mmio_write(void *opaque, hwaddr addr, > uint64_t val, unsigned size) > { > CRBState *s = CRB(opaque); > + uint8_t locty = addr >> 12; > > trace_tpm_crb_mmio_write(addr, size, val); > > @@ -123,7 +133,8 @@ static void tpm_crb_mmio_write(void *opaque, hwaddr addr, > break; > case A_CRB_CTRL_START: > if (val == CRB_START_INVOKE && > - !(s->regs[R_CRB_CTRL_START] & CRB_START_INVOKE)) { > + !(s->regs[R_CRB_CTRL_START] & CRB_START_INVOKE) && > + tpm_crb_get_active_locty(s) == locty) { > void *mem = memory_region_get_ram_ptr(&s->cmdmem); > > s->regs[R_CRB_CTRL_START] |= CRB_START_INVOKE; > -- > 2.5.5 > > -- Marc-André Lureau
