<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On Thu, Mar 15, 2018 at 11:29 AM, Sebastian Huber <span dir="ltr"><<a href="mailto:sebastian.huber@embedded-brains.de" target="_blank">sebastian.huber@embedded-brains.de</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><span class="gmail-"><br>
<br>
On 15/03/18 05:56, Udit agarwal wrote:<br>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
 c/src/lib/libbsp/arm/atsam/st<wbr>artup/getentropy-trng.c | 6 ++++++<br>
 1 file changed, 6 insertions(+)<br>
<br>
diff --git a/c/src/lib/libbsp/arm/atsam/s<wbr>tartup/getentropy-trng.c b/c/src/lib/libbsp/arm/atsam/s<wbr>tartup/getentropy-trng.c<br>
index 11e24dc..b26b6a8 100644<br>
--- a/c/src/lib/libbsp/arm/atsam/s<wbr>tartup/getentropy-trng.c<br>
+++ b/c/src/lib/libbsp/arm/atsam/s<wbr>tartup/getentropy-trng.c<br>
@@ -17,6 +17,8 @@<br>
 #include <string.h><br>
 #include <rtems/sysinit.h><br>
<br>
+static rtems_mutex atsam_trng_reg = RTEMS_MUTEX_INITIALIZER("atsam<wbr>_trng_reg");<br>
</blockquote>
<br></span>
Is this a register or a mutex?<span class="gmail-"><br></span></blockquote><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><span class="gmail-">
<br>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
+<br>
 static void atsam_trng_enable(void)<br>
 {<br>
     PMC_EnablePeripheral(ID_TRNG);<br>
@@ -29,9 +31,12 @@ int getentropy(void *ptr, size_t n)<br>
         uint32_t random;<br>
         size_t copy;<br>
<br>
+        rtems_mutex_lock(&atsam_trng_r<wbr>eg);<br>
         while ((TRNG_GetStatus() & TRNG_ISR_DATRDY) == 0) {<br>
             /* wait */<br>
         }<br>
+<br>
+        rtems_mutex_unlock(&atsam_trng<wbr>_reg);<br>
</blockquote>
<br></span>
Now the status register read is protected by a mutex.<br>
<br>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
    random = TRNG_GetRandData();<br>
</blockquote>
<br>
Can you ensure that this read is correct in a multi-threaded application (the status register has the right value during the read)?<span class="gmail-"><br>
<br></span></blockquote><div>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?:<br>while (n > 0) {<br>        uint32_t random;<br>        size_t copy;<br><br>        rtems_mutex_lock(&atsam_trng_mutex);<br><br>        while ((TRNG_GetStatus() & TRNG_ISR_DATRDY) == 0) {<br>            /* wait */<br>        }<br><br>        random = TRNG_GetRandData();<br><br>        /*<br>         * Read TRNG status one more time to avoid race condition.<br>         * Otherwise we can read (and clear) an old ready status but get<br>         * a new value. The ready status for this value wouldn't be<br>         * reset.<br>         */<br>        TRNG_GetStatus();<br><br>        copy = sizeof(random);<br>        if (n < copy ) {<br>            copy = n;<br>        }<br>        memcpy(ptr, &random, copy);<br>        n -= copy;<br>        ptr += copy;<br><br>        rtems_mutex_unlock(&atsam_trng_mutex);<br>    }<br> <br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><span class="gmail-">
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<br>
         /*<br>
@@ -51,6 +56,7 @@ int getentropy(void *ptr, size_t n)<br>
         ptr += copy;<br>
     }<br>
<br>
+    rtems_mutex_destroy(&atsam_trn<wbr>g_reg);<br>
</blockquote>
<br></span>
Here  you destroy the mutex. What happens if you call getentropy() a second time? </blockquote><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<br>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
return 0;<br>
 }<br>
</blockquote><div class="gmail-HOEnZb"><div class="gmail-h5">
<br>
-- <br>
Sebastian Huber, embedded brains GmbH<br>
<br>
Address : Dornierstr. 4, D-82178 Puchheim, Germany<br>
Phone   : <a href="tel:%2B49%2089%20189%2047%2041-16" value="+4989189474116" target="_blank">+49 89 189 47 41-16</a><br>
Fax     : <a href="tel:%2B49%2089%20189%2047%2041-09" value="+4989189474109" target="_blank">+49 89 189 47 41-09</a><br>
E-Mail  : <a href="mailto:sebastian.huber@embedded-brains.de" target="_blank">sebastian.huber@embedded-brain<wbr>s.de</a><br>
PGP     : Public key available on request.<br>
<br>
Diese Nachricht ist keine geschäftliche Mitteilung im Sinne des EHUG.<br>
<br>
</div></div></blockquote></div><br></div></div>