crb
struct tpm_crb *const crb = arg;
pthread_mutex_lock(&crb->mutex);
if (crb->closing)
pthread_cond_wait(&crb->cond, &crb->mutex);
if (crb->closing)
const uint64_t cmd_addr = CRB_CMD_ADDR_READ(crb->regs);
const uint64_t rsp_addr = CRB_RSP_ADDR_READ(crb->regs);
const uint32_t cmd_size = CRB_CMD_SIZE_READ(crb->regs);
const uint32_t rsp_size = CRB_RSP_SIZE_READ(crb->regs);
memcpy(cmd, crb->regs.data_buffer, TPM_CRB_DATA_BUFFER_SIZE);
pthread_mutex_unlock(&crb->mutex);
(void) crb->emul->execute_cmd(crb->emul_sc, req,
pthread_mutex_lock(&crb->mutex);
memset(crb->regs.data_buffer, 0, TPM_CRB_DATA_BUFFER_SIZE);
memcpy(&crb->regs.data_buffer[rsp_off], &rsp[rsp_off], rsp_size);
crb->regs.ctrl_start.start = false;
pthread_mutex_unlock(&crb->mutex);
struct tpm_crb *crb;
crb = arg1;
ptr = (uint8_t *)&crb->regs + off;
crb->regs.loc_sts.granted = false;
crb->regs.loc_state.loc_assigned = false;
crb->regs.loc_sts.granted = true;
crb->regs.loc_state.loc_assigned = true;
crb->regs.ctrl_sts.tpm_idle = false;
crb->regs.ctrl_sts.tpm_idle = true;
pthread_mutex_lock(&crb->mutex);
if (!start.start || crb->regs.ctrl_start.start) {
pthread_mutex_unlock(&crb->mutex);
crb->regs.ctrl_start.start = true;
pthread_cond_signal(&crb->cond);
pthread_mutex_unlock(&crb->mutex);
pthread_mutex_lock(&crb->mutex);
pthread_mutex_unlock(&crb->mutex);
struct tpm_crb *crb = NULL;
crb = calloc(1, sizeof(struct tpm_crb));
if (crb == NULL) {
memset(crb, 0, sizeof(*crb));
crb->emul = emul;
crb->emul_sc = emul_sc;
crb->regs.loc_state.tpm_req_valid_sts = true;
crb->regs.loc_state.tpm_established = true;
crb->regs.intf_id.interface_type = TPM_INTF_TYPE_CRB;
crb->regs.intf_id.interface_version = TPM_INTF_VERSION_CRB;
crb->regs.intf_id.cap_locality = false;
crb->regs.intf_id.cap_crb_idle_bypass = false;
crb->regs.intf_id.cap_data_xfer_size_support =
crb->regs.intf_id.cap_fifo = false;
crb->regs.intf_id.cap_crb = true;
crb->regs.intf_id.interface_selector = TPM_INTF_SELECTOR_CRB;
crb->regs.intf_id.intf_sel_lock = false;
crb->regs.intf_id.rid = 0;
crb->regs.intf_id.vid = 0x1014; /* IBM */
crb->regs.intf_id.did = 0x1014; /* IBM */
crb->regs.ctrl_sts.tpm_idle = true;
CRB_CMD_SIZE_WRITE(crb->regs, TPM_CRB_DATA_BUFFER_SIZE);
CRB_CMD_ADDR_WRITE(crb->regs, TPM_CRB_DATA_BUFFER_ADDRESS);
CRB_RSP_SIZE_WRITE(crb->regs, TPM_CRB_DATA_BUFFER_SIZE);
CRB_RSP_ADDR_WRITE(crb->regs, TPM_CRB_DATA_BUFFER_ADDRESS);
TPM_CRB_LOG_AREA_MINIMUM_SIZE, crb->tpm_log_area);
error = tpm_crb_modify_mmio_registration(true, crb);
error = pthread_mutex_init(&crb->mutex, NULL);
error = pthread_cond_init(&crb->cond, NULL);
error = pthread_create(&crb->thread, NULL, tpm_crb_thread, crb);
pthread_set_name_np(crb->thread, "tpm_intf_crb");
*sc = crb;
free(crb);
struct tpm_crb *crb;
crb = sc;
crb->closing = true;
pthread_cond_signal(&crb->cond);
pthread_join(crb->thread, NULL);
pthread_cond_destroy(&crb->cond);
pthread_mutex_destroy(&crb->mutex);
free(crb);
crb_t *crb;
crb = me->me_crb;
if (crb) {
if (mof > crb->c_mof) {
skip = mof - crb->c_mof;
bcopy(crb->c_buf + skip, va,
MIN(nb, crb->c_nb - skip));
skip = crb->c_mof - mof;
bcopy(crb->c_buf, va + skip,
MIN(crb->c_nb, nb - skip));
crb_t *crb;
crb = me->me_crb;
if (crb && (--crb->c_refcnt == 0)) {
(crb->c_nb != bufsz)) {
CRB_FREE(crb, me);
bcopy(buf, crb->c_buf,
crb->c_invalid = 0;
crb->c_mof = bufmof;
crbsav = crb;
!crbsav && crb &&
WITHIN(mof, nb, crb->c_mof, crb->c_nb)) {
ASSERT(crb->c_mof == bufmof);
ASSERT(crb->c_nb == bufsz);
bcopy(buf, crb->c_buf, bufsz);
crbsav = crb;
crb_t *crb;
crb = me->me_crb;
if (crb) {
crb->c_invalid = 1;
crb_t *crb;
crb = me->me_crb;
if (crb) {
if (DATAwithinCRB(savmof, savnb, crb)) {
crb_t *crb = NULL;
#define CRB_FREE(crb, me) \
kmem_free(crb->c_buf, crb->c_nb); \
atomic_add_64(&ufs_crb_size, -(uint64_t)crb->c_nb); \
kmem_free(crb, sizeof (crb_t)); \
crb = age->me_crb;
if (crb && !(crb->c_invalid)) {
if (me->me_crb != crb) {
crb = NULL;
rbp->rb_crb = crb;
crb_t *crb = (me)->me_crb; \
if (crb && (--crb->c_refcnt == 0)) { \
CRB_FREE(crb, me) \
crb_t *crb;
crb = me->me_crb;
if (crb) {
nb = crb->c_nb;
mof = crb->c_mof;
crb_t *crb = rbp->rb_crb;
bp->b_blkno = lbtodb(crb->c_mof);
bp->b_un.b_addr = crb->c_buf;
bp->b_bcount = crb->c_nb;
bp->b_bufsize = crb->c_nb;
ASSERT((crb->c_nb & DEV_BMASK) == 0);
u32 crb, actual_crb;
#define DATAwithinCRB(mof, nb, crb) \
(WITHIN((mof), (nb), (crb)->c_mof, (crb)->c_nb))