getentropy() implementation on BBB
Udit agarwal
dev.madaari at gmail.com
Tue Mar 6 14:43:30 UTC 2018
Hi,
Here's the updated code(I have also attached the patch PFA):
>From 96e6e1bfd8cffeef5d309eb0a07fe2bfd086ef0a Mon Sep 17 00:00:00 2001
From: Udit agarwal <dev.madaari at gmail.com>
Date: Tue, 6 Mar 2018 20:07:44 +0530
Subject: [PATCH] Added getentropy support to BBB BSP
---
bsps/arm/beagle/headers.am | 1 +
bsps/arm/beagle/include/bsp/bbb_getentropy.h | 57 +++++++++++++++
bsps/arm/include/libcpu/am335x.h | 16 +++++
c/src/lib/libbsp/arm/beagle/Makefile.am | 4 ++
.../libbsp/arm/beagle/getentropy/bbb_getentropy.c | 80
++++++++++++++++++++++
5 files changed, 158 insertions(+)
create mode 100644 bsps/arm/beagle/include/bsp/bbb_getentropy.h
create mode 100644 c/src/lib/libbsp/arm/beagle/getentropy/bbb_getentropy.c
diff --git a/bsps/arm/beagle/headers.am b/bsps/arm/beagle/headers.am
index 6692d0b..ac4ff7c 100644
--- a/bsps/arm/beagle/headers.am
+++ b/bsps/arm/beagle/headers.am
@@ -12,3 +12,4 @@ include_bsp_HEADERS +=
../../../../../../bsps/arm/beagle/include/bsp/bbb-pwm.h
include_bsp_HEADERS +=
../../../../../../bsps/arm/beagle/include/bsp/beagleboneblack.h
include_bsp_HEADERS += ../../../../../../bsps/arm/beagle/include/bsp/i2c.h
include_bsp_HEADERS += ../../../../../../bsps/arm/beagle/include/bsp/irq.h
+include_bsp_HEADERS +=
../../../../../../bsps/arm/beagle/include/bsp/bbb_getentropy.h
diff --git a/bsps/arm/beagle/include/bsp/bbb_getentropy.h
b/bsps/arm/beagle/include/bsp/bbb_getentropy.h
new file mode 100644
index 0000000..5e46f89
--- /dev/null
+++ b/bsps/arm/beagle/include/bsp/bbb_getentropy.h
@@ -0,0 +1,57 @@
+/**
+ * @file
+ *
+ * @ingroup arm_beagle
+ *
+ * @brief TRNG Definations
+ */
+
+/*
+ * Copyright (c) 2018 Udit kumar agarwal <dev.madaari at gmail.com>
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rtems.org/license/LICENSE.
+ */
+
+
+#ifndef _TRNG_
+#define _TRNG_
+
+/*------------------------------------------------------------------------------
+ * Headers
+
*----------------------------------------------------------------------------*/
+
+#include <libcpu/am335x.h>
+
+
/*------------------------------------------------------------------------------
+ * Register structure
+
*----------------------------------------------------------------------------*/
+
+struct rng {
+ uint64_t output; /*00*/
+ uint32_t status; /*08*/
+ uint32_t irq_en; /*0c*/
+ uint32_t status_clr; /*10*/
+ uint32_t control; /*14*/
+ uint32_t config; /*18*/
+};
+
+typedef volatile struct rng *rng_ref_t;
+
+/*----------------------------------------------------------------------------*/
+/* Exported
functions */
+/*----------------------------------------------------------------------------*/
+
+/* configure and enable RNG module */
+static void am335x_rng_enable(rng_ref_t);
+/* enable module clock for random number generator */
+static void am335x_rng_clock_enable(void);
+/* outputs random data */
+static uint64_t trng_getranddata(rng_ref_t);
+/* Copy random data of a specified size to the pointer supplied */
+int getentropy(void *ptr, size_t);
+
+
+
+#endif /* #ifndef _TRNG_ */
\ No newline at end of file
diff --git a/bsps/arm/include/libcpu/am335x.h
b/bsps/arm/include/libcpu/am335x.h
index 367e97c..8b58f1a 100644
--- a/bsps/arm/include/libcpu/am335x.h
+++ b/bsps/arm/include/libcpu/am335x.h
@@ -14,6 +14,9 @@
* Modified by Ben Gras <beng at shrike-systems.com> to add lots
* of beagleboard/beaglebone definitions, delete lpc32xx specific
* ones, and merge with some other header files.
+ *
+ * Modified by Udit agarwal <dev.madaari at gmail.com> to add random
+ * number generating module definations
*/
#if !defined(_AM335X_H_)
@@ -701,4 +704,17 @@
#define AM335X_CM_PER_OCPWP_L3_CLKSTCTRL_CLKACTIVITY_OCPWP_L4_GCLK
(0x00000020u)
#define AM335X_I2C_INT_STOP_CONDITION AM335X_I2C_IRQSTATUS_BF
+/* TRNG Register */
+
+/* RNG base address */
+#define RNG_BASE 0x48310000
+/* RNG clock control */
+#define CM_PER_RNG_CLKCTRL AM335X_CM_PER_ADDR | 9<<4
+/* Offset from RNG base for output ready flag */
+#define RNG_STATUS_RDY (1u << 0)
+/* Offset from RNG base for FRO related error*/
+#define RNG_STATUS_ERR (1u << 1)
+/* Offset from RNG base for clock status */
+#define RNG_STATUS_CLK (1u << 31)
+
#endif
diff --git a/c/src/lib/libbsp/arm/beagle/Makefile.am
b/c/src/lib/libbsp/arm/beagle/Makefile.am
index 8251660..bf92081 100644
--- a/c/src/lib/libbsp/arm/beagle/Makefile.am
+++ b/c/src/lib/libbsp/arm/beagle/Makefile.am
@@ -88,9 +88,13 @@ libbsp_a_SOURCES += gpio/bbb-gpio.c
#pwm
libbsp_a_SOURCES += pwm/pwm.c
+#getentropy
+libbsp_a_SOURCES += getentropy/bbb_getentropy.c
+
#RTC
libbsp_a_SOURCES += rtc.c
libbsp_a_SOURCES += ../../shared/tod.c
+
# Clock
libbsp_a_SOURCES += clock.c
libbsp_a_SOURCES += ../../shared/clockdrv_shell.h
diff --git a/c/src/lib/libbsp/arm/beagle/getentropy/bbb_getentropy.c
b/c/src/lib/libbsp/arm/beagle/getentropy/bbb_getentropy.c
new file mode 100644
index 0000000..cab2102
--- /dev/null
+++ b/c/src/lib/libbsp/arm/beagle/getentropy/bbb_getentropy.c
@@ -0,0 +1,80 @@
+/**
+* @file
+*
+* @ingroup arm_beagle
+*
+* @brief Getentropy implementation on BeagleBone Black BSP
+*/
+
+/*
+* Copyright (c) 2018 Udit kumar agarwal <dev.madaari at gmail.com>
+*
+* The license and distribution terms for this file may be
+* found in the file LICENSE in this distribution or at
+* http://www.rtems.org/license/LICENSE.
+*/
+
+#include <unistd.h>
+#include <stdint.h>
+#include <string.h>
+#include <rtems/sysinit.h>
+
+
+/* maximun and minimun refill cycle sets the number of samples to be taken
+ from FRO to generate random number */
+static void am335x_rng_enable(rng_ref_t rng){
+ rng->config = 0
+ | 34 << 16 /* max refill 34 * 256 cycles */
+ | 33 << 0; /* min refill 33 * 64 cycles */
+ rng->control = 0
+ | 33 << 16 /* startup 33 * 256 cycles */
+ | 1 << 10; /* enable module */
+}
+
+static void am335x_rng_clock_enable(void)
+{
+ *(volatile uint8_t *) CM_PER_RNG_CLKCTRL = 2;
+ while( *(volatile uint32_t *) CM_PER_RNG_CLKCTRL & 0x30000 ) {}
+}
+
+static uint64_t trng_getranddata(rng_ref_t rng){
+ uint64_t output = rng->output;
+ return output;
+}
+
+int getentropy(void *ptr, size_t n)
+{
+ rng_ref_t const rng = (rng_ref_t) RNG_BASE;
+ am335x_rng_enable(rng);
+ while (n > 0) {
+ uint64_t random;
+ size_t copy;
+
+ /* wait untill RNG becomes ready with next set of random data */
+ while( ( rng->status & RNG_STATUS_RDY ) == 0 );
+
+ random = trng_getranddata(rng);
+
+ /* Checking for error by masking all bits other then error bit in
status register */
+ if( ((rng->status & RNG_STATUS_ERR)>>1) == 0){
+
+ /* clear the status flag after reading to generate new random
value*/
+ rng->status_clr = RNG_STATUS_RDY;
+ copy = sizeof(random);
+ if ( n < copy ) {
+ copy = n;
+ }
+ memcpy(ptr, &random, copy);
+ n -= copy;
+ ptr += copy;
+ }
+ }
+
+ return 0;
+}
+
+RTEMS_SYSINIT_ITEM(
+ am335x_rng_clock_enable,
+ RTEMS_SYSINIT_DEVICE_DRIVERS,
+ RTEMS_SYSINIT_ORDER_LAST
+);
\ No newline at end of file
--
1.9.1
Regards,
Udit Agarwal
On Tue, Mar 6, 2018 at 12:50 AM, Christian Mauderer <list at c-mauderer.de>
wrote:
> Am 05.03.2018 um 14:51 schrieb Udit agarwal:
> > Hi,
> > I tried implementing getentropy on BBB, below is the patch. Please have
> > a look.
> > I followed these(1
> > <https://e2e.ti.com/support/arm/sitara_arm/f/791/t/355064> & 2
> > <http://ftp.netbsd.org/pub/NetBSD/NetBSD-current/src/sys/
> arch/arm/omap/am335x_trng.c>)
> > links for code reference. and this
> > <https://docs.google.com/spreadsheets/d/1VpghMlLtrWQIrcvCsRg3ueRZkX0eG
> SQkFnzjfsqrd8A/view#gid=0>
> > for register reference. Moreover, what further configuration in RTEMS is
> > needed to execute and test this code along with getentropy() sample
> > testcode?
>
> Hello Udit,
>
> regarding the patch: Please use 'git format-patch' for generating your
> patches and send them unchanged to the mailing list (for example with
> 'git send-email'. If you follow this workflow, it's easier to apply and
> test the patches. The preferred workflow for RTEMS is described here:
> https://devel.rtems.org/wiki/Developer/Git/Users#CreatingaPatch
>
> Regarding documentation: It seems that there is really only few
> documentation regarding the crypto part available. The FreeBSD driver is
> most likely your best source.
>
> I added further comments down in your code.
>
> Best regards
>
> Christian
>
> >
> >
> > + /*
> > + * Copyright (c) 2018 embedded brains GmbH. All rights reserved.
> > + *
> > + * embedded brains GmbH
> > + * Dornierstr. 4
> > + * 82178 Puchheim
> > + * Germany
> > + * <rtems at embedded-brains.de <mailto:rtems at embedded-brains.de>>
> > + *
>
> Also it's nice if you add an embedded brains header, I don't think that
> I've seen you when I have been at work today. So please add your own
> name to the copyright line instead. With that you can even point to that
> file and tell everyone that it's from you.
>
> An address isn't really necessary except if you want it for some reason
> (like PR in case of a company).
>
> > + * The license and distribution terms for this file may be
> > + * found in the file LICENSE in this distribution or at
> > + * http://www.rtems.org/license/LICENSE.
> > + */
> > +
> > + #include <libcpu/am335x.h>
> > + #include <unistd.h>
> > + #include <string.h>
> > + #include <rtems/sysinit.h>
> > +
> > + #define RNG_BASE 0x48310000
> > + #define CM_PER_RNG_CLKCTRL 0x44e00090
> > + #define RNG_STATUS_RDY (1u << 0) // output ready for reading
> > + #define RNG_STATUS_ERR (1u << 1) // FRO shutdown alarm
> > + #define RNG_STATUS_CLK (1u << 31) // module functional clock
> > active (no irq)
>
> Please add address definitions and the bit masks to the
> bsps/arm/include/libcpu/am335x.h instead of defining them here locally.
> Note that for the CM_PER_RNG_CLKCTRL, there is already a
> AM335X_CM_PER_ADDR that should be used as a base.
>
> > +
> > + typedef volatile struct rng *rng_ref_t;
> > +
> > + struct rng {
> > + /*00*/ uint64_t output; //r-
> > + /*08*/ uint32_t status; //r-
> > + /*0c*/ uint32_t irq_en; //rw
> > + /*10*/ uint32_t status_clr; //-c
> > + /*14*/ uint32_t control; //rw
> > + /*18*/ uint32_t config; //rw
> > + };
>
> Same is true here: It's a structure describing the registers. So it
> should be in the header instead.
>
> It seems that you copied that from the forum post. Please always check
> the license when you copy code. We have to avoid that we get any code
> into RTEMS that isn't compatible with RTEMS license.
>
> In this case the code should be obvious enough that - if you just
> rewrite it in RTEMS style, there shouldn't be a problem. But just
> remember that licensing is always a difficult topic.
>
> > +
> > + static void TRNG_Enable(rng_ref_t rng){
> > + rng->config = 0
> > + | 34 << 16 // max refill 34 * 256 cycles
> > + | 33 << 0; // min refill 33 * 64 cycles
> > + rng->control = 0
> > + | 33 << 16 // startup 33 * 256 cycles
> > + | 1 << 10; // enable module
> > + }
>
> Please use C-Style comments /* */ in all pure C code (most of RTEMS).
>
> > +
> > + static void beagle_trng_clock_enable(void)
> > + {
> > + // enable module clock
> > + *(volatile uint8_t *) CM_PER_RNG_CLKCTRL = 2;
> > + while( *(volatile uint32_t *) CM_PER_RNG_CLKCTRL & 0x30000 ) {}
> > + }
> > +
> > + static uint64_t TRNG_GetRandData(){
> > + uint64_t output = rng->output;
>
> 'rng' isn't defined here.
>
> > + return output;
> > + }
> > +
> > + int getentropy(void *ptr, size_t n)
> > + {
> > + rng_ref_t const rng = (rng_ref_t) RNG_BASE;
> > + TRNG_Enable(rng);
> > + while (n > 0) {
> > + uint64_t random;
> > + size_t copy;
> > +
> > + while( ( rng->status & RNG_STATUS_RDY ) == 0 ); //wait
>
> You should check specifically for the TRNG_STATUS_READY flag here like
> done in FreeBSD. I'm not sure what the other flags are but it's quite
> possible that there is also some error flag or similar. In that case it
> would not be a good idea to use the random number.
>
> > +
> > + random = TRNG_GetRandData(rng);
>
> Note that you don't have to copy the function names from the atsam
> exactly. In the atsam BSP, the library has provided these names.
> Otherwise it's quite unusual to start functions with upper case in RTEMS.
>
> > +
> > + /*
> > + * 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.
> > + */
>
> That comment seems like it doesn't fit here any longer. You acknowledge
> the status instead in your next line. Just remove the comment.
>
> > + rng->status_clr = RNG_STATUS_RDY;
> > +
> > + copy = sizeof(random);
> > + if (n < copy ) {
> > + copy = n;
> > + }
> > + memcpy(ptr, &random, copy);
> > + n -= copy;
> > + ptr += copy;
> > + }
> > +
> > + return 0;
> > + }
> > +
> > + RTEMS_SYSINIT_ITEM(
> > + beagle_trng_clock_enable,
> > + RTEMS_SYSINIT_DEVICE_DRIVERS,
> > + RTEMS_SYSINIT_ORDER_LAST
> > + );
> >
> > Regards,
> > Udit agarwal
> >
> >
> > _______________________________________________
> > devel mailing list
> > devel at rtems.org
> > http://lists.rtems.org/mailman/listinfo/devel
> >
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.rtems.org/pipermail/devel/attachments/20180306/0c055c4f/attachment-0002.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: 0001-Added-getentropy-support-to-BBB-BSP.patch
Type: text/x-patch
Size: 7153 bytes
Desc: not available
URL: <http://lists.rtems.org/pipermail/devel/attachments/20180306/0c055c4f/attachment-0002.bin>
More information about the devel
mailing list