From e074513d38d6aa6ac6a711798f6b53d523d16530 Mon Sep 17 00:00:00 2001 From: JacobBarthelmeh Date: Thu, 25 Mar 2021 01:32:37 +0700 Subject: [PATCH] fix for memory management with mmap function calls --- IDE/QNX/example-cmac/cmac-test.c | 3 ++ wolfcrypt/src/port/caam/caam_driver.c | 53 ++++++++++------------- wolfcrypt/src/port/caam/caam_qnx.c | 48 +++++++++++++++----- wolfssl/wolfcrypt/port/caam/caam_driver.h | 30 ++++++------- 4 files changed, 77 insertions(+), 57 deletions(-) diff --git a/IDE/QNX/example-cmac/cmac-test.c b/IDE/QNX/example-cmac/cmac-test.c index 0027031d4..f82155652 100644 --- a/IDE/QNX/example-cmac/cmac-test.c +++ b/IDE/QNX/example-cmac/cmac-test.c @@ -94,6 +94,9 @@ int main(int argc, char* argv[]) if (virtual_base == (uintptr_t)MAP_FAILED) { perror("mmap_device_io failed for base address "); } + else { + munmap_device_io(virtual_base, 0x00010000); + } wolfCrypt_Init(); diff --git a/wolfcrypt/src/port/caam/caam_driver.c b/wolfcrypt/src/port/caam/caam_driver.c index 8ef1ac3dd..105bc7d28 100644 --- a/wolfcrypt/src/port/caam/caam_driver.c +++ b/wolfcrypt/src/port/caam/caam_driver.c @@ -335,13 +335,10 @@ static Error caamCreatePartition(unsigned int page, unsigned int par, } -/* return a mapped address to the partition on success, returns 0 on fail */ -CAAM_ADDRESS caamGetPartition(unsigned int part, int partSz, unsigned int* phys, - unsigned int flag) +/* return a partitions physical address on success, returns 0 on fail */ +CAAM_ADDRESS caamGetPartition(unsigned int part, int partSz, unsigned int flag) { int err; - CAAM_ADDRESS vaddr; - unsigned int local; (void)flag; /* flag is for future changes to flag passed when creating */ @@ -353,13 +350,7 @@ CAAM_ADDRESS caamGetPartition(unsigned int part, int partSz, unsigned int* phys, return 0; } - /* map secure partition to virtual address */ - local = (CAAM_PAGE + (part << 12)); - vaddr = CAAM_ADR_TO_VIRTUAL(local, partSz); - if (phys != NULL) { - *phys = local; - } - return vaddr; + return (CAAM_ADDRESS)(CAAM_PAGE + (part << 12)); } @@ -839,11 +830,19 @@ int caamAesCmac(DESCSTRUCT* desc, int sz, unsigned int args[4]) } #endif - CAAM_ADR_UNMAP(vaddr[0], desc->buf[1].data, desc->buf[1].dataSz, 1); - CAAM_ADR_UNMAP(vaddr[1], desc->buf[0].data, desc->buf[0].dataSz + macSz, 0); - for (vidx = 2, i = 2; i < sz; i = i + 1) { /* unmap the input buffers */ - CAAM_ADR_UNMAP(vaddr[vidx++], desc->buf[i].data, desc->buf[i].dataSz, 0); + vidx = 0; + CAAM_ADR_UNMAP(vaddr[vidx++], desc->buf[1].data, desc->buf[1].dataSz, 1); + CAAM_ADR_UNMAP(vaddr[vidx++], desc->buf[0].data, desc->buf[0].dataSz + macSz, 0); + if (sz == 2) { + CAAM_ADR_UNMAP(vaddr[vidx], 0, 0, 0); } + else { + for (i = 2; i < sz; i = i + 1) { /* unmap the input buffers */ + CAAM_ADR_UNMAP(vaddr[vidx++], desc->buf[i].data, + desc->buf[i].dataSz, 0); + } + } + return err; } @@ -888,8 +887,7 @@ int caamECDSAMake(DESCSTRUCT* desc, CAAM_BUFFER* buf, unsigned int args[4]) /* map secure partition to virtual address */ phys = (CAAM_PAGE + (part << 12)); - buf[0].TheAddress = CAAM_ADR_TO_VIRTUAL(phys, - buf[0].Length + buf[1].Length + BLACK_KEY_MAC_SZ); + buf[0].TheAddress = phys; desc->desc[desc->idx++] = phys; /* public x,y out */ @@ -979,8 +977,7 @@ int caamECDSAVerify(DESCSTRUCT* desc, CAAM_BUFFER* buf, int sz, vidx = vidx + 1; } else { - desc->desc[desc->idx++] = CAAM_ADR_TO_PHYSICAL((void*)desc->buf[i].data, - desc->buf[i].dataSz); + desc->desc[desc->idx++] = desc->buf[i].data; } i = i + 1; @@ -1089,8 +1086,7 @@ int caamECDSASign(DESCSTRUCT* desc, int sz, unsigned int args[4]) vidx++; } else { - desc->desc[desc->idx++] = CAAM_ADR_TO_PHYSICAL((void*)desc->buf[i].data, - desc->buf[i].dataSz); + desc->desc[desc->idx++] = desc->buf[i].data; } i++; @@ -1162,9 +1158,9 @@ int caamECDSA_ECDH(DESCSTRUCT* desc, int sz, unsigned int args[4]) void* vaddr[sz]; if (args != NULL) { - isBlackKey = args[0]; + isBlackKey = args[0]; peerBlackKey = args[1]; - pdECDSEL = args[2]; + pdECDSEL = args[2]; } if (pdECDSEL == 0) { @@ -1193,8 +1189,7 @@ int caamECDSA_ECDH(DESCSTRUCT* desc, int sz, unsigned int args[4]) vidx++; } else { - desc->desc[desc->idx++] = CAAM_ADR_TO_PHYSICAL((void*)desc->buf[i].data, - desc->buf[i].dataSz); + desc->desc[desc->idx++] = desc->buf[i].data; } i++; @@ -1216,8 +1211,7 @@ int caamECDSA_ECDH(DESCSTRUCT* desc, int sz, unsigned int args[4]) vidx++; } else { - desc->desc[desc->idx++] = CAAM_ADR_TO_PHYSICAL((void*)desc->buf[i].data, - desc->buf[i].dataSz); + desc->desc[desc->idx++] = desc->buf[i].data; } i++; @@ -1507,9 +1501,10 @@ int InitCAAM(void) } -int caamJobRingFree() +int CleanupCAAM() { CAAM_FREE_MUTEX(&caam.ring.jr_lock); + CAAM_UNSET_BASEADDR(); caamFreeAllPart(); return 0; } diff --git a/wolfcrypt/src/port/caam/caam_qnx.c b/wolfcrypt/src/port/caam/caam_qnx.c index 336acfbb9..29f6d0f6f 100644 --- a/wolfcrypt/src/port/caam/caam_qnx.c +++ b/wolfcrypt/src/port/caam/caam_qnx.c @@ -85,6 +85,11 @@ int CAAM_SET_BASEADDR() } +/* cleans up having set the base address */ +void CAAM_UNSET_BASEADDR() +{ + munmap_device_io(virtual_base, 0x00010000); +} /* convert a virtual address to a physical address * returns the physical address on success @@ -105,7 +110,7 @@ CAAM_ADDRESS CAAM_ADR_TO_PHYSICAL(void* in, int inSz) if (ret != 0) { WOLFSSL_MSG("posix offset failed"); #if defined(WOLFSSL_CAAM_DEBUG) || defined(WOLFSSL_CAAM_PRINT) - perror(""); + perror("posix offset failed : "); #endif } msync(in, inSz, MS_INVALIDATE); @@ -146,7 +151,7 @@ void* CAAM_ADR_MAP(unsigned int in, int inSz, unsigned char copy) if (vaddr == MAP_FAILED) { WOLFSSL_MSG("Failed to map memory"); #if defined(WOLFSSL_CAAM_DEBUG) || defined(WOLFSSL_CAAM_PRINT) - perror(""); + perror("Failed to map memory : "); #endif } else { @@ -229,10 +234,8 @@ int CAAM_ADR_SYNC(void* vaddr, int sz) */ static int sanityCheckPartitionAddress(CAAM_ADDRESS partAddr, int partSz) { - unsigned int phys; - - phys = CAAM_ADR_TO_PHYSICAL((void*)partAddr, partSz); - if (phys < CAAM_PAGE || (phys + partSz) > CAAM_PAGE*7) { + if (partAddr < CAAM_PAGE || partAddr > CAAM_PAGE * MAX_PART || + partSz > 4096) { WOLFSSL_MSG("error in physical address range"); return -1; } @@ -924,7 +927,11 @@ static int doGET_PART(resmgr_context_t *ctp, io_devctl_t *msg, partNumber = args[0]; partSz = args[1]; - partAddr = caamGetPartition(partNumber, partSz, NULL, 0); + partAddr = caamGetPartition(partNumber, partSz, 0); + if (partAddr == 0) { + return EBADMSG; + } + SETIOV(&out_iov, &partAddr, sizeof(CAAM_ADDRESS)); resmgr_msgwritev(ctp, &out_iov, 1, sizeof(msg->o)); @@ -943,6 +950,7 @@ static int doWRITE_PART(resmgr_context_t *ctp, io_devctl_t *msg, { int partSz, ret; CAAM_ADDRESS partAddr; + CAAM_ADDRESS vaddr; unsigned char *buf; iov_t in_iov; @@ -968,7 +976,14 @@ static int doWRITE_PART(resmgr_context_t *ctp, io_devctl_t *msg, return EBADMSG; } - CAAM_ADR_UNMAP(buf, partAddr, partSz, 1); + vaddr = CAAM_ADR_TO_VIRTUAL(partAddr, partSz); + if (vaddr == 0) { + CAAM_ADR_UNMAP(buf, 0, partSz, 0); + return ECANCELED; + } + + CAAM_ADR_UNMAP(buf, vaddr, partSz, 1); + CAAM_ADR_UNMAP((void*)vaddr, 0, partSz, 0); return EOK; } @@ -981,6 +996,7 @@ static int doREAD_PART(resmgr_context_t *ctp, io_devctl_t *msg, { int partSz; CAAM_ADDRESS partAddr; + CAAM_ADDRESS vaddr; unsigned char *buf; iov_t out_iov; @@ -1002,10 +1018,18 @@ static int doREAD_PART(resmgr_context_t *ctp, io_devctl_t *msg, if (buf == NULL) { return ECANCELED; } - memcpy(buf, (unsigned int*)partAddr, partSz); + + vaddr = CAAM_ADR_TO_VIRTUAL(partAddr, partSz); + if (vaddr == 0) { + CAAM_ADR_UNMAP(buf, 0, partSz, 0); + return ECANCELED; + } + + memcpy(buf, (unsigned char*)vaddr, partSz); SETIOV(&out_iov, buf, partSz); resmgr_msgwritev(ctp, &out_iov, 1, sizeof(msg->o)); - CAAM_ADR_UNMAP(buf, 0, partSz, 0); + CAAM_ADR_UNMAP(buf, 0, partSz, 0); + CAAM_ADR_UNMAP((void*)vaddr, 0, partSz, 0); return EOK; } @@ -1249,14 +1273,14 @@ int main(int argc, char *argv[]) while (1) { ctp = dispatch_block(ctp); if (ctp == NULL) { - caamJobRingFree(); + CleanupCAAM(); exit (1); } dispatch_handler (ctp); } pthread_mutex_destroy(&sm_mutex); - caamJobRingFree(); + CleanupCAAM(); return 0; } diff --git a/wolfssl/wolfcrypt/port/caam/caam_driver.h b/wolfssl/wolfcrypt/port/caam/caam_driver.h index c3252ce43..701af3611 100644 --- a/wolfssl/wolfcrypt/port/caam/caam_driver.h +++ b/wolfssl/wolfcrypt/port/caam/caam_driver.h @@ -271,6 +271,7 @@ unsigned int CAAM_READ(unsigned int reg); void CAAM_WRITE(unsigned int reg, unsigned int in); int CAAM_SET_BASEADDR(void); +void CAAM_UNSET_BASEADDR(void); unsigned int CAAM_ADR_TO_PHYSICAL(void* in, int inSz); void* CAAM_ADR_MAP(unsigned int in, int inSz, unsigned char copy); void CAAM_ADR_UNMAP(void* vaddr, unsigned int out, int outSz, @@ -278,20 +279,18 @@ void CAAM_ADR_UNMAP(void* vaddr, unsigned int out, int outSz, int CAAM_ADR_SYNC(void* vaddr, int sz); CAAM_ADDRESS CAAM_ADR_TO_VIRTUAL(CAAM_ADDRESS in, int length); - - - #ifndef WOLFSSL_CAAM_BUFFER - #define WOLFSSL_CAAM_BUFFER - typedef struct CAAM_BUFFER { - int BufferType; - CAAM_ADDRESS TheAddress; - int Length; - } CAAM_BUFFER; - #endif - unsigned int caamReadRegister(unsigned int reg); - void caamWriteRegister(unsigned int reg, unsigned int in); - int SynchronousSendRequest(int type, unsigned int args[4], CAAM_BUFFER *buf, int sz); - int caamJobRingFree(void); +#ifndef WOLFSSL_CAAM_BUFFER +#define WOLFSSL_CAAM_BUFFER +typedef struct CAAM_BUFFER { + int BufferType; + CAAM_ADDRESS TheAddress; + int Length; +} CAAM_BUFFER; +#endif +unsigned int caamReadRegister(unsigned int reg); +void caamWriteRegister(unsigned int reg, unsigned int in); +int SynchronousSendRequest(int type, unsigned int args[4], CAAM_BUFFER *buf, int sz); +int CleanupCAAM(void); /* Driver API that can be called by caam_.c port layers */ @@ -309,8 +308,7 @@ int caamECDSAMake(DESCSTRUCT *desc, CAAM_BUFFER *buf, unsigned int args[4]); int caamAesCmac(DESCSTRUCT *desc, int sz, unsigned int args[4]); int caamBlob(DESCSTRUCT *desc); -CAAM_ADDRESS caamGetPartition(unsigned int part, int partSz, unsigned int* phys, - unsigned int flag); +CAAM_ADDRESS caamGetPartition(unsigned int part, int partSz, unsigned int flag); int caamFreePart(unsigned int part); int caamFindUnusuedPartition(void);