diff mbox

[tpmdd-devel] Added Little Endian support to vtpm module

Message ID 525b5ba04c7d86f483ac11404cf15572@imap.linux.ibm.com
State Accepted, archived
Headers show

Commit Message

honclo Feb. 13, 2015, 2:02 a.m. UTC
The tpm_ibmvtpm module is affected by an unaligned access problem.
ibmvtpm_crq_get_version failed with rc=-4 during boot when vTPM is
enabled in Power partition, which supports both little endian and
big endian modes.

We added little endian support to fix this problem:
1) added cpu_to_be64 calls to ensure BE data is sent from an LE OS.
2) added be16_to_cpu and be32_to_cpu calls to make sure data received
   is in LE format on a LE OS.

Signed-off-by: Hon Ching(Vicky) Lo <honclo@linux.vnet.ibm.com>
Signed-off-by: Joy Latten <jmlatten@linux.vnet.ibm.com>
---
  drivers/char/tpm/tpm_ibmvtpm.c |   20 ++++++++++++--------
  1 files changed, 12 insertions(+), 8 deletions(-)

  		rc = 0;
@@ -186,7 +187,8 @@ static int ibmvtpm_crq_get_rtce_size(struct 
ibmvtpm_dev *ibmvtpm)
  	crq.valid = (u8)IBMVTPM_VALID_CMD;
  	crq.msg = (u8)VTPM_GET_RTCE_BUFFER_SIZE;

-	rc = ibmvtpm_send_crq(ibmvtpm->vdev, buf[0], buf[1]);
+	rc = ibmvtpm_send_crq(ibmvtpm->vdev, cpu_to_be64(buf[0]),
+			      cpu_to_be64(buf[1]));
  	if (rc != H_SUCCESS)
  		dev_err(ibmvtpm->dev,
  			"ibmvtpm_crq_get_rtce_size failed rc=%d\n", rc);
@@ -212,7 +214,8 @@ static int ibmvtpm_crq_get_version(struct 
ibmvtpm_dev *ibmvtpm)
  	crq.valid = (u8)IBMVTPM_VALID_CMD;
  	crq.msg = (u8)VTPM_GET_VERSION;

-	rc = ibmvtpm_send_crq(ibmvtpm->vdev, buf[0], buf[1]);
+	rc = ibmvtpm_send_crq(ibmvtpm->vdev, cpu_to_be64(buf[0]),
+			      cpu_to_be64(buf[1]));
  	if (rc != H_SUCCESS)
  		dev_err(ibmvtpm->dev,
  			"ibmvtpm_crq_get_version failed rc=%d\n", rc);
@@ -327,7 +330,8 @@ static int tpm_ibmvtpm_suspend(struct device *dev)
  	crq.valid = (u8)IBMVTPM_VALID_CMD;
  	crq.msg = (u8)VTPM_PREPARE_TO_SUSPEND;

-	rc = ibmvtpm_send_crq(ibmvtpm->vdev, buf[0], buf[1]);
+	rc = ibmvtpm_send_crq(ibmvtpm->vdev, cpu_to_be64(buf[0]),
+			      cpu_to_be64(buf[1]));
  	if (rc != H_SUCCESS)
  		dev_err(ibmvtpm->dev,
  			"tpm_ibmvtpm_suspend failed rc=%d\n", rc);
@@ -472,11 +476,11 @@ static void ibmvtpm_crq_process(struct ibmvtpm_crq 
*crq,
  	case IBMVTPM_VALID_CMD:
  		switch (crq->msg) {
  		case VTPM_GET_RTCE_BUFFER_SIZE_RES:
-			if (crq->len <= 0) {
+			if (be16_to_cpu(crq->len) <= 0) {
  				dev_err(ibmvtpm->dev, "Invalid rtce size\n");
  				return;
  			}
-			ibmvtpm->rtce_size = crq->len;
+			ibmvtpm->rtce_size = be16_to_cpu(crq->len);
  			ibmvtpm->rtce_buf = kmalloc(ibmvtpm->rtce_size,
  						    GFP_KERNEL);
  			if (!ibmvtpm->rtce_buf) {
@@ -497,11 +501,11 @@ static void ibmvtpm_crq_process(struct ibmvtpm_crq 
*crq,

  			return;
  		case VTPM_GET_VERSION_RES:
-			ibmvtpm->vtpm_version = crq->data;
+			ibmvtpm->vtpm_version = be32_to_cpu(crq->data);
  			return;
  		case VTPM_TPM_COMMAND_RES:
  			/* len of the data in rtce buffer */
-			ibmvtpm->res_len = crq->len;
+			ibmvtpm->res_len = be16_to_cpu(crq->len);
  			wake_up_interruptible(&ibmvtpm->wq);
  			return;
  		default:

Comments

Ashley Lai Feb. 13, 2015, 10:25 p.m. UTC | #1
Looks good to me.

Reviewed-by: Ashley Lai <ashley@ahsleylai.com>

Thanks,
--Ashley

On Thu, 12 Feb 2015, honclo wrote:

> The tpm_ibmvtpm module is affected by an unaligned access problem.
> ibmvtpm_crq_get_version failed with rc=-4 during boot when vTPM is
> enabled in Power partition, which supports both little endian and
> big endian modes.
>
> We added little endian support to fix this problem:
> 1) added cpu_to_be64 calls to ensure BE data is sent from an LE OS.
> 2) added be16_to_cpu and be32_to_cpu calls to make sure data received
>   is in LE format on a LE OS.
>
> Signed-off-by: Hon Ching(Vicky) Lo <honclo@linux.vnet.ibm.com>
> Signed-off-by: Joy Latten <jmlatten@linux.vnet.ibm.com>
> ---
>  drivers/char/tpm/tpm_ibmvtpm.c |   20 ++++++++++++--------
>  1 files changed, 12 insertions(+), 8 deletions(-)
>
> diff --git a/drivers/char/tpm/tpm_ibmvtpm.c
> b/drivers/char/tpm/tpm_ibmvtpm.c
> index af74c57..1632242 100644
> --- a/drivers/char/tpm/tpm_ibmvtpm.c
> +++ b/drivers/char/tpm/tpm_ibmvtpm.c
> @@ -148,7 +148,8 @@ static int tpm_ibmvtpm_send(struct tpm_chip *chip,
> u8 *buf, size_t count)
>  	crq.len = (u16)count;
>  	crq.data = ibmvtpm->rtce_dma_handle;
>
> -	rc = ibmvtpm_send_crq(ibmvtpm->vdev, word[0], word[1]);
> +	rc = ibmvtpm_send_crq(ibmvtpm->vdev, cpu_to_be64(word[0]),
> +			      cpu_to_be64(word[1]));
>  	if (rc != H_SUCCESS) {
>  		dev_err(ibmvtpm->dev, "tpm_ibmvtpm_send failed rc=%d\n", rc);
>  		rc = 0;
> @@ -186,7 +187,8 @@ static int ibmvtpm_crq_get_rtce_size(struct
> ibmvtpm_dev *ibmvtpm)
>  	crq.valid = (u8)IBMVTPM_VALID_CMD;
>  	crq.msg = (u8)VTPM_GET_RTCE_BUFFER_SIZE;
>
> -	rc = ibmvtpm_send_crq(ibmvtpm->vdev, buf[0], buf[1]);
> +	rc = ibmvtpm_send_crq(ibmvtpm->vdev, cpu_to_be64(buf[0]),
> +			      cpu_to_be64(buf[1]));
>  	if (rc != H_SUCCESS)
>  		dev_err(ibmvtpm->dev,
>  			"ibmvtpm_crq_get_rtce_size failed rc=%d\n", rc);
> @@ -212,7 +214,8 @@ static int ibmvtpm_crq_get_version(struct
> ibmvtpm_dev *ibmvtpm)
>  	crq.valid = (u8)IBMVTPM_VALID_CMD;
>  	crq.msg = (u8)VTPM_GET_VERSION;
>
> -	rc = ibmvtpm_send_crq(ibmvtpm->vdev, buf[0], buf[1]);
> +	rc = ibmvtpm_send_crq(ibmvtpm->vdev, cpu_to_be64(buf[0]),
> +			      cpu_to_be64(buf[1]));
>  	if (rc != H_SUCCESS)
>  		dev_err(ibmvtpm->dev,
>  			"ibmvtpm_crq_get_version failed rc=%d\n", rc);
> @@ -327,7 +330,8 @@ static int tpm_ibmvtpm_suspend(struct device *dev)
>  	crq.valid = (u8)IBMVTPM_VALID_CMD;
>  	crq.msg = (u8)VTPM_PREPARE_TO_SUSPEND;
>
> -	rc = ibmvtpm_send_crq(ibmvtpm->vdev, buf[0], buf[1]);
> +	rc = ibmvtpm_send_crq(ibmvtpm->vdev, cpu_to_be64(buf[0]),
> +			      cpu_to_be64(buf[1]));
>  	if (rc != H_SUCCESS)
>  		dev_err(ibmvtpm->dev,
>  			"tpm_ibmvtpm_suspend failed rc=%d\n", rc);
> @@ -472,11 +476,11 @@ static void ibmvtpm_crq_process(struct ibmvtpm_crq
> *crq,
>  	case IBMVTPM_VALID_CMD:
>  		switch (crq->msg) {
>  		case VTPM_GET_RTCE_BUFFER_SIZE_RES:
> -			if (crq->len <= 0) {
> +			if (be16_to_cpu(crq->len) <= 0) {
>  				dev_err(ibmvtpm->dev, "Invalid rtce size\n");
>  				return;
>  			}
> -			ibmvtpm->rtce_size = crq->len;
> +			ibmvtpm->rtce_size = be16_to_cpu(crq->len);
>  			ibmvtpm->rtce_buf = kmalloc(ibmvtpm->rtce_size,
>  						    GFP_KERNEL);
>  			if (!ibmvtpm->rtce_buf) {
> @@ -497,11 +501,11 @@ static void ibmvtpm_crq_process(struct ibmvtpm_crq
> *crq,
>
>  			return;
>  		case VTPM_GET_VERSION_RES:
> -			ibmvtpm->vtpm_version = crq->data;
> +			ibmvtpm->vtpm_version = be32_to_cpu(crq->data);
>  			return;
>  		case VTPM_TPM_COMMAND_RES:
>  			/* len of the data in rtce buffer */
> -			ibmvtpm->res_len = crq->len;
> +			ibmvtpm->res_len = be16_to_cpu(crq->len);
>  			wake_up_interruptible(&ibmvtpm->wq);
>  			return;
>  		default:
> -- 
> 1.7.1
>
>
> ------------------------------------------------------------------------------
> Dive into the World of Parallel Programming. The Go Parallel Website,
> sponsored by Intel and developed in partnership with Slashdot Media, is your
> hub for all things parallel software development, from weekly thought
> leadership blogs to news, videos, case studies, tutorials and more. Take a
> look and join the conversation now. http://goparallel.sourceforge.net/
> _______________________________________________
> tpmdd-devel mailing list
> tpmdd-devel@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/tpmdd-devel
>

------------------------------------------------------------------------------
Dive into the World of Parallel Programming. The Go Parallel Website,
sponsored by Intel and developed in partnership with Slashdot Media, is your
hub for all things parallel software development, from weekly thought
leadership blogs to news, videos, case studies, tutorials and more. Take a
look and join the conversation now. http://goparallel.sourceforge.net/
Peter Hüwe Feb. 15, 2015, 4:51 p.m. UTC | #2
Hi Vicky

tldr: I applied your patch manually.

Am Freitag, 13. Februar 2015, 03:02:24 schrieb honclo:
> The tpm_ibmvtpm module is affected by an unaligned access problem.
> ibmvtpm_crq_get_version failed with rc=-4 during boot when vTPM is
> enabled in Power partition, which supports both little endian and
> big endian modes.
> 
> We added little endian support to fix this problem:
> 1) added cpu_to_be64 calls to ensure BE data is sent from an LE OS.
> 2) added be16_to_cpu and be32_to_cpu calls to make sure data received
>    is in LE format on a LE OS.
> 
> Signed-off-by: Hon Ching(Vicky) Lo <honclo@linux.vnet.ibm.com>
> Signed-off-by: Joy Latten <jmlatten@linux.vnet.ibm.com>
> ---
>   drivers/char/tpm/tpm_ibmvtpm.c |   20 ++++++++++++--------
>   1 files changed, 12 insertions(+), 8 deletions(-)
> 
> diff --git a/drivers/char/tpm/tpm_ibmvtpm.c
> b/drivers/char/tpm/tpm_ibmvtpm.c
> index af74c57..1632242 100644
> --- a/drivers/char/tpm/tpm_ibmvtpm.c
> +++ b/drivers/char/tpm/tpm_ibmvtpm.c
> @@ -148,7 +148,8 @@ static int tpm_ibmvtpm_send(struct tpm_chip *chip,
> u8 *buf, size_t count)


For whatever reason neither git nor patch was able to cope with your patch 
directly :(
Also Patchwork has its problems:
 https://patchwork.ozlabs.org/patch/439361/
it only shows the last hunk.

It seems that your mail client splits long lines automatically :(
Did you send it via git-send-email?

In 'my' version of the patch 
> diff --git a/drivers/char/tpm/tpm_ibmvtpm.c
> b/drivers/char/tpm/tpm_ibmvtpm.c
is only one line.


I did apply it manually now.

https://github.com/PeterHuewe/linux-tpmdd/commit/eb71f8a5e33fa1066fb92f0111ab366a341e1f6c

>-- 
>1.7.1
Maybe update your git version?



Also can you please set your reply-to emailadress correctly?
 honclo <honclo@imap.linux.ibm.com>
does not work.



Thanks,
Peter

------------------------------------------------------------------------------
Dive into the World of Parallel Programming. The Go Parallel Website,
sponsored by Intel and developed in partnership with Slashdot Media, is your
hub for all things parallel software development, from weekly thought
leadership blogs to news, videos, case studies, tutorials and more. Take a
look and join the conversation now. http://goparallel.sourceforge.net/
diff mbox

Patch

diff --git a/drivers/char/tpm/tpm_ibmvtpm.c 
b/drivers/char/tpm/tpm_ibmvtpm.c
index af74c57..1632242 100644
--- a/drivers/char/tpm/tpm_ibmvtpm.c
+++ b/drivers/char/tpm/tpm_ibmvtpm.c
@@ -148,7 +148,8 @@  static int tpm_ibmvtpm_send(struct tpm_chip *chip, 
u8 *buf, size_t count)
  	crq.len = (u16)count;
  	crq.data = ibmvtpm->rtce_dma_handle;

-	rc = ibmvtpm_send_crq(ibmvtpm->vdev, word[0], word[1]);
+	rc = ibmvtpm_send_crq(ibmvtpm->vdev, cpu_to_be64(word[0]),
+			      cpu_to_be64(word[1]));
  	if (rc != H_SUCCESS) {
  		dev_err(ibmvtpm->dev, "tpm_ibmvtpm_send failed rc=%d\n", rc);