tpmdd-devel.lists.sourceforge.net archive mirror
 help / color / mirror / Atom feed
* [PATCH 1/3] tpm2-cmd: Trigger only missing self tests
@ 2017-08-18 12:15 Alexander Steffen
       [not found] ` <20170818121532.5764-1-Alexander.Steffen-d0qZbvYSIPpWk0Htik3J/w@public.gmane.org>
  0 siblings, 1 reply; 8+ messages in thread
From: Alexander Steffen @ 2017-08-18 12:15 UTC (permalink / raw)
  To: jarkko.sakkinen-VuQAYsv1563Yd54FQh9/CA,
	tpmdd-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f

tpm2_do_selftest is only used during initialization of the TPM to ensure
that the device functions correctly. Therefore, it is sufficient to request
only missing self tests (parameter full_test=0), not a reexecution of all
self tests, as was done before. This allows for a faster execution of this
command.

Signed-off-by: Alexander Steffen <Alexander.Steffen-d0qZbvYSIPpWk0Htik3J/w@public.gmane.org>
---
 drivers/char/tpm/tpm2-cmd.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/char/tpm/tpm2-cmd.c b/drivers/char/tpm/tpm2-cmd.c
index f7f34b2a..7e328d6 100644
--- a/drivers/char/tpm/tpm2-cmd.c
+++ b/drivers/char/tpm/tpm2-cmd.c
@@ -865,7 +865,7 @@ static int tpm2_start_selftest(struct tpm_chip *chip, bool full)
 }
 
 /**
- * tpm2_do_selftest() - run a full self test
+ * tpm2_do_selftest() - ensure that all self tests have passed
  *
  * @chip: TPM chip to use
  *
@@ -886,7 +886,7 @@ static int tpm2_do_selftest(struct tpm_chip *chip)
 
 	loops = jiffies_to_msecs(duration) / delay_msec;
 
-	rc = tpm2_start_selftest(chip, true);
+	rc = tpm2_start_selftest(chip, false);
 	if (rc)
 		return rc;
 
-- 
2.7.4


------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot

^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [PATCH 2/3] tpm2-cmd: Use dynamic delay to wait for self test result
       [not found] ` <20170818121532.5764-1-Alexander.Steffen-d0qZbvYSIPpWk0Htik3J/w@public.gmane.org>
@ 2017-08-18 12:15   ` Alexander Steffen
       [not found]     ` <20170818121532.5764-2-Alexander.Steffen-d0qZbvYSIPpWk0Htik3J/w@public.gmane.org>
  2017-08-18 12:15   ` [PATCH 3/3] tpm2-cmd: React correctly to RC_TESTING from self tests Alexander Steffen
                     ` (2 subsequent siblings)
  3 siblings, 1 reply; 8+ messages in thread
From: Alexander Steffen @ 2017-08-18 12:15 UTC (permalink / raw)
  To: jarkko.sakkinen-VuQAYsv1563Yd54FQh9/CA,
	tpmdd-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f

In order to avoid delaying the code longer than necessary while still
giving the TPM enough time to execute the self tests asynchronously, start
with a small delay between two polls and increase it each round.

Signed-off-by: Alexander Steffen <Alexander.Steffen-d0qZbvYSIPpWk0Htik3J/w@public.gmane.org>
---
 drivers/char/tpm/tpm2-cmd.c | 17 +++++++++--------
 1 file changed, 9 insertions(+), 8 deletions(-)

diff --git a/drivers/char/tpm/tpm2-cmd.c b/drivers/char/tpm/tpm2-cmd.c
index 7e328d6..e3d4cc3 100644
--- a/drivers/char/tpm/tpm2-cmd.c
+++ b/drivers/char/tpm/tpm2-cmd.c
@@ -877,20 +877,17 @@ static int tpm2_start_selftest(struct tpm_chip *chip, bool full)
 static int tpm2_do_selftest(struct tpm_chip *chip)
 {
 	int rc;
-	unsigned int loops;
-	unsigned int delay_msec = 100;
-	unsigned long duration;
-	int i;
-
-	duration = tpm2_calc_ordinal_duration(chip, TPM2_CC_SELF_TEST);
+	unsigned int delay_msec = 20;
+	long duration;
 
-	loops = jiffies_to_msecs(duration) / delay_msec;
+	duration = jiffies_to_msecs(
+		tpm2_calc_ordinal_duration(chip, TPM2_CC_SELF_TEST));
 
 	rc = tpm2_start_selftest(chip, false);
 	if (rc)
 		return rc;
 
-	for (i = 0; i < loops; i++) {
+	while (duration > 0) {
 		/* Attempt to read a PCR value */
 		rc = tpm2_pcr_read(chip, 0, NULL);
 		if (rc < 0)
@@ -900,6 +897,10 @@ static int tpm2_do_selftest(struct tpm_chip *chip)
 			break;
 
 		msleep(delay_msec);
+		duration -= delay_msec;
+
+		/* wait longer the next round */
+		delay_msec *= 2;
 	}
 
 	return rc;
-- 
2.7.4


------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot

^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [PATCH 3/3] tpm2-cmd: React correctly to RC_TESTING from self tests
       [not found] ` <20170818121532.5764-1-Alexander.Steffen-d0qZbvYSIPpWk0Htik3J/w@public.gmane.org>
  2017-08-18 12:15   ` [PATCH 2/3] tpm2-cmd: Use dynamic delay to wait for self test result Alexander Steffen
@ 2017-08-18 12:15   ` Alexander Steffen
       [not found]     ` <20170818121532.5764-3-Alexander.Steffen-d0qZbvYSIPpWk0Htik3J/w@public.gmane.org>
  2017-08-19 17:16   ` [PATCH 1/3] tpm2-cmd: Trigger only missing " Jarkko Sakkinen
  2017-08-20 18:25   ` Jarkko Sakkinen
  3 siblings, 1 reply; 8+ messages in thread
From: Alexander Steffen @ 2017-08-18 12:15 UTC (permalink / raw)
  To: jarkko.sakkinen-VuQAYsv1563Yd54FQh9/CA,
	tpmdd-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f

The TPM can choose one of two ways to react to the TPM2_SelfTest command.
It can either run all self tests synchronously and then return RC_SUCCESS
once all tests were successful. Or it can choose to run the tests
asynchronously and return RC_TESTING immediately while the self tests still
execute in the background.

The previous implementation apparently was not aware of those possibilities
and attributed RC_TESTING to some prototype chips instead. With this change
the return code of TPM2_SelfTest is interpreted correctly, i.e. the self
test result is polled if and only if RC_TESTING is received. Unfortunately,
the polling cannot be done in the most straightforward way, so the solution
is explained with a comment in the code.

Signed-off-by: Alexander Steffen <Alexander.Steffen-d0qZbvYSIPpWk0Htik3J/w@public.gmane.org>
---
 drivers/char/tpm/tpm2-cmd.c | 68 ++++++++++++++++++---------------------------
 1 file changed, 27 insertions(+), 41 deletions(-)

diff --git a/drivers/char/tpm/tpm2-cmd.c b/drivers/char/tpm/tpm2-cmd.c
index e3d4cc3..d09032f 100644
--- a/drivers/char/tpm/tpm2-cmd.c
+++ b/drivers/char/tpm/tpm2-cmd.c
@@ -834,68 +834,54 @@ static const struct tpm_input_header tpm2_selftest_header = {
 };
 
 /**
- * tpm2_continue_selftest() - start a self test
- *
- * @chip: TPM chip to use
- * @full: test all commands instead of testing only those that were not
- *        previously tested.
- *
- * Return: Same as with tpm_transmit_cmd with exception of RC_TESTING.
- */
-static int tpm2_start_selftest(struct tpm_chip *chip, bool full)
-{
-	int rc;
-	struct tpm2_cmd cmd;
-
-	cmd.header.in = tpm2_selftest_header;
-	cmd.params.selftest_in.full_test = full;
-
-	rc = tpm_transmit_cmd(chip, NULL, &cmd, TPM2_SELF_TEST_IN_SIZE, 0, 0,
-			      "continue selftest");
-
-	/* At least some prototype chips seem to give RC_TESTING error
-	 * immediately. This is a workaround for that.
-	 */
-	if (rc == TPM2_RC_TESTING) {
-		dev_warn(&chip->dev, "Got RC_TESTING, ignoring\n");
-		rc = 0;
-	}
-
-	return rc;
-}
-
-/**
  * tpm2_do_selftest() - ensure that all self tests have passed
  *
  * @chip: TPM chip to use
  *
  * Return: Same as with tpm_transmit_cmd.
  *
- * During the self test TPM2 commands return with the error code RC_TESTING.
- * Waiting is done by issuing PCR read until it executes successfully.
+ * The TPM can either run all self tests synchronously and then return
+ * RC_SUCCESS once all tests were successful. Or it can choose to run the tests
+ * asynchronously and return RC_TESTING immediately while the self tests still
+ * execute in the background. This function handles both cases and waits until
+ * all tests have completed.
  */
 static int tpm2_do_selftest(struct tpm_chip *chip)
 {
 	int rc;
 	unsigned int delay_msec = 20;
 	long duration;
+	struct tpm2_cmd cmd;
 
 	duration = jiffies_to_msecs(
 		tpm2_calc_ordinal_duration(chip, TPM2_CC_SELF_TEST));
 
-	rc = tpm2_start_selftest(chip, false);
-	if (rc)
-		return rc;
-
 	while (duration > 0) {
-		/* Attempt to read a PCR value */
-		rc = tpm2_pcr_read(chip, 0, NULL);
-		if (rc < 0)
-			break;
+		cmd.header.in = tpm2_selftest_header;
+		cmd.params.selftest_in.full_test = 0;
+
+		rc = tpm_transmit_cmd(chip, NULL, &cmd, TPM2_SELF_TEST_IN_SIZE,
+				      0, 0, "continue selftest");
 
 		if (rc != TPM2_RC_TESTING)
 			break;
 
+		/* If RC_TESTING is received, ideally the code should now poll
+		 * the selfTestDone bit in the STS register, as this avoids
+		 * sending more commands, that might interrupt self tests
+		 * executing in the background and thus prevent them from ever
+		 * completing.
+		 * Unfortunately, it cannot be guaranteed that this bit is
+		 * correctly implemented for all devices, so the next best thing
+		 * would be to use TPM2_GetTestResult to query the test result.
+		 * But the response to that command can be very long, and the
+		 * code currently lacks the capabilities for efficient
+		 * unmarshalling, so it is difficult to execute this command.
+		 * Therefore, we simply run the TPM2_SelfTest command in a loop,
+		 * which should complete eventually, since we only request the
+		 * execution of self tests that have not yet been done.
+		 */
+
 		msleep(delay_msec);
 		duration -= delay_msec;
 
-- 
2.7.4


------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot

^ permalink raw reply related	[flat|nested] 8+ messages in thread

* Re: [PATCH 1/3] tpm2-cmd: Trigger only missing self tests
       [not found] ` <20170818121532.5764-1-Alexander.Steffen-d0qZbvYSIPpWk0Htik3J/w@public.gmane.org>
  2017-08-18 12:15   ` [PATCH 2/3] tpm2-cmd: Use dynamic delay to wait for self test result Alexander Steffen
  2017-08-18 12:15   ` [PATCH 3/3] tpm2-cmd: React correctly to RC_TESTING from self tests Alexander Steffen
@ 2017-08-19 17:16   ` Jarkko Sakkinen
  2017-08-20 18:25   ` Jarkko Sakkinen
  3 siblings, 0 replies; 8+ messages in thread
From: Jarkko Sakkinen @ 2017-08-19 17:16 UTC (permalink / raw)
  To: Alexander Steffen; +Cc: tpmdd-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f

On Fri, Aug 18, 2017 at 02:15:30PM +0200, Alexander Steffen wrote:
> tpm2_do_selftest is only used during initialization of the TPM to ensure
> that the device functions correctly. Therefore, it is sufficient to request
> only missing self tests (parameter full_test=0), not a reexecution of all
> self tests, as was done before. This allows for a faster execution of this
> command.
> 
> Signed-off-by: Alexander Steffen <Alexander.Steffen-d0qZbvYSIPpWk0Htik3J/w@public.gmane.org>

Where is the cover letter?

/Jarkko

> ---
>  drivers/char/tpm/tpm2-cmd.c | 4 ++--
>  1 file changed, 2 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/char/tpm/tpm2-cmd.c b/drivers/char/tpm/tpm2-cmd.c
> index f7f34b2a..7e328d6 100644
> --- a/drivers/char/tpm/tpm2-cmd.c
> +++ b/drivers/char/tpm/tpm2-cmd.c
> @@ -865,7 +865,7 @@ static int tpm2_start_selftest(struct tpm_chip *chip, bool full)
>  }
>  
>  /**
> - * tpm2_do_selftest() - run a full self test
> + * tpm2_do_selftest() - ensure that all self tests have passed
>   *
>   * @chip: TPM chip to use
>   *
> @@ -886,7 +886,7 @@ static int tpm2_do_selftest(struct tpm_chip *chip)
>  
>  	loops = jiffies_to_msecs(duration) / delay_msec;
>  
> -	rc = tpm2_start_selftest(chip, true);
> +	rc = tpm2_start_selftest(chip, false);
>  	if (rc)
>  		return rc;
>  
> -- 
> 2.7.4
> 

------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH 1/3] tpm2-cmd: Trigger only missing self tests
       [not found] ` <20170818121532.5764-1-Alexander.Steffen-d0qZbvYSIPpWk0Htik3J/w@public.gmane.org>
                     ` (2 preceding siblings ...)
  2017-08-19 17:16   ` [PATCH 1/3] tpm2-cmd: Trigger only missing " Jarkko Sakkinen
@ 2017-08-20 18:25   ` Jarkko Sakkinen
  3 siblings, 0 replies; 8+ messages in thread
From: Jarkko Sakkinen @ 2017-08-20 18:25 UTC (permalink / raw)
  To: Alexander Steffen; +Cc: tpmdd-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f

On Fri, Aug 18, 2017 at 02:15:30PM +0200, Alexander Steffen wrote:
> tpm2_do_selftest is only used during initialization of the TPM to ensure
> that the device functions correctly. Therefore, it is sufficient to request
> only missing self tests (parameter full_test=0), not a reexecution of all
> self tests, as was done before. This allows for a faster execution of this
> command.
> 
> Signed-off-by: Alexander Steffen <Alexander.Steffen-d0qZbvYSIPpWk0Htik3J/w@public.gmane.org>
> ---
>  drivers/char/tpm/tpm2-cmd.c | 4 ++--
>  1 file changed, 2 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/char/tpm/tpm2-cmd.c b/drivers/char/tpm/tpm2-cmd.c
> index f7f34b2a..7e328d6 100644
> --- a/drivers/char/tpm/tpm2-cmd.c
> +++ b/drivers/char/tpm/tpm2-cmd.c
> @@ -865,7 +865,7 @@ static int tpm2_start_selftest(struct tpm_chip *chip, bool full)
>  }
>  
>  /**
> - * tpm2_do_selftest() - run a full self test
> + * tpm2_do_selftest() - ensure that all self tests have passed
>   *
>   * @chip: TPM chip to use
>   *
> @@ -886,7 +886,7 @@ static int tpm2_do_selftest(struct tpm_chip *chip)
>  
>  	loops = jiffies_to_msecs(duration) / delay_msec;
>  
> -	rc = tpm2_start_selftest(chip, true);
> +	rc = tpm2_start_selftest(chip, false);
>  	if (rc)
>  		return rc;
>  
> -- 
> 2.7.4
> 

Reviewed-by: Jarkko Sakkinen <jarkko.sakkinen-VuQAYsv1563Yd54FQh9/CA@public.gmane.org>

/Jarkko

------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH 2/3] tpm2-cmd: Use dynamic delay to wait for self test result
       [not found]     ` <20170818121532.5764-2-Alexander.Steffen-d0qZbvYSIPpWk0Htik3J/w@public.gmane.org>
@ 2017-08-20 18:26       ` Jarkko Sakkinen
       [not found]         ` <20170820182632.ik4d5nfm2ggashiy-VuQAYsv1563Yd54FQh9/CA@public.gmane.org>
  0 siblings, 1 reply; 8+ messages in thread
From: Jarkko Sakkinen @ 2017-08-20 18:26 UTC (permalink / raw)
  To: Alexander Steffen; +Cc: tpmdd-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f

On Fri, Aug 18, 2017 at 02:15:31PM +0200, Alexander Steffen wrote:
> In order to avoid delaying the code longer than necessary while still
> giving the TPM enough time to execute the self tests asynchronously, start
> with a small delay between two polls and increase it each round.
> 
> Signed-off-by: Alexander Steffen <Alexander.Steffen-d0qZbvYSIPpWk0Htik3J/w@public.gmane.org>
> ---
>  drivers/char/tpm/tpm2-cmd.c | 17 +++++++++--------
>  1 file changed, 9 insertions(+), 8 deletions(-)
> 
> diff --git a/drivers/char/tpm/tpm2-cmd.c b/drivers/char/tpm/tpm2-cmd.c
> index 7e328d6..e3d4cc3 100644
> --- a/drivers/char/tpm/tpm2-cmd.c
> +++ b/drivers/char/tpm/tpm2-cmd.c
> @@ -877,20 +877,17 @@ static int tpm2_start_selftest(struct tpm_chip *chip, bool full)
>  static int tpm2_do_selftest(struct tpm_chip *chip)
>  {
>  	int rc;
> -	unsigned int loops;
> -	unsigned int delay_msec = 100;
> -	unsigned long duration;
> -	int i;
> -
> -	duration = tpm2_calc_ordinal_duration(chip, TPM2_CC_SELF_TEST);
> +	unsigned int delay_msec = 20;
> +	long duration;
>  
> -	loops = jiffies_to_msecs(duration) / delay_msec;
> +	duration = jiffies_to_msecs(
> +		tpm2_calc_ordinal_duration(chip, TPM2_CC_SELF_TEST));
>  
>  	rc = tpm2_start_selftest(chip, false);
>  	if (rc)
>  		return rc;
>  
> -	for (i = 0; i < loops; i++) {
> +	while (duration > 0) {
>  		/* Attempt to read a PCR value */
>  		rc = tpm2_pcr_read(chip, 0, NULL);
>  		if (rc < 0)
> @@ -900,6 +897,10 @@ static int tpm2_do_selftest(struct tpm_chip *chip)
>  			break;
>  
>  		msleep(delay_msec);
> +		duration -= delay_msec;
> +
> +		/* wait longer the next round */
> +		delay_msec *= 2;
>  	}
>  
>  	return rc;
> -- 
> 2.7.4
> 

Reviewed-by: Jarkko Sakkinen <jarkko.sakkinen-VuQAYsv1563Yd54FQh9/CA@public.gmane.org>

/Jarkko

------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH 3/3] tpm2-cmd: React correctly to RC_TESTING from self tests
       [not found]     ` <20170818121532.5764-3-Alexander.Steffen-d0qZbvYSIPpWk0Htik3J/w@public.gmane.org>
@ 2017-08-20 18:31       ` Jarkko Sakkinen
  0 siblings, 0 replies; 8+ messages in thread
From: Jarkko Sakkinen @ 2017-08-20 18:31 UTC (permalink / raw)
  To: Alexander Steffen; +Cc: tpmdd-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f

On Fri, Aug 18, 2017 at 02:15:32PM +0200, Alexander Steffen wrote:
> The TPM can choose one of two ways to react to the TPM2_SelfTest command.
> It can either run all self tests synchronously and then return RC_SUCCESS
> once all tests were successful. Or it can choose to run the tests
> asynchronously and return RC_TESTING immediately while the self tests still
> execute in the background.
> 
> The previous implementation apparently was not aware of those possibilities
> and attributed RC_TESTING to some prototype chips instead. With this change
> the return code of TPM2_SelfTest is interpreted correctly, i.e. the self
> test result is polled if and only if RC_TESTING is received. Unfortunately,
> the polling cannot be done in the most straightforward way, so the solution
> is explained with a comment in the code.
> 
> Signed-off-by: Alexander Steffen <Alexander.Steffen-d0qZbvYSIPpWk0Htik3J/w@public.gmane.org>
> ---
>  drivers/char/tpm/tpm2-cmd.c | 68 ++++++++++++++++++---------------------------
>  1 file changed, 27 insertions(+), 41 deletions(-)
> 
> diff --git a/drivers/char/tpm/tpm2-cmd.c b/drivers/char/tpm/tpm2-cmd.c
> index e3d4cc3..d09032f 100644
> --- a/drivers/char/tpm/tpm2-cmd.c
> +++ b/drivers/char/tpm/tpm2-cmd.c
> @@ -834,68 +834,54 @@ static const struct tpm_input_header tpm2_selftest_header = {
>  };
>  
>  /**
> - * tpm2_continue_selftest() - start a self test
> - *
> - * @chip: TPM chip to use
> - * @full: test all commands instead of testing only those that were not
> - *        previously tested.
> - *
> - * Return: Same as with tpm_transmit_cmd with exception of RC_TESTING.
> - */
> -static int tpm2_start_selftest(struct tpm_chip *chip, bool full)
> -{
> -	int rc;
> -	struct tpm2_cmd cmd;
> -
> -	cmd.header.in = tpm2_selftest_header;
> -	cmd.params.selftest_in.full_test = full;
> -
> -	rc = tpm_transmit_cmd(chip, NULL, &cmd, TPM2_SELF_TEST_IN_SIZE, 0, 0,
> -			      "continue selftest");
> -
> -	/* At least some prototype chips seem to give RC_TESTING error
> -	 * immediately. This is a workaround for that.
> -	 */
> -	if (rc == TPM2_RC_TESTING) {
> -		dev_warn(&chip->dev, "Got RC_TESTING, ignoring\n");
> -		rc = 0;
> -	}
> -
> -	return rc;
> -}
> -
> -/**
>   * tpm2_do_selftest() - ensure that all self tests have passed
>   *
>   * @chip: TPM chip to use
>   *
>   * Return: Same as with tpm_transmit_cmd.
>   *
> - * During the self test TPM2 commands return with the error code RC_TESTING.
> - * Waiting is done by issuing PCR read until it executes successfully.
> + * The TPM can either run all self tests synchronously and then return
> + * RC_SUCCESS once all tests were successful. Or it can choose to run the tests
> + * asynchronously and return RC_TESTING immediately while the self tests still
> + * execute in the background. This function handles both cases and waits until
> + * all tests have completed.
>   */
>  static int tpm2_do_selftest(struct tpm_chip *chip)
>  {
>  	int rc;
>  	unsigned int delay_msec = 20;
>  	long duration;
> +	struct tpm2_cmd cmd;
>  
>  	duration = jiffies_to_msecs(
>  		tpm2_calc_ordinal_duration(chip, TPM2_CC_SELF_TEST));
>  
> -	rc = tpm2_start_selftest(chip, false);
> -	if (rc)
> -		return rc;
> -
>  	while (duration > 0) {
> -		/* Attempt to read a PCR value */
> -		rc = tpm2_pcr_read(chip, 0, NULL);
> -		if (rc < 0)
> -			break;
> +		cmd.header.in = tpm2_selftest_header;
> +		cmd.params.selftest_in.full_test = 0;
> +
> +		rc = tpm_transmit_cmd(chip, NULL, &cmd, TPM2_SELF_TEST_IN_SIZE,
> +				      0, 0, "continue selftest");
>  
>  		if (rc != TPM2_RC_TESTING)
>  			break;
>  
> +		/* If RC_TESTING is received, ideally the code should now poll
> +		 * the selfTestDone bit in the STS register, as this avoids
> +		 * sending more commands, that might interrupt self tests
> +		 * executing in the background and thus prevent them from ever
> +		 * completing.
> +		 * Unfortunately, it cannot be guaranteed that this bit is
> +		 * correctly implemented for all devices, so the next best thing
> +		 * would be to use TPM2_GetTestResult to query the test result.
> +		 * But the response to that command can be very long, and the
> +		 * code currently lacks the capabilities for efficient
> +		 * unmarshalling, so it is difficult to execute this command.
> +		 * Therefore, we simply run the TPM2_SelfTest command in a loop,
> +		 * which should complete eventually, since we only request the
> +		 * execution of self tests that have not yet been done.
> +		 */

This should be part of the commit message, not part of the code.

/Jarkko

> +
>  		msleep(delay_msec);
>  		duration -= delay_msec;
>  
> -- 
> 2.7.4
> 

------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH 2/3] tpm2-cmd: Use dynamic delay to wait for self test result
       [not found]         ` <20170820182632.ik4d5nfm2ggashiy-VuQAYsv1563Yd54FQh9/CA@public.gmane.org>
@ 2017-08-22 17:44           ` Jarkko Sakkinen
  0 siblings, 0 replies; 8+ messages in thread
From: Jarkko Sakkinen @ 2017-08-22 17:44 UTC (permalink / raw)
  To: Alexander Steffen; +Cc: tpmdd-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f

On Sun, Aug 20, 2017 at 09:26:32PM +0300, Jarkko Sakkinen wrote:
> On Fri, Aug 18, 2017 at 02:15:31PM +0200, Alexander Steffen wrote:
> > In order to avoid delaying the code longer than necessary while still
> > giving the TPM enough time to execute the self tests asynchronously, start
> > with a small delay between two polls and increase it each round.
> > 
> > Signed-off-by: Alexander Steffen <Alexander.Steffen-d0qZbvYSIPpWk0Htik3J/w@public.gmane.org>
> > ---
> >  drivers/char/tpm/tpm2-cmd.c | 17 +++++++++--------
> >  1 file changed, 9 insertions(+), 8 deletions(-)
> > 
> > diff --git a/drivers/char/tpm/tpm2-cmd.c b/drivers/char/tpm/tpm2-cmd.c
> > index 7e328d6..e3d4cc3 100644
> > --- a/drivers/char/tpm/tpm2-cmd.c
> > +++ b/drivers/char/tpm/tpm2-cmd.c
> > @@ -877,20 +877,17 @@ static int tpm2_start_selftest(struct tpm_chip *chip, bool full)
> >  static int tpm2_do_selftest(struct tpm_chip *chip)
> >  {
> >  	int rc;
> > -	unsigned int loops;
> > -	unsigned int delay_msec = 100;
> > -	unsigned long duration;
> > -	int i;
> > -
> > -	duration = tpm2_calc_ordinal_duration(chip, TPM2_CC_SELF_TEST);
> > +	unsigned int delay_msec = 20;
> > +	long duration;
> >  
> > -	loops = jiffies_to_msecs(duration) / delay_msec;
> > +	duration = jiffies_to_msecs(
> > +		tpm2_calc_ordinal_duration(chip, TPM2_CC_SELF_TEST));
> >  
> >  	rc = tpm2_start_selftest(chip, false);
> >  	if (rc)
> >  		return rc;
> >  
> > -	for (i = 0; i < loops; i++) {
> > +	while (duration > 0) {
> >  		/* Attempt to read a PCR value */
> >  		rc = tpm2_pcr_read(chip, 0, NULL);
> >  		if (rc < 0)
> > @@ -900,6 +897,10 @@ static int tpm2_do_selftest(struct tpm_chip *chip)
> >  			break;
> >  
> >  		msleep(delay_msec);
> > +		duration -= delay_msec;
> > +
> > +		/* wait longer the next round */
> > +		delay_msec *= 2;
> >  	}
> >  
> >  	return rc;
> > -- 
> > 2.7.4
> > 
> 
> Reviewed-by: Jarkko Sakkinen <jarkko.sakkinen-VuQAYsv1563Yd54FQh9/CA@public.gmane.org>
> 
> /Jarkko


Applying: tpm2-cmd: Use dynamic delay to wait for self test result
error: sha1 information is lacking or useless (drivers/char/tpm/tpm2-cmd.c).
error: could not build fake ancestor
Patch failed at 0001 tpm2-cmd: Use dynamic delay to wait for self test result
The copy of the patch that failed is found in: .git/rebase-apply/patch
When you have resolved this problem, run "git am --continue".
If you prefer to skip this patch, run "git am --skip" instead.
To restore the original branch and stop patching, run "git am --abort".

Please rebase your patches.

/Jarkko

------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot

^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2017-08-22 17:44 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-08-18 12:15 [PATCH 1/3] tpm2-cmd: Trigger only missing self tests Alexander Steffen
     [not found] ` <20170818121532.5764-1-Alexander.Steffen-d0qZbvYSIPpWk0Htik3J/w@public.gmane.org>
2017-08-18 12:15   ` [PATCH 2/3] tpm2-cmd: Use dynamic delay to wait for self test result Alexander Steffen
     [not found]     ` <20170818121532.5764-2-Alexander.Steffen-d0qZbvYSIPpWk0Htik3J/w@public.gmane.org>
2017-08-20 18:26       ` Jarkko Sakkinen
     [not found]         ` <20170820182632.ik4d5nfm2ggashiy-VuQAYsv1563Yd54FQh9/CA@public.gmane.org>
2017-08-22 17:44           ` Jarkko Sakkinen
2017-08-18 12:15   ` [PATCH 3/3] tpm2-cmd: React correctly to RC_TESTING from self tests Alexander Steffen
     [not found]     ` <20170818121532.5764-3-Alexander.Steffen-d0qZbvYSIPpWk0Htik3J/w@public.gmane.org>
2017-08-20 18:31       ` Jarkko Sakkinen
2017-08-19 17:16   ` [PATCH 1/3] tpm2-cmd: Trigger only missing " Jarkko Sakkinen
2017-08-20 18:25   ` Jarkko Sakkinen

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).