/****************************************************************************** * 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 #include /************************************************/ /* 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