[SLOF] [PATCH 14/16] Add TPM firmware API call pass-through-to-tpm
Nikunj A Dadhania
nikunj at linux.vnet.ibm.com
Thu Nov 12 17:29:53 AEDT 2015
Stefan Berger <stefanb at linux.vnet.ibm.com> writes:
> This patch adds support for the firmware API call pass-through-to-tpm.
>
> Signed-off-by: Stefan Berger <stefanb at linux.vnet.ibm.com>
Reviewed-by: Nikunj A Dadhania <nikunj at linux.vnet.ibm.com>
> ---
> board-qemu/slof/vio-vtpm-cdriver.fs | 8 ++++++++
> board-qemu/slof/vtpm-sml.fs | 7 +++++++
> lib/libtpm/tcgbios.c | 28 ++++++++++++++++++++++++++++
> lib/libtpm/tcgbios.h | 1 +
> lib/libtpm/tpm.code | 11 +++++++++++
> lib/libtpm/tpm.in | 1 +
> slof/fs/tpm/tpm-static.fs | 13 +++++++++++++
> 7 files changed, 69 insertions(+)
>
> diff --git a/board-qemu/slof/vio-vtpm-cdriver.fs b/board-qemu/slof/vio-vtpm-cdriver.fs
> index 22fef4f..5d55148 100644
> --- a/board-qemu/slof/vio-vtpm-cdriver.fs
> +++ b/board-qemu/slof/vio-vtpm-cdriver.fs
> @@ -96,6 +96,14 @@ false VALUE vtpm-debug?
> ;
>
> \ firmware API call
> +: pass-through-to-tpm ( buf-addr buf-size -- response-size )
> + " pass-through-to-tpm" call-forward IF
> + 2drop
> + 0
> + THEN
> +;
> +
> +\ firmware API call
> : get-maximum-cmd-size ( -- maximum-size )
> " get-maximum-cmd-size" call-forward IF
> 0
> diff --git a/board-qemu/slof/vtpm-sml.fs b/board-qemu/slof/vtpm-sml.fs
> index e62c20c..3ce1ace 100644
> --- a/board-qemu/slof/vtpm-sml.fs
> +++ b/board-qemu/slof/vtpm-sml.fs
> @@ -80,6 +80,13 @@ log-base LOG-SIZE tpm-set-log-parameters
> vtpm-get-maximum-cmd-size
> ;
>
> +: pass-through-to-tpm ( buf-addr cmd-size -- rsp-size )
> + vtpm-debug? IF
> + ." Call to pass-through-to-tpm" cr
> + THEN
> + vtpm-pass-through-to-tpm
> +;
> +
> : open true ;
> : close ;
>
> diff --git a/lib/libtpm/tcgbios.c b/lib/libtpm/tcgbios.c
> index b306edf..6c991b2 100644
> --- a/lib/libtpm/tcgbios.c
> +++ b/lib/libtpm/tcgbios.c
> @@ -640,6 +640,34 @@ static bool pass_through_to_tpm(unsigned char *req,
> }
>
> /*
> + * tpm_pass_through_to_tpm: Function for interfacing with the firmware API
> + *
> + * buf: buffer holding the command; also used for holding the entire response
> + * cmdlen: length of the command in the buffer
> + *
> + * Returns 0 in case of failure, the size of the response otherwise.
> + */
> +uint32_t tpm_pass_through_to_tpm(unsigned char *buf, uint32_t cmdlen)
> +{
> + uint32_t resplen = PAPR_VTPM_MAX_BUFFER_SIZE;
> +
> + /*
> + * API spec: caller must ensure that the buffer is large
> + * enough to receive the full response into
> + * the same buffer where the command is in.
> + * We anticipate the largest possible buffer
> + * the driver supports in 'resplen'.
> + * For duration we use the worst-case timeout 'LONG'
> + * so that any command can be sent and will not time out.
> + */
> + if (pass_through_to_tpm(buf, cmdlen,
> + TPM_DURATION_TYPE_LONG,
> + buf, &resplen))
> + return 0;
> + return resplen;
> +}
> +
> +/*
> * Extend a PCR of the TPM with the given hash
> *
> * @hash: sha1 hash (20 bytes) to extend PCR with
> diff --git a/lib/libtpm/tcgbios.h b/lib/libtpm/tcgbios.h
> index 2aa7d20..6951af3 100644
> --- a/lib/libtpm/tcgbios.h
> +++ b/lib/libtpm/tcgbios.h
> @@ -37,6 +37,7 @@ uint32_t tpm_hash_log_extend_event(struct pcpes *pcpes);
> bool tpm_log_event(struct pcpes *pcpes);
> uint32_t tpm_hash_all(const void *data, uint32_t datalen, void *hashptr);
> uint32_t tpm_get_maximum_cmd_size(void);
> +uint32_t tpm_pass_through_to_tpm(unsigned char *buf, uint32_t cmdlen);
>
> /* flags returned by tpm_get_state */
> #define TPM_STATE_ENABLED 1
> diff --git a/lib/libtpm/tpm.code b/lib/libtpm/tpm.code
> index 5c3d4db..e763f45 100644
> --- a/lib/libtpm/tpm.code
> +++ b/lib/libtpm/tpm.code
> @@ -174,3 +174,14 @@ PRIM(tpm_X2d_get_X2d_maximum_X2d_cmd_X2d_size)
> PUSH;
> TOS.n = tpm_get_maximum_cmd_size();
> MIRP
> +
> +/*******************************************************************/
> +/* Firmware API */
> +/* SLOF: tpm-pass-through-to-tpm (buf-addr cmd-size -- rsp-size) */
> +/* LIBTPM: respsize = tpm_pass_through_to_tpm(buf, cmdsize) */
> +/*******************************************************************/
> +PRIM(tpm_X2d_pass_X2d_through_X2d_to_X2d_tpm)
> + int cmdsize = TOS.n; POP;
> + void *buf = TOS.a;
> + TOS.n = tpm_pass_through_to_tpm(buf, cmdsize);
> +MIRP
> diff --git a/lib/libtpm/tpm.in b/lib/libtpm/tpm.in
> index 0923fc0..8b7cde8 100644
> --- a/lib/libtpm/tpm.in
> +++ b/lib/libtpm/tpm.in
> @@ -28,3 +28,4 @@ cod(tpm-log-event)
> cod(tpm-hash-log-extend-event)
> cod(tpm-hash-all)
> cod(tpm-get-maximum-cmd-size)
> +cod(tpm-pass-through-to-tpm)
> diff --git a/slof/fs/tpm/tpm-static.fs b/slof/fs/tpm/tpm-static.fs
> index fca0058..f9583b0 100644
> --- a/slof/fs/tpm/tpm-static.fs
> +++ b/slof/fs/tpm/tpm-static.fs
> @@ -120,6 +120,19 @@ false VALUE vtpm-debug?
> THEN
> ;
>
> +\ firmware API function
> +: vtpm-pass-through-to-tpm ( buf-addr cmd-size -- rsp-size )
> + vtpm-available? IF
> + tpm-pass-through-to-tpm ( -- rsp-size )
> + vtpm-debug? IF
> + ." VTPM: Return value from tpm-pass-through-to-tpm: " dup . cr
> + THEN
> + ELSE
> + 2drop
> + 0
> + THEN
> +;
> +
> 1 CONSTANT TPM_ST_ENABLED
> 2 CONSTANT TPM_ST_ACTIVE
> 4 CONSTANT TPM_ST_OWNED
> --
> 1.9.3
More information about the SLOF
mailing list