qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH 3/4] tpm: CRB: Enforce locality is requested bef


From: Marc-André Lureau
Subject: Re: [Qemu-devel] [PATCH 3/4] tpm: CRB: Enforce locality is requested before processing buffer
Date: Thu, 29 Mar 2018 12:45:10 +0200

On Wed, Mar 28, 2018 at 10:59 PM, Stefan Berger
<address@hidden> 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 <address@hidden>

Reviewed-by: Marc-André Lureau <address@hidden>


> ---
>  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



reply via email to

[Prev in Thread] Current Thread [Next in Thread]