diff --git a/Makefile b/Makefile index 648dbcf6..cfae7148 100644 --- a/Makefile +++ b/Makefile @@ -14,6 +14,7 @@ DEBUG?=0 VTOR?=1 SWAP?=1 CORTEX_M0?=0 +NO_ASM=0 LSCRIPT:=hal/$(TARGET).ld @@ -53,9 +54,13 @@ ifeq ($(CORTEX_M0),1) CFLAGS:=-mcpu=cortex-m0 MATH_OBJS += ./lib/wolfssl/wolfcrypt/src/sp_c32.o else - CFLAGS:=-mcpu=cortex-m3 - #MATH_OBJS += ./lib/wolfssl/wolfcrypt/src/sp_cortexm.o - MATH_OBJS += ./lib/wolfssl/wolfcrypt/src/sp_c32.o + ifeq ($(NO_ASM),1) + MATH_OBJS += ./lib/wolfssl/wolfcrypt/src/sp_c32.o + CFLAGS:=-mcpu=cortex-m3 + else + CFLAGS:=-mcpu=cortex-m3 -DWOLFSSL_SP_ASM -DWOLFSSL_SP_ARM_CORTEX_M_ASM -fomit-frame-pointer + MATH_OBJS += ./lib/wolfssl/wolfcrypt/src/sp_cortexm.o + endif endif ifeq ($(FASTMATH),1) diff --git a/lib/wolfssl b/lib/wolfssl index a506c659..501a3a28 160000 --- a/lib/wolfssl +++ b/lib/wolfssl @@ -1 +1 @@ -Subproject commit a506c6591dad47036508d55315d09bc13b799a1f +Subproject commit 501a3a287b70a1daa982c016f843eb78b44b4857 diff --git a/src/xmalloc.c b/src/xmalloc.c index 2fa1259b..92f86049 100644 --- a/src/xmalloc.c +++ b/src/xmalloc.c @@ -2,41 +2,48 @@ #include /* Allow one single sp_point to be allocated at one time */ - -#define SP_POINT_SIZE (244) -#define MAX_POINTS 2 -#define SCRATCHBOARD_SIZE (640) +#ifdef WOLFSSL_SP_ASM +# define SP_POINT_SIZE (196) +# define SCRATCHBOARD_SIZE (512) +# define SP_DIGITS_SIZE (320) +# define MAX_POINTS (4) +# define MULTIPOINT_SIZE (16) +#else +# define SP_POINT_SIZE (244) +# define SCRATCHBOARD_SIZE (640) +# define SP_DIGITS_SIZE (400) +# define MAX_POINTS (2) +# define MULTIPOINT_SIZE (3) +#endif #define TMP_BUFFER_SIZE (124) -#define SP_DIGITS_SIZE (400) #define SP_NORMALIZER_SIZE (128) static uint8_t sp_scratchboard[SCRATCHBOARD_SIZE]; static int sp_scratchboard_in_use = 0; -static uint8_t sp_point_buffer0[SP_POINT_SIZE]; -static uint8_t sp_point_buffer1[SP_POINT_SIZE]; +static int sp_point_in_use[MAX_POINTS] = { }; +static uint8_t sp_point_buffer[MAX_POINTS][SP_POINT_SIZE]; + static uint8_t tmp_buffer[TMP_BUFFER_SIZE]; -static uint8_t sp_three_points[SP_POINT_SIZE * 3]; +static uint8_t sp_multipoint[SP_POINT_SIZE * MULTIPOINT_SIZE]; static uint8_t sp_digits[SP_DIGITS_SIZE]; static uint8_t sp_normalizer[SP_NORMALIZER_SIZE]; -static int point_0_in_use = 0; -static int point_1_in_use = 0; static int tmp_buffer_in_use = 0; -static int sp_three_points_in_use = 0; +static int sp_multipoint_in_use = 0; static int sp_digits_in_use = 0; static int sp_normalizer_in_use = 0; static void* xmalloc_sp_point(void) { - if (point_0_in_use) { - if (point_1_in_use) - return NULL; - point_1_in_use++; - return sp_point_buffer1; + int i; + for (i = 0; i < MAX_POINTS; i++) { + if (sp_point_in_use[i] == 0) { + sp_point_in_use[i]++; + return sp_point_buffer[i]; + } } - point_0_in_use++; - return sp_point_buffer0; + return NULL; } static void* xmalloc_sp_scratchboard(void) @@ -55,12 +62,12 @@ static void* xmalloc_sp_tmpbuffer(void) return tmp_buffer; } -static void* xmalloc_sp_three_points(void) +static void* xmalloc_sp_multipoint(void) { - if (sp_three_points_in_use) + if (sp_multipoint_in_use) return NULL; - sp_three_points_in_use++; - return sp_three_points; + sp_multipoint_in_use++; + return sp_multipoint; } static void* xmalloc_sp_digits(void) @@ -88,8 +95,8 @@ void* XMALLOC(size_t n, void* heap, int type) return xmalloc_sp_scratchboard(); if (n == TMP_BUFFER_SIZE) return xmalloc_sp_tmpbuffer(); - if (n == 3 * SP_POINT_SIZE) - return xmalloc_sp_three_points(); + if (n == MULTIPOINT_SIZE * SP_POINT_SIZE) + return xmalloc_sp_multipoint(); if (n == SP_DIGITS_SIZE) return xmalloc_sp_digits(); if (n == SP_NORMALIZER_SIZE) @@ -99,18 +106,21 @@ void* XMALLOC(size_t n, void* heap, int type) void XFREE(void *ptr) { - if (ptr == sp_point_buffer0) - point_0_in_use = 0; - if (ptr == sp_point_buffer1) - point_1_in_use = 0; + int i; if (ptr == sp_scratchboard) sp_scratchboard_in_use = 0; if (ptr == tmp_buffer) tmp_buffer_in_use = 0; - if (ptr == sp_three_points) - sp_three_points_in_use = 0; + if (ptr == sp_multipoint) + sp_multipoint_in_use = 0; if (ptr == sp_digits) sp_digits_in_use = 0; if (ptr == sp_normalizer) sp_normalizer_in_use = 0; + for (i = 0; i < MAX_POINTS; i++) { + if (ptr == sp_point_buffer[i]) { + sp_point_in_use[i] = 0; + return; + } + } }