Message ID | 1510173421-19895-1-git-send-email-stefanb@linux.vnet.ibm.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Hi On Wed, Nov 8, 2017 at 9:37 PM, Stefan Berger <stefanb@linux.vnet.ibm.com> wrote: > Add a caching layer for the TPM established flag so that we don't > need to go to the emulator every time the flag is read by accessing > the REG_ACCESS register. > > Signed-off-by: Stefan Berger <stefanb@linux.vnet.ibm.com> > > v1->v2: > - move the caching to the backend layer since detecting the > TPM 1.2 TSC_ResetEstablishmentBit() command is easier to do > here. What about the HASH_START? Is this not supported by qemu TIS? Is the function gone or done differently with TPM2 or CRB? > --- > hw/tpm/tpm_emulator.c | 17 ++++++++++++++--- > 1 file changed, 14 insertions(+), 3 deletions(-) > > diff --git a/hw/tpm/tpm_emulator.c b/hw/tpm/tpm_emulator.c > index 9aaec8e..507e2cb 100644 > --- a/hw/tpm/tpm_emulator.c > +++ b/hw/tpm/tpm_emulator.c > @@ -71,6 +71,9 @@ typedef struct TPMEmulator { > ptm_cap caps; /* capabilities of the TPM */ > uint8_t cur_locty_number; /* last set locality */ > Error *migration_blocker; > + > + unsigned int established_flag:1; > + unsigned int established_flag_cached:1; > } TPMEmulator; > > > @@ -277,16 +280,22 @@ static bool tpm_emulator_get_tpm_established_flag(TPMBackend *tb) > TPMEmulator *tpm_emu = TPM_EMULATOR(tb); > ptm_est est; > > - DPRINTF("%s", __func__); > + if (tpm_emu->established_flag_cached) { > + return tpm_emu->established_flag; > + } > + > if (tpm_emulator_ctrlcmd(&tpm_emu->ctrl_chr, CMD_GET_TPMESTABLISHED, &est, > 0, sizeof(est)) < 0) { > error_report("tpm-emulator: Could not get the TPM established flag: %s", > strerror(errno)); > return false; > } > - DPRINTF("established flag: %0x", est.u.resp.bit); > + DPRINTF("got established flag: %0x", est.u.resp.bit); > + > + tpm_emu->established_flag_cached = 1; > + tpm_emu->established_flag = (est.u.resp.bit != 0); > > - return (est.u.resp.bit != 0); > + return tpm_emu->established_flag; > } > > static int tpm_emulator_reset_tpm_established_flag(TPMBackend *tb, > @@ -317,6 +326,8 @@ static int tpm_emulator_reset_tpm_established_flag(TPMBackend *tb, > return -1; > } > > + tpm_emu->established_flag_cached = 0; > + > return 0; > } > > -- > 2.5.5 > >
On 11/09/2017 07:07 AM, Marc-André Lureau wrote: > Hi > > On Wed, Nov 8, 2017 at 9:37 PM, Stefan Berger > <stefanb@linux.vnet.ibm.com> wrote: >> Add a caching layer for the TPM established flag so that we don't >> need to go to the emulator every time the flag is read by accessing >> the REG_ACCESS register. >> >> Signed-off-by: Stefan Berger <stefanb@linux.vnet.ibm.com> >> >> v1->v2: >> - move the caching to the backend layer since detecting the >> TPM 1.2 TSC_ResetEstablishmentBit() command is easier to do >> here. > What about the HASH_START? Is this not supported by qemu TIS? Is the > function gone or done differently with TPM2 or CRB? Afaik, HASH_START would need emulation of CPU instructions to initiate it. Reading this flag from the device is there primarily for completeness reasons. Stefan > >> --- >> hw/tpm/tpm_emulator.c | 17 ++++++++++++++--- >> 1 file changed, 14 insertions(+), 3 deletions(-) >> >> diff --git a/hw/tpm/tpm_emulator.c b/hw/tpm/tpm_emulator.c >> index 9aaec8e..507e2cb 100644 >> --- a/hw/tpm/tpm_emulator.c >> +++ b/hw/tpm/tpm_emulator.c >> @@ -71,6 +71,9 @@ typedef struct TPMEmulator { >> ptm_cap caps; /* capabilities of the TPM */ >> uint8_t cur_locty_number; /* last set locality */ >> Error *migration_blocker; >> + >> + unsigned int established_flag:1; >> + unsigned int established_flag_cached:1; >> } TPMEmulator; >> >> >> @@ -277,16 +280,22 @@ static bool tpm_emulator_get_tpm_established_flag(TPMBackend *tb) >> TPMEmulator *tpm_emu = TPM_EMULATOR(tb); >> ptm_est est; >> >> - DPRINTF("%s", __func__); >> + if (tpm_emu->established_flag_cached) { >> + return tpm_emu->established_flag; >> + } >> + >> if (tpm_emulator_ctrlcmd(&tpm_emu->ctrl_chr, CMD_GET_TPMESTABLISHED, &est, >> 0, sizeof(est)) < 0) { >> error_report("tpm-emulator: Could not get the TPM established flag: %s", >> strerror(errno)); >> return false; >> } >> - DPRINTF("established flag: %0x", est.u.resp.bit); >> + DPRINTF("got established flag: %0x", est.u.resp.bit); >> + >> + tpm_emu->established_flag_cached = 1; >> + tpm_emu->established_flag = (est.u.resp.bit != 0); >> >> - return (est.u.resp.bit != 0); >> + return tpm_emu->established_flag; >> } >> >> static int tpm_emulator_reset_tpm_established_flag(TPMBackend *tb, >> @@ -317,6 +326,8 @@ static int tpm_emulator_reset_tpm_established_flag(TPMBackend *tb, >> return -1; >> } >> >> + tpm_emu->established_flag_cached = 0; >> + >> return 0; >> } >> >> -- >> 2.5.5 >> >> > >
On 11/08/2017 03:37 PM, Stefan Berger wrote: > Add a caching layer for the TPM established flag so that we don't > need to go to the emulator every time the flag is read by accessing > the REG_ACCESS register. > > Signed-off-by: Stefan Berger <stefanb@linux.vnet.ibm.com> Can anyone have a look, please? Stefan > > v1->v2: > - move the caching to the backend layer since detecting the > TPM 1.2 TSC_ResetEstablishmentBit() command is easier to do > here. > --- > hw/tpm/tpm_emulator.c | 17 ++++++++++++++--- > 1 file changed, 14 insertions(+), 3 deletions(-) > > diff --git a/hw/tpm/tpm_emulator.c b/hw/tpm/tpm_emulator.c > index 9aaec8e..507e2cb 100644 > --- a/hw/tpm/tpm_emulator.c > +++ b/hw/tpm/tpm_emulator.c > @@ -71,6 +71,9 @@ typedef struct TPMEmulator { > ptm_cap caps; /* capabilities of the TPM */ > uint8_t cur_locty_number; /* last set locality */ > Error *migration_blocker; > + > + unsigned int established_flag:1; > + unsigned int established_flag_cached:1; > } TPMEmulator; > > > @@ -277,16 +280,22 @@ static bool tpm_emulator_get_tpm_established_flag(TPMBackend *tb) > TPMEmulator *tpm_emu = TPM_EMULATOR(tb); > ptm_est est; > > - DPRINTF("%s", __func__); > + if (tpm_emu->established_flag_cached) { > + return tpm_emu->established_flag; > + } > + > if (tpm_emulator_ctrlcmd(&tpm_emu->ctrl_chr, CMD_GET_TPMESTABLISHED, &est, > 0, sizeof(est)) < 0) { > error_report("tpm-emulator: Could not get the TPM established flag: %s", > strerror(errno)); > return false; > } > - DPRINTF("established flag: %0x", est.u.resp.bit); > + DPRINTF("got established flag: %0x", est.u.resp.bit); > + > + tpm_emu->established_flag_cached = 1; > + tpm_emu->established_flag = (est.u.resp.bit != 0); > > - return (est.u.resp.bit != 0); > + return tpm_emu->established_flag; > } > > static int tpm_emulator_reset_tpm_established_flag(TPMBackend *tb, > @@ -317,6 +326,8 @@ static int tpm_emulator_reset_tpm_established_flag(TPMBackend *tb, > return -1; > } > > + tpm_emu->established_flag_cached = 0; > + > return 0; > } >
diff --git a/hw/tpm/tpm_emulator.c b/hw/tpm/tpm_emulator.c index 9aaec8e..507e2cb 100644 --- a/hw/tpm/tpm_emulator.c +++ b/hw/tpm/tpm_emulator.c @@ -71,6 +71,9 @@ typedef struct TPMEmulator { ptm_cap caps; /* capabilities of the TPM */ uint8_t cur_locty_number; /* last set locality */ Error *migration_blocker; + + unsigned int established_flag:1; + unsigned int established_flag_cached:1; } TPMEmulator; @@ -277,16 +280,22 @@ static bool tpm_emulator_get_tpm_established_flag(TPMBackend *tb) TPMEmulator *tpm_emu = TPM_EMULATOR(tb); ptm_est est; - DPRINTF("%s", __func__); + if (tpm_emu->established_flag_cached) { + return tpm_emu->established_flag; + } + if (tpm_emulator_ctrlcmd(&tpm_emu->ctrl_chr, CMD_GET_TPMESTABLISHED, &est, 0, sizeof(est)) < 0) { error_report("tpm-emulator: Could not get the TPM established flag: %s", strerror(errno)); return false; } - DPRINTF("established flag: %0x", est.u.resp.bit); + DPRINTF("got established flag: %0x", est.u.resp.bit); + + tpm_emu->established_flag_cached = 1; + tpm_emu->established_flag = (est.u.resp.bit != 0); - return (est.u.resp.bit != 0); + return tpm_emu->established_flag; } static int tpm_emulator_reset_tpm_established_flag(TPMBackend *tb, @@ -317,6 +326,8 @@ static int tpm_emulator_reset_tpm_established_flag(TPMBackend *tb, return -1; } + tpm_emu->established_flag_cached = 0; + return 0; }
Add a caching layer for the TPM established flag so that we don't need to go to the emulator every time the flag is read by accessing the REG_ACCESS register. Signed-off-by: Stefan Berger <stefanb@linux.vnet.ibm.com> v1->v2: - move the caching to the backend layer since detecting the TPM 1.2 TSC_ResetEstablishmentBit() command is easier to do here. --- hw/tpm/tpm_emulator.c | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-)