From e80f8331867bae418138c5315fd15ca619bee18f Mon Sep 17 00:00:00 2001 From: Andrew Hutchings Date: Fri, 13 Dec 2024 13:26:00 +0000 Subject: [PATCH] Add initial support for Gaisler-BCC with Sparc Slight modifications and documentation to get wolfSSL working with Gaisler Sparc CPUs and their cross-compilers. --- IDE/Gaisler-BCC/README.md | 65 +++++++++++++++++++++++++++++++++ IDE/Gaisler-BCC/include.am | 4 ++ IDE/include.am | 1 + wolfcrypt/benchmark/benchmark.c | 10 +++++ wolfssl/wolfcrypt/settings.h | 4 ++ 5 files changed, 84 insertions(+) create mode 100644 IDE/Gaisler-BCC/README.md create mode 100644 IDE/Gaisler-BCC/include.am diff --git a/IDE/Gaisler-BCC/README.md b/IDE/Gaisler-BCC/README.md new file mode 100644 index 0000000000..5becddce9b --- /dev/null +++ b/IDE/Gaisler-BCC/README.md @@ -0,0 +1,65 @@ +# Gaisler BCC + +This document outlines how to compile for the Gaisler LEON range of Sparc CPUs +using the BCC2 toolkit. The steps here should also work for the original BCC. + +## Compiler + +In the examples in this document, a Linux computer is used as a cross compiler +and the compilers have been extracted to `/opt`. You can install them elsewhere, +but please adjust commands accordingly. + +### Bare-metal + +To compile for bare-metal, you need to download the BCC2 binaries from +[here](https://www.gaisler.com/index.php/downloads/compilers). You can use +either the GCC or CLang version, but do note that you will need to set the +CFLAG `-std=c99` to compile in CLang. + +### Linux + +For Linux, you will need the "GNU toolchains for LEON and NOEL" from +[this link](https://www.gaisler.com/index.php/downloads/linux). + +## Compiling + +### Bare metal + +Copy the file `examples/config/user_settings_template.h` to `user_settings.h` in +the root of the source code. Then edit this to add the following: + +```c +#define WOLFSSL_GAISLER_BCC +#define WOLFSSL_GENSEED_FORTEST +``` + +The first `#define` is only required to compile the wolfCrypt benchmark. + +**Note:** that most Gaisler LEON processors do not have a good source of +entropy for the RNG. It is recommended an external entropy source is used when +developing for production. + +You can then compile with the following. Change `leon5` to the LEON CPU version +used: + +```sh +export CC=/opt/sparc-bcc-2.3.1-gcc/bin/sparc-gaisler-elf-gcc +export CXX=/opt/sparc-bcc-2.3.1-gcc/bin/sparc-gaisler-elf-g++ +export CFLAGS="-mcpu=leon5" + +./configure --host=sparc --enable-usersettings --disable-examples --enable-static +make +``` + +### Linux + +To compile for Linux on the LEON use the following commands: + +```sh +export CC=/opt/sparc-gaisler-linux5.10/bin/sparc-gaisler-linux5.10-gcc +export CXX=/opt/sparc-gaisler-linux5.10/bin/sparc-gaisler-linux5.10-g++ +export CFLAGS="-mcpu=leon5" + +./configure --host=sparc-linux +make +``` diff --git a/IDE/Gaisler-BCC/include.am b/IDE/Gaisler-BCC/include.am new file mode 100644 index 0000000000..3aaaa45f1f --- /dev/null +++ b/IDE/Gaisler-BCC/include.am @@ -0,0 +1,4 @@ +# vim:ft=automake +# All paths should be given relative to the root + +EXTRA_DIST+= IDE/Gaisler-BCC/README.md diff --git a/IDE/include.am b/IDE/include.am index 65e07cc338..fecdc15833 100644 --- a/IDE/include.am +++ b/IDE/include.am @@ -14,6 +14,7 @@ include IDE/ECLIPSE/RTTHREAD/include.am include IDE/ECLIPSE/SIFIVE/include.am include IDE/Espressif/include.am include IDE/GCC-ARM/include.am +include IDE/Gaisler-BCC/include.am include IDE/HEXAGON/include.am include IDE/IAR-MSP430/include.am include IDE/Infineon/include.am diff --git a/wolfcrypt/benchmark/benchmark.c b/wolfcrypt/benchmark/benchmark.c index 28e8e9e5f1..fa18aa0bbd 100644 --- a/wolfcrypt/benchmark/benchmark.c +++ b/wolfcrypt/benchmark/benchmark.c @@ -14701,6 +14701,16 @@ void bench_sphincsKeySign(byte level, byte optim) return (double)ns / 1000000000.0; } +#elif defined(WOLFSSL_GAISLER_BCC) + + #include + double current_time(int reset) + { + (void)reset; + uint32_t us = bcc_timer_get_us(); + return (double)us / 1000000.0; + } + #else #include diff --git a/wolfssl/wolfcrypt/settings.h b/wolfssl/wolfcrypt/settings.h index 8624f9418b..e82329a9d2 100644 --- a/wolfssl/wolfcrypt/settings.h +++ b/wolfssl/wolfcrypt/settings.h @@ -2785,6 +2785,10 @@ extern void uITRON4_free(void *p) ; #undef WOLFSSL_SP_INT_DIGIT_ALIGN #define WOLFSSL_SP_INT_DIGIT_ALIGN #endif +#if defined(__sparc) + #undef WOLFSSL_SP_INT_DIGIT_ALIGN + #define WOLFSSL_SP_INT_DIGIT_ALIGN +#endif #if defined(__APPLE__) || defined(WOLF_C89) #define WOLFSSL_SP_NO_DYN_STACK #endif