blob: f5e1d393049346c92789d585c7e3255b07ad0753 [file] [log] [blame]
/******************************************************************************
* Copyright (c) 2015-2020 IBM Corporation
* All rights reserved.
* This program and the accompanying materials
* are made available under the terms of the BSD License
* which accompanies this distribution, and is available at
* http://www.opensource.org/licenses/bsd-license.php
*
* Contributors:
* IBM Corporation - initial implementation
*****************************************************************************/
/*
* libtpm bindings for SLOF - implementation
*/
#include <tcgbios.h>
#include <stdbool.h>
/************************************************/
/* Startup TPM code */
/* SLOF: tpm-start ( -- errcode ) */
/* LIBTPM: tpm_start(void) */
/************************************************/
PRIM(tpm_X2d_start)
PUSH;
TOS.n = tpm_start();
MIRP
/************************************************/
/* Shutdown TPM layer before OS takes over */
/* SLOF: tpm-finalize ( -- ) */
/* LIBTPM: tpm_finalize(void) */
/************************************************/
PRIM(tpm_X2d_finalize)
tpm_finalize();
MIRP
/***************************************************************/
/* Prepare TPM state for bootloader */
/* SLOF: tpm-leave-firwmare ( -- errcode ) */
/* LIBTPM: tpm_leave_firmware(void) */
/***************************************************************/
PRIM(tpm_X2d_leave_X2d_firmware)
PUSH;
TOS.n = tpm_leave_firmware();
MIRP
/*************************************************************/
/* Convey log address and size */
/* SLOF: tpm-set-log-parameters ( addr size -- ) */
/* LIBTPM: tpm_set_log_parameters(void *addr, uint64_t size) */
/*************************************************************/
PRIM(tpm_X2d_set_X2d_log_X2d_parameters)
int size = TOS.u; POP;
void *addr = TOS.a; POP;
tpm_set_log_parameters(addr, size);
MIRP
/*********************************************************/
/* Firmware API */
/* SLOF: tpm-driver-get_failure-reason ( -- errcode) */
/* LIBTPM: errcode = tpm_driver_get_failure_reason(void) */
/*********************************************************/
PRIM(tpm_X2d_driver_X2d_get_X2d_failure_X2d_reason)
PUSH;
TOS.n = tpm_driver_get_failure_reason();
MIRP
/********************************************************/
/* Firmware API */
/* SLOF: tpm-driver-set-failure_reason ( errcode -- ) */
/* LIBTPM: tpm_driver_set_failure_reason(errcode) */
/********************************************************/
PRIM(tpm_X2d_driver_X2d_set_X2d_failure_X2d_reason)
int errcode = TOS.u; POP;
tpm_driver_set_failure_reason(errcode);
MIRP
/************************************************/
/* Get the size of the log */
/* SLOF: tpm-get-logsize ( -- size ) */
/* LIBTPM: logsize = tpm_get_logsize(void) */
/************************************************/
PRIM(tpm_X2d_get_X2d_logsize)
PUSH;
TOS.n = tpm_get_logsize();
MIRP
/**********************************************************************/
/* Measure and log event separators */
/* SLOF: tpm-add-event-separators ( start-pcr end-pcr -- errcode) */
/* LIBTPM: errcode = tpm_add_event_separators(start_pcr, end_pcr) */
/**********************************************************************/
PRIM(tpm_X2d_add_X2d_event_X2d_separators)
int end_pcr = TOS.u; POP;
int start_pcr = TOS.u;
TOS.n = tpm_add_event_separators(start_pcr, end_pcr);
MIRP
/*************************************************************************/
/* Measure and log boot connect vector (bcv) device's master boot record */
/* SLOF: tpm-measure-bcv-mbr ( bootdrv addr length -- errcode ) */
/* LIBTPM: errcode = tpm_measure_bcv_mbr(bbotdrv, addr, length) */
/*************************************************************************/
PRIM(tpm_X2d_measure_X2d_bcv_X2d_mbr)
int length = TOS.u; POP;
void *addr = TOS.a; POP;
int bootdrv = TOS.u;
TOS.n = tpm_measure_bcv_mbr(bootdrv, addr, length);
MIRP
/************************************************/
/* Check whether the TPM is working */
/* SLOF: tpm-is-working ( -- true | false ) */
/* LIBTPM: bool = tpm_is_working() */
/************************************************/
PRIM(tpm_X2d_is_X2d_working)
PUSH;
TOS.n = tpm_is_working();
MIRP
/************************************************/
/* Have the S-CRTM measured */
/* SLOF: tpm-measure-scrtm ( -- errcode ) */
/* LIBTPM: errcode = tpm_measure_scrtm */
/************************************************/
PRIM(tpm_X2d_measure_X2d_scrtm)
PUSH;
TOS.n = tpm_measure_scrtm();
MIRP
/*******************************************************************/
/* Firmware API */
/* SLOF: tpm20-menu ( -- tpm-version ) */
/* LIBTPM: tpm20_menu() */
/*******************************************************************/
PRIM(tpm20_X2d_menu)
tpm20_menu();
MIRP
/*************************************************************************/
/* Set the LBA1 of the GPT */
/* SLOF: tpm-gpt-set-lba1 ( addr length -- ) */
/* LIBTPM: tpm_gpt_set_lba1(addr, length) */
/*************************************************************************/
PRIM(tpm_X2d_gpt_X2d_set_X2d_lba1)
int length = TOS.u; POP;
void *addr = TOS.a; POP;
tpm_gpt_set_lba1(addr, length);
MIRP
/*************************************************************************/
/* Add a GPT table entry */
/* SLOF: tpm-gpt-add-entry ( addr length -- ) */
/* LIBTPM: tpm_gpt_add_entry(addr, length) */
/*************************************************************************/
PRIM(tpm_X2d_gpt_X2d_add_X2d_entry)
int length = TOS.u; POP;
void *addr = TOS.a; POP;
tpm_gpt_add_entry(addr, length);
MIRP
/*************************************************************************/
/* Measure and log GPT EVENT */
/* SLOF: tpm-measure-gpt ( -- errcode ) */
/* LIBTPM: errcode = tpm_measure_gpt() */
/*************************************************************************/
PRIM(tpm_X2d_measure_X2d_gpt)
PUSH;
TOS.n = tpm_measure_gpt();
MIRP
/***********************************************************************************************************/
/* Firmware API */
/* SLOF: tpm-hash-log-extend-event-buffer ( pcr evt data-ptr data-len desc-ptr desclen is_elf -- errcode ) */
/* LIBTPM: errcode = tpm-hash-log-extend-event-buffer */
/***********************************************************************************************************/
PRIM(tpm_X2d_hash_X2d_log_X2d_extend_X2d_event_X2d_buffer)
uint32_t is_elf = TOS.u; POP;
uint32_t desclen = TOS.u; POP;
const char *desc = TOS.a; POP;
uint64_t datalen = TOS.u; POP;
const void *data = TOS.a; POP;
uint32_t eventtype = TOS.u; POP;
uint32_t pcrindex = TOS.u;
TOS.n = tpm_hash_log_extend_event_buffer(pcrindex, eventtype,
data, datalen,
desc, desclen, is_elf);
MIRP
/****************************************************************************************/
/* Firmware API */
/* SLOF: tpm-2hash-ext-log ( pcr event-type info info-len data data-len -- success? ) */
/* LIBTPM: success = tpm-2hash-ext-log */
/****************************************************************************************/
PRIM(tpm_X2d_2hash_X2d_ext_X2d_log)
uint32_t datalen = TOS.u; POP;
const void *data = TOS.a; POP;
uint64_t infolen = TOS.u; POP;
const char *info = TOS.a; POP;
uint32_t eventtype = TOS.u; POP;
uint32_t pcrindex = TOS.u;
TOS.u = tpm_2hash_ext_log(pcrindex, eventtype,
info, infolen,
data, datalen);
MIRP