diff --git a/wolfcrypt/src/port/caam/caam_driver.c b/wolfcrypt/src/port/caam/caam_driver.c index 5fcc3bc05..0566054f6 100644 --- a/wolfcrypt/src/port/caam/caam_driver.c +++ b/wolfcrypt/src/port/caam/caam_driver.c @@ -242,12 +242,12 @@ Error caamFreePart(unsigned int part) #if defined(WOLFSSL_CAAM_DEBUG) || defined(WOLFSSL_CAAM_PRINT) printf("freeing partition %d\n", part); #endif - CAAM_WRITE(CAAM_SM_CMD, (part << 8U) | 0x3U); + CAAM_WRITE(caam.ring.BaseAddr + CAAM_SM_CMD, (part << 8U) | 0x3U); - status = CAAM_READ(CAAM_SM_STATUS); + status = CAAM_READ(caam.ring.BaseAddr + CAAM_SM_STATUS); while (((status & 0x00004000U) > 0U) && ((status & 0x00003000U) == 0U)) { CAAM_CPU_CHILL(); - status = CAAM_READ(CAAM_SM_STATUS); + status = CAAM_READ(caam.ring.BaseAddr + CAAM_SM_STATUS); } if (((status & 0x00003000U) > 0U) || ((status & 0x0000C000U) > 0U)) { @@ -489,18 +489,23 @@ int caamInitRng(struct CAAM_DEVICE* dev) /* Set up use of the TRNG for seeding wolfSSL HASH-DRBG */ /* check out the status and see if already setup */ - CAAM_WRITE(CAAM_RTMCTL, CAAM_PRGM); - CAAM_WRITE(CAAM_RTMCTL, CAAM_READ(CAAM_RTMCTL) | CAAM_RTMCTL_RESET); + CAAM_WRITE(caam.baseAddr + CAAM_RTMCTL, CAAM_PRGM); + CAAM_WRITE(caam.baseAddr + CAAM_RTMCTL, + CAAM_READ(caam.baseAddr + CAAM_RTMCTL) | CAAM_RTMCTL_RESET); /* Set up reading from TRNG */ - CAAM_WRITE(CAAM_RTMCTL, CAAM_READ(CAAM_RTMCTL) | CAAM_TRNG); + CAAM_WRITE(caam.baseAddr + CAAM_RTMCTL, + CAAM_READ(caam.baseAddr + CAAM_RTMCTL) | CAAM_TRNG); /* Set up delay for TRNG * Shift left with RTSDCTL because 0-15 is for sample number * Also setting the max and min frequencies */ - CAAM_WRITE(CAAM_RTSDCTL, (entropy_delay << 16) | CAAM_ENT_SAMPLE); - CAAM_WRITE(CAAM_RTFRQMIN, entropy_delay >> CAAM_ENT_MINSHIFT); - CAAM_WRITE(CAAM_RTFRQMAX, entropy_delay << CAAM_ENT_MAXSHIFT); + CAAM_WRITE(caam.baseAddr + CAAM_RTSDCTL, + (entropy_delay << 16) | CAAM_ENT_SAMPLE); + CAAM_WRITE(caam.baseAddr + CAAM_RTFRQMIN, + entropy_delay >> CAAM_ENT_MINSHIFT); + CAAM_WRITE(caam.baseAddr + CAAM_RTFRQMAX, + entropy_delay << CAAM_ENT_MAXSHIFT); #ifdef WOLFSSL_CAAM_PRINT printf("Attempt with entropy delay set to %d\n", entropy_delay); @@ -510,14 +515,14 @@ int caamInitRng(struct CAAM_DEVICE* dev) #endif /* Set back to run mode and clear RTMCL error bit */ - reg = CAAM_READ(CAAM_RTMCTL) & (~CAAM_PRGM); - CAAM_WRITE(CAAM_RTMCTL, reg); - reg = CAAM_READ(CAAM_RTMCTL); + reg = CAAM_READ(caam.baseAddr + CAAM_RTMCTL) & (~CAAM_PRGM); + CAAM_WRITE(caam.baseAddr + CAAM_RTMCTL, reg); + reg = CAAM_READ(caam.baseAddr + CAAM_RTMCTL); reg |= CAAM_CTLERR; - CAAM_WRITE(CAAM_RTMCTL, reg); + CAAM_WRITE(caam.baseAddr + CAAM_RTMCTL, reg); /* check out the status and see if already setup */ - reg = CAAM_READ(CAAM_RDSTA); + reg = CAAM_READ(caam.baseAddr + CAAM_RDSTA); if (((reg >> 16) & 0xF) > 0) { WOLFSSL_MSG("RNG is in error state, resetting"); caamReset(); @@ -1571,21 +1576,22 @@ static int caamTRNG(unsigned char *out, int outSz) int ofst = sizeof(unsigned int); /* Check ENT_VAL bit to make sure entropy is ready */ - if ((CAAM_READ(CAAM_RTMCTL) & CAAM_ENTVAL) != CAAM_ENTVAL) { + if ((CAAM_READ(caam.baseAddr + CAAM_RTMCTL) & CAAM_ENTVAL) != CAAM_ENTVAL) { return CAAM_WAITING; } /* check state of TRNG */ - if ((CAAM_READ(CAAM_RTSTATUS) & 0x0000FFFF) > 0) { + if ((CAAM_READ(caam.baseAddr + CAAM_RTSTATUS) & 0x0000FFFF) > 0) { + WOLFSSL_MSG("RNG in a bad state"); return Failure; } /* read entropy from RTENT registers */ - reg = CAAM_RTENT0; + reg = caam.baseAddr + CAAM_RTENT0; sz = outSz; local = out; - while (sz > 3 && reg <= CAAM_RTENT_MAX) { + while (sz > 3 && reg <= caam.baseAddr + CAAM_RTENT_MAX) { unsigned int data = CAAM_READ(reg); *((unsigned int*)local) = data; reg += ofst; @@ -1605,7 +1611,7 @@ static int caamTRNG(unsigned char *out, int outSz) /* read the max RTENT to trigger new entropy generation */ if (reg != CAAM_RTENT_MAX) { - CAAM_READ(CAAM_RTENT_MAX); + CAAM_READ(caam.baseAddr + CAAM_RTENT_MAX); } return Success; @@ -1838,11 +1844,11 @@ int InitCAAM(void) int CleanupCAAM() { + caamFreeAllPart(); CAAM_UNSET_JOBRING_ADDR(caam.ring.BaseAddr, caam.ring.JobIn, caam.ring.VirtualIn); CAAM_FREE_MUTEX(&caam.ring.jr_lock); CAAM_UNSET_BASEADDR(caam.baseAddr); - caamFreeAllPart(); return 0; } diff --git a/wolfcrypt/src/port/caam/caam_qnx.c b/wolfcrypt/src/port/caam/caam_qnx.c index ac6aa2ef2..65ea7c303 100644 --- a/wolfcrypt/src/port/caam/caam_qnx.c +++ b/wolfcrypt/src/port/caam/caam_qnx.c @@ -1710,12 +1710,23 @@ int main(int argc, char *argv[]) ctp = dispatch_context_alloc(dpp); while (1) { - ctp = dispatch_block(ctp); - if (ctp == NULL) { - CleanupCAAM(); - exit (1); + dispatch_context_t *current_ctp; + + current_ctp = dispatch_block(ctp); + if (current_ctp == NULL) { + /* test if was just an interrupt, if so retry */ + if (errno == EINTR) + continue; + + /* other errors are EFAULT, EINVAL, ENOMEM + * close down in these cases */ + perror("Error from dispatch_block "); + break; + } + else { + ctp = current_ctp; + dispatch_handler(ctp); } - dispatch_handler(ctp); } pthread_mutex_destroy(&sm_mutex);