* [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
* [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 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
* 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.