On Thu, Mar 15, 2018 at 11:29 AM, Sebastian Huber < sebastian.hu...@embedded-brains.de> wrote:
> > > On 15/03/18 05:56, Udit agarwal wrote: > >> c/src/lib/libbsp/arm/atsam/startup/getentropy-trng.c | 6 ++++++ >> 1 file changed, 6 insertions(+) >> >> diff --git a/c/src/lib/libbsp/arm/atsam/startup/getentropy-trng.c >> b/c/src/lib/libbsp/arm/atsam/startup/getentropy-trng.c >> index 11e24dc..b26b6a8 100644 >> --- a/c/src/lib/libbsp/arm/atsam/startup/getentropy-trng.c >> +++ b/c/src/lib/libbsp/arm/atsam/startup/getentropy-trng.c >> @@ -17,6 +17,8 @@ >> #include <string.h> >> #include <rtems/sysinit.h> >> >> +static rtems_mutex atsam_trng_reg = RTEMS_MUTEX_INITIALIZER("atsam >> _trng_reg"); >> > > Is this a register or a mutex? > > + >> static void atsam_trng_enable(void) >> { >> PMC_EnablePeripheral(ID_TRNG); >> @@ -29,9 +31,12 @@ int getentropy(void *ptr, size_t n) >> uint32_t random; >> size_t copy; >> >> + rtems_mutex_lock(&atsam_trng_reg); >> while ((TRNG_GetStatus() & TRNG_ISR_DATRDY) == 0) { >> /* wait */ >> } >> + >> + rtems_mutex_unlock(&atsam_trng_reg); >> > > Now the status register read is protected by a mutex. > > random = TRNG_GetRandData(); >> > > Can you ensure that this read is correct in a multi-threaded application > (the status register has the right value during the read)? > > Oh yes, i think i misinterpreted your previous suggestion of surrounding the while loop by mutex, it should be the outer while loop. some thing like this?: while (n > 0) { uint32_t random; size_t copy; rtems_mutex_lock(&atsam_trng_mutex); while ((TRNG_GetStatus() & TRNG_ISR_DATRDY) == 0) { /* wait */ } random = TRNG_GetRandData(); /* * Read TRNG status one more time to avoid race condition. * Otherwise we can read (and clear) an old ready status but get * a new value. The ready status for this value wouldn't be * reset. */ TRNG_GetStatus(); copy = sizeof(random); if (n < copy ) { copy = n; } memcpy(ptr, &random, copy); n -= copy; ptr += copy; rtems_mutex_unlock(&atsam_trng_mutex); } > >> /* >> @@ -51,6 +56,7 @@ int getentropy(void *ptr, size_t n) >> ptr += copy; >> } >> >> + rtems_mutex_destroy(&atsam_trng_reg); >> > > Here you destroy the mutex. What happens if you call getentropy() a > second time? > return 0; >> } >> > > -- > Sebastian Huber, embedded brains GmbH > > Address : Dornierstr. 4, D-82178 Puchheim, Germany > Phone : +49 89 189 47 41-16 > Fax : +49 89 189 47 41-09 > E-Mail : sebastian.hu...@embedded-brains.de > PGP : Public key available on request. > > Diese Nachricht ist keine geschäftliche Mitteilung im Sinne des EHUG. > >
_______________________________________________ devel mailing list devel@rtems.org http://lists.rtems.org/mailman/listinfo/devel