* [Qemu-devel] [PATCH 0/2] tpm: Improve on error handling @ 2019-07-25 10:58 Stefan Berger 2019-07-25 10:58 ` [Qemu-devel] [PATCH 1/2] tpm: Exit in reset when backend indicates failure Stefan Berger 2019-07-25 10:58 ` [Qemu-devel] [PATCH 2/2] tpm_emulator: Translate TPM error codes to strings Stefan Berger 0 siblings, 2 replies; 6+ messages in thread From: Stefan Berger @ 2019-07-25 10:58 UTC (permalink / raw) To: qemu-devel; +Cc: marcandre.lureau, Stefan Berger This series of patches improves error handling with the TPM backend. Stefan Stefan Berger (2): tpm: Exit in reset when backend indicates failure tpm_emulator: Translate TPM error codes to strings hw/tpm/tpm_crb.c | 4 +++- hw/tpm/tpm_emulator.c | 50 ++++++++++++++++++++++++++++++++++--------- hw/tpm/tpm_tis.c | 4 +++- 3 files changed, 46 insertions(+), 12 deletions(-) -- 2.20.1 ^ permalink raw reply [flat|nested] 6+ messages in thread
* [Qemu-devel] [PATCH 1/2] tpm: Exit in reset when backend indicates failure 2019-07-25 10:58 [Qemu-devel] [PATCH 0/2] tpm: Improve on error handling Stefan Berger @ 2019-07-25 10:58 ` Stefan Berger 2019-07-25 11:34 ` Marc-André Lureau 2019-07-25 10:58 ` [Qemu-devel] [PATCH 2/2] tpm_emulator: Translate TPM error codes to strings Stefan Berger 1 sibling, 1 reply; 6+ messages in thread From: Stefan Berger @ 2019-07-25 10:58 UTC (permalink / raw) To: qemu-devel; +Cc: Stefan Berger, marcandre.lureau, Stefan Berger Exit() in the frontend reset function when the backend indicates intialization failure. Signed-off-by: Stefan Berger <stefanb@linux.ibm.com> --- hw/tpm/tpm_crb.c | 4 +++- hw/tpm/tpm_tis.c | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/hw/tpm/tpm_crb.c b/hw/tpm/tpm_crb.c index 5e2db9e0c4..db0e3e7c67 100644 --- a/hw/tpm/tpm_crb.c +++ b/hw/tpm/tpm_crb.c @@ -273,7 +273,9 @@ static void tpm_crb_reset(void *dev) s->be_buffer_size = MIN(tpm_backend_get_buffer_size(s->tpmbe), CRB_CTRL_CMD_SIZE); - tpm_backend_startup_tpm(s->tpmbe, s->be_buffer_size); + if (tpm_backend_startup_tpm(s->tpmbe, s->be_buffer_size) < 0) { + exit(1); + } } static void tpm_crb_realize(DeviceState *dev, Error **errp) diff --git a/hw/tpm/tpm_tis.c b/hw/tpm/tpm_tis.c index 174618ac30..d6b3212890 100644 --- a/hw/tpm/tpm_tis.c +++ b/hw/tpm/tpm_tis.c @@ -910,7 +910,9 @@ static void tpm_tis_reset(DeviceState *dev) s->rw_offset = 0; } - tpm_backend_startup_tpm(s->be_driver, s->be_buffer_size); + if (tpm_backend_startup_tpm(s->be_driver, s->be_buffer_size) < 0) { + exit(1); + } } /* persistent state handling */ -- 2.20.1 ^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [Qemu-devel] [PATCH 1/2] tpm: Exit in reset when backend indicates failure 2019-07-25 10:58 ` [Qemu-devel] [PATCH 1/2] tpm: Exit in reset when backend indicates failure Stefan Berger @ 2019-07-25 11:34 ` Marc-André Lureau 0 siblings, 0 replies; 6+ messages in thread From: Marc-André Lureau @ 2019-07-25 11:34 UTC (permalink / raw) To: Stefan Berger; +Cc: QEMU, Stefan Berger On Thu, Jul 25, 2019 at 2:58 PM Stefan Berger <stefanb@linux.vnet.ibm.com> wrote: > > Exit() in the frontend reset function when the backend indicates > intialization failure. > > Signed-off-by: Stefan Berger <stefanb@linux.ibm.com> Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com> > --- > hw/tpm/tpm_crb.c | 4 +++- > hw/tpm/tpm_tis.c | 4 +++- > 2 files changed, 6 insertions(+), 2 deletions(-) > > diff --git a/hw/tpm/tpm_crb.c b/hw/tpm/tpm_crb.c > index 5e2db9e0c4..db0e3e7c67 100644 > --- a/hw/tpm/tpm_crb.c > +++ b/hw/tpm/tpm_crb.c > @@ -273,7 +273,9 @@ static void tpm_crb_reset(void *dev) > s->be_buffer_size = MIN(tpm_backend_get_buffer_size(s->tpmbe), > CRB_CTRL_CMD_SIZE); > > - tpm_backend_startup_tpm(s->tpmbe, s->be_buffer_size); > + if (tpm_backend_startup_tpm(s->tpmbe, s->be_buffer_size) < 0) { > + exit(1); > + } > } > > static void tpm_crb_realize(DeviceState *dev, Error **errp) > diff --git a/hw/tpm/tpm_tis.c b/hw/tpm/tpm_tis.c > index 174618ac30..d6b3212890 100644 > --- a/hw/tpm/tpm_tis.c > +++ b/hw/tpm/tpm_tis.c > @@ -910,7 +910,9 @@ static void tpm_tis_reset(DeviceState *dev) > s->rw_offset = 0; > } > > - tpm_backend_startup_tpm(s->be_driver, s->be_buffer_size); > + if (tpm_backend_startup_tpm(s->be_driver, s->be_buffer_size) < 0) { > + exit(1); > + } > } > > /* persistent state handling */ > -- > 2.20.1 > -- Marc-André Lureau ^ permalink raw reply [flat|nested] 6+ messages in thread
* [Qemu-devel] [PATCH 2/2] tpm_emulator: Translate TPM error codes to strings 2019-07-25 10:58 [Qemu-devel] [PATCH 0/2] tpm: Improve on error handling Stefan Berger 2019-07-25 10:58 ` [Qemu-devel] [PATCH 1/2] tpm: Exit in reset when backend indicates failure Stefan Berger @ 2019-07-25 10:58 ` Stefan Berger 2019-07-25 11:08 ` Marc-André Lureau 1 sibling, 1 reply; 6+ messages in thread From: Stefan Berger @ 2019-07-25 10:58 UTC (permalink / raw) To: qemu-devel; +Cc: Stefan Berger, marcandre.lureau, Stefan Berger Implement a function to translate TPM error codes to strings so that at least the most common error codes can be translated to human readable strings. Signed-off-by: Stefan Berger <stefanb@linux.ibm.com> --- hw/tpm/tpm_emulator.c | 50 ++++++++++++++++++++++++++++++++++--------- 1 file changed, 40 insertions(+), 10 deletions(-) diff --git a/hw/tpm/tpm_emulator.c b/hw/tpm/tpm_emulator.c index 1288cbcb8d..186dde0838 100644 --- a/hw/tpm/tpm_emulator.c +++ b/hw/tpm/tpm_emulator.c @@ -82,6 +82,30 @@ typedef struct TPMEmulator { TPMBlobBuffers state_blobs; } TPMEmulator; +struct tpm_error { + uint32_t tpm_result; + const char *string; +}; + +static const struct tpm_error tpm_errors[] = { + { 9 , "operation failed" }, + { 32, "encryption error" }, + { 33, "decryption error" }, + /* TPM 2 codes */ + { 0x101, "operation failed" }, +}; + +static const char *tpm_emulator_strerror(uint32_t tpm_result) +{ + size_t i; + + for (i = 0; i < ARRAY_SIZE(tpm_errors); i++) { + if (tpm_errors[i].tpm_result == tpm_result) { + return tpm_errors[i].string; + } + } + return ""; +} static int tpm_emulator_ctrlcmd(TPMEmulator *tpm, unsigned long cmd, void *msg, size_t msg_len_in, size_t msg_len_out) @@ -264,7 +288,8 @@ static int tpm_emulator_stop_tpm(TPMBackend *tb) res = be32_to_cpu(res); if (res) { - error_report("tpm-emulator: TPM result for CMD_STOP: 0x%x", res); + error_report("tpm-emulator: TPM result for CMD_STOP: 0x%x %s", res, + tpm_emulator_strerror(res)); return -1; } @@ -293,8 +318,9 @@ static int tpm_emulator_set_buffer_size(TPMBackend *tb, psbs.u.resp.tpm_result = be32_to_cpu(psbs.u.resp.tpm_result); if (psbs.u.resp.tpm_result != 0) { - error_report("tpm-emulator: TPM result for set buffer size : 0x%x", - psbs.u.resp.tpm_result); + error_report("tpm-emulator: TPM result for set buffer size : 0x%x %s", + psbs.u.resp.tpm_result, + tpm_emulator_strerror(psbs.u.resp.tpm_result)); return -1; } @@ -339,7 +365,8 @@ static int tpm_emulator_startup_tpm_resume(TPMBackend *tb, size_t buffersize, res = be32_to_cpu(init.u.resp.tpm_result); if (res) { - error_report("tpm-emulator: TPM result for CMD_INIT: 0x%x", res); + error_report("tpm-emulator: TPM result for CMD_INIT: 0x%x %s", res, + tpm_emulator_strerror(res)); goto err_exit; } return 0; @@ -399,8 +426,9 @@ static int tpm_emulator_reset_tpm_established_flag(TPMBackend *tb, res = be32_to_cpu(reset_est.u.resp.tpm_result); if (res) { - error_report("tpm-emulator: TPM result for rest establixhed flag: 0x%x", - res); + error_report( + "tpm-emulator: TPM result for rest establixhed flag: 0x%x %s", + res, tpm_emulator_strerror(res)); return -1; } @@ -638,7 +666,8 @@ static int tpm_emulator_get_state_blob(TPMEmulator *tpm_emu, res = be32_to_cpu(pgs.u.resp.tpm_result); if (res != 0 && (res & 0x800) == 0) { error_report("tpm-emulator: Getting the stateblob (type %d) failed " - "with a TPM error 0x%x", type, res); + "with a TPM error 0x%x %s", type, res, + tpm_emulator_strerror(res)); return -1; } @@ -758,7 +787,8 @@ static int tpm_emulator_set_state_blob(TPMEmulator *tpm_emu, tpm_result = be32_to_cpu(pss.u.resp.tpm_result); if (tpm_result != 0) { error_report("tpm-emulator: Setting the stateblob (type %d) failed " - "with a TPM error 0x%x", type, tpm_result); + "with a TPM error 0x%x %s", type, tpm_result, + tpm_emulator_strerror(tpm_result)); return -1; } @@ -888,8 +918,8 @@ static void tpm_emulator_shutdown(TPMEmulator *tpm_emu) error_report("tpm-emulator: Could not cleanly shutdown the TPM: %s", strerror(errno)); } else if (res != 0) { - error_report("tpm-emulator: TPM result for sutdown: 0x%x", - be32_to_cpu(res)); + error_report("tpm-emulator: TPM result for shutdown: 0x%x %s", + be32_to_cpu(res), tpm_emulator_strerror(be32_to_cpu(res))); } } -- 2.20.1 ^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [Qemu-devel] [PATCH 2/2] tpm_emulator: Translate TPM error codes to strings 2019-07-25 10:58 ` [Qemu-devel] [PATCH 2/2] tpm_emulator: Translate TPM error codes to strings Stefan Berger @ 2019-07-25 11:08 ` Marc-André Lureau 2019-07-25 14:35 ` Stefan Berger 0 siblings, 1 reply; 6+ messages in thread From: Marc-André Lureau @ 2019-07-25 11:08 UTC (permalink / raw) To: Stefan Berger; +Cc: QEMU, Stefan Berger Hi On Thu, Jul 25, 2019 at 2:58 PM Stefan Berger <stefanb@linux.vnet.ibm.com> wrote: > > Implement a function to translate TPM error codes to strings so that > at least the most common error codes can be translated to human > readable strings. > > Signed-off-by: Stefan Berger <stefanb@linux.ibm.com> > --- > hw/tpm/tpm_emulator.c | 50 ++++++++++++++++++++++++++++++++++--------- > 1 file changed, 40 insertions(+), 10 deletions(-) > > diff --git a/hw/tpm/tpm_emulator.c b/hw/tpm/tpm_emulator.c > index 1288cbcb8d..186dde0838 100644 > --- a/hw/tpm/tpm_emulator.c > +++ b/hw/tpm/tpm_emulator.c > @@ -82,6 +82,30 @@ typedef struct TPMEmulator { > TPMBlobBuffers state_blobs; > } TPMEmulator; > > +struct tpm_error { > + uint32_t tpm_result; > + const char *string; > +}; > + > +static const struct tpm_error tpm_errors[] = { > + { 9 , "operation failed" }, > + { 32, "encryption error" }, > + { 33, "decryption error" }, > + /* TPM 2 codes */ > + { 0x101, "operation failed" }, > +}; Wouldn't those codes be better defined in tpm_ioctl.h? > + > +static const char *tpm_emulator_strerror(uint32_t tpm_result) > +{ > + size_t i; > + > + for (i = 0; i < ARRAY_SIZE(tpm_errors); i++) { > + if (tpm_errors[i].tpm_result == tpm_result) { > + return tpm_errors[i].string; > + } > + } > + return ""; > +} > > static int tpm_emulator_ctrlcmd(TPMEmulator *tpm, unsigned long cmd, void *msg, > size_t msg_len_in, size_t msg_len_out) > @@ -264,7 +288,8 @@ static int tpm_emulator_stop_tpm(TPMBackend *tb) > > res = be32_to_cpu(res); > if (res) { > - error_report("tpm-emulator: TPM result for CMD_STOP: 0x%x", res); > + error_report("tpm-emulator: TPM result for CMD_STOP: 0x%x %s", res, > + tpm_emulator_strerror(res)); > return -1; > } > > @@ -293,8 +318,9 @@ static int tpm_emulator_set_buffer_size(TPMBackend *tb, > > psbs.u.resp.tpm_result = be32_to_cpu(psbs.u.resp.tpm_result); > if (psbs.u.resp.tpm_result != 0) { > - error_report("tpm-emulator: TPM result for set buffer size : 0x%x", > - psbs.u.resp.tpm_result); > + error_report("tpm-emulator: TPM result for set buffer size : 0x%x %s", > + psbs.u.resp.tpm_result, > + tpm_emulator_strerror(psbs.u.resp.tpm_result)); > return -1; > } > > @@ -339,7 +365,8 @@ static int tpm_emulator_startup_tpm_resume(TPMBackend *tb, size_t buffersize, > > res = be32_to_cpu(init.u.resp.tpm_result); > if (res) { > - error_report("tpm-emulator: TPM result for CMD_INIT: 0x%x", res); > + error_report("tpm-emulator: TPM result for CMD_INIT: 0x%x %s", res, > + tpm_emulator_strerror(res)); > goto err_exit; > } > return 0; > @@ -399,8 +426,9 @@ static int tpm_emulator_reset_tpm_established_flag(TPMBackend *tb, > > res = be32_to_cpu(reset_est.u.resp.tpm_result); > if (res) { > - error_report("tpm-emulator: TPM result for rest establixhed flag: 0x%x", > - res); > + error_report( > + "tpm-emulator: TPM result for rest establixhed flag: 0x%x %s", > + res, tpm_emulator_strerror(res)); > return -1; > } > > @@ -638,7 +666,8 @@ static int tpm_emulator_get_state_blob(TPMEmulator *tpm_emu, > res = be32_to_cpu(pgs.u.resp.tpm_result); > if (res != 0 && (res & 0x800) == 0) { > error_report("tpm-emulator: Getting the stateblob (type %d) failed " > - "with a TPM error 0x%x", type, res); > + "with a TPM error 0x%x %s", type, res, > + tpm_emulator_strerror(res)); > return -1; > } > > @@ -758,7 +787,8 @@ static int tpm_emulator_set_state_blob(TPMEmulator *tpm_emu, > tpm_result = be32_to_cpu(pss.u.resp.tpm_result); > if (tpm_result != 0) { > error_report("tpm-emulator: Setting the stateblob (type %d) failed " > - "with a TPM error 0x%x", type, tpm_result); > + "with a TPM error 0x%x %s", type, tpm_result, > + tpm_emulator_strerror(tpm_result)); > return -1; > } > > @@ -888,8 +918,8 @@ static void tpm_emulator_shutdown(TPMEmulator *tpm_emu) > error_report("tpm-emulator: Could not cleanly shutdown the TPM: %s", > strerror(errno)); > } else if (res != 0) { > - error_report("tpm-emulator: TPM result for sutdown: 0x%x", > - be32_to_cpu(res)); > + error_report("tpm-emulator: TPM result for shutdown: 0x%x %s", > + be32_to_cpu(res), tpm_emulator_strerror(be32_to_cpu(res))); > } > } lgtm > > -- > 2.20.1 > -- Marc-André Lureau ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [Qemu-devel] [PATCH 2/2] tpm_emulator: Translate TPM error codes to strings 2019-07-25 11:08 ` Marc-André Lureau @ 2019-07-25 14:35 ` Stefan Berger 0 siblings, 0 replies; 6+ messages in thread From: Stefan Berger @ 2019-07-25 14:35 UTC (permalink / raw) To: Marc-André Lureau, Stefan Berger; +Cc: QEMU On 7/25/19 7:08 AM, Marc-André Lureau wrote: > Hi > > On Thu, Jul 25, 2019 at 2:58 PM Stefan Berger > <stefanb@linux.vnet.ibm.com> wrote: >> Implement a function to translate TPM error codes to strings so that >> at least the most common error codes can be translated to human >> readable strings. >> >> Signed-off-by: Stefan Berger <stefanb@linux.ibm.com> >> --- >> hw/tpm/tpm_emulator.c | 50 ++++++++++++++++++++++++++++++++++--------- >> 1 file changed, 40 insertions(+), 10 deletions(-) >> >> diff --git a/hw/tpm/tpm_emulator.c b/hw/tpm/tpm_emulator.c >> index 1288cbcb8d..186dde0838 100644 >> --- a/hw/tpm/tpm_emulator.c >> +++ b/hw/tpm/tpm_emulator.c >> @@ -82,6 +82,30 @@ typedef struct TPMEmulator { >> TPMBlobBuffers state_blobs; >> } TPMEmulator; >> >> +struct tpm_error { >> + uint32_t tpm_result; >> + const char *string; >> +}; >> + >> +static const struct tpm_error tpm_errors[] = { >> + { 9 , "operation failed" }, >> + { 32, "encryption error" }, >> + { 33, "decryption error" }, >> + /* TPM 2 codes */ >> + { 0x101, "operation failed" }, >> +}; > Wouldn't those codes be better defined in tpm_ioctl.h? tpm_int.h has some already. will add some more there. Stefan ^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2019-07-25 14:36 UTC | newest] Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2019-07-25 10:58 [Qemu-devel] [PATCH 0/2] tpm: Improve on error handling Stefan Berger 2019-07-25 10:58 ` [Qemu-devel] [PATCH 1/2] tpm: Exit in reset when backend indicates failure Stefan Berger 2019-07-25 11:34 ` Marc-André Lureau 2019-07-25 10:58 ` [Qemu-devel] [PATCH 2/2] tpm_emulator: Translate TPM error codes to strings Stefan Berger 2019-07-25 11:08 ` Marc-André Lureau 2019-07-25 14:35 ` Stefan Berger
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.