Skip to content

Commit b5fd49a

Browse files
committed
Initial experimental support for RISC-V
- New Makefile to support multiple architectures - Separate architecture-specific start-up files - Stub for a hifive1 HAL port
1 parent e7863ca commit b5fd49a

18 files changed

Lines changed: 817 additions & 116 deletions

Makefile

Lines changed: 92 additions & 91 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,15 @@
1-
CROSS_COMPILE:=arm-none-eabi-
2-
CC:=$(CROSS_COMPILE)gcc
3-
LD:=$(CROSS_COMPILE)gcc
4-
AS:=$(CROSS_COMPILE)gcc
5-
OBJCOPY:=$(CROSS_COMPILE)objcopy
6-
SIZE:=$(CROSS_COMPILE)size
7-
BOOT0_OFFSET?=`cat include/target.h |grep WOLFBOOT_PARTITION_BOOT_ADDRESS | head -1 | sed -e "s/.*[ ]//g"`
8-
BOOT_IMG?=test-app/image.bin
1+
## wolfBoot Makefile
2+
#
3+
# Configure by passing alternate values
4+
# via environment variables.
5+
#
6+
# Default values:
7+
ARCH?=ARM
8+
TARGET?=stm32f4
99
SIGN?=ED25519
1010
TARGET?=stm32f4
1111
KINETIS?=$(HOME)/src/FRDM-K64F
12+
KINETIS_CPU=MK64FN1M0VLL12
1213
KINETIS_DRIVERS?=$(KINETIS)/devices/MK64F12
1314
KINETIS_CMSIS?=$(KINETIS)/CMSIS
1415
DEBUG?=0
@@ -19,68 +20,70 @@ EXT_FLASH?=0
1920
SPI_FLASH?=0
2021
ALLOW_DOWNGRADE?=0
2122
NVM_FLASH_WRITEONCE?=0
22-
LSCRIPT:=hal/$(TARGET).ld
23+
V?=0
24+
2325

26+
27+
## Initializers
28+
CFLAGS:=-D__WOLFBOOT
29+
LSCRIPT:=hal/$(TARGET).ld
30+
LDFLAGS:=-T $(LSCRIPT) -Wl,-gc-sections -Wl,-Map=wolfboot.map -ffreestanding -nostartfiles
2431
OBJS:= \
2532
./hal/$(TARGET).o \
2633
./src/loader.o \
2734
./src/string.o \
2835
./src/crypto.o \
29-
./src/wolfboot.o \
3036
./src/image.o \
3137
./src/libwolfboot.o \
3238
./lib/wolfssl/wolfcrypt/src/sha256.o \
3339
./lib/wolfssl/wolfcrypt/src/hash.o \
3440
./lib/wolfssl/wolfcrypt/src/wolfmath.o \
3541
./lib/wolfssl/wolfcrypt/src/fe_low_mem.o
3642

37-
## Target specific configuration
38-
ifeq ($(TARGET),samr21)
39-
CORTEX_M0=1
43+
## Architecture/CPU configuration
44+
include arch.mk
45+
46+
47+
## DSA Settings
48+
49+
ifeq ($(FASTMATH),1)
50+
MATH_OBJS:=./lib/wolfssl/wolfcrypt/src/integer.o
51+
CFLAGS+=-DUSE_FAST_MATH
52+
else
53+
MATH_OBJS:=./lib/wolfssl/wolfcrypt/src/sp_int.o
4054
endif
4155

42-
## Signature
4356
ifeq ($(SIGN),ECC256)
4457
KEYGEN_TOOL=tools/ecc256/ecc256_keygen
4558
SIGN_TOOL=tools/ecc256/ecc256_sign
4659
PRIVATE_KEY=ecc256.der
60+
OBJS+= \
61+
$(MATH_OBJS) \
62+
./lib/wolfssl/wolfcrypt/src/ecc.o \
63+
./lib/wolfssl/wolfcrypt/src/ge_low_mem.o \
64+
./lib/wolfssl/wolfcrypt/src/memory.o \
65+
./lib/wolfssl/wolfcrypt/src/wc_port.o \
66+
./src/ecc256_pub_key.o \
67+
./src/xmalloc.o
68+
CFLAGS+=-DWOLFBOOT_SIGN_ECC256 -DXMALLOC_USER
4769
else
4870
KEYGEN_TOOL=tools/ed25519/ed25519_keygen
4971
SIGN_TOOL=tools/ed25519/ed25519_sign
5072
PRIVATE_KEY=ed25519.der
73+
OBJS+= ./lib/wolfssl/wolfcrypt/src/sha512.o \
74+
./lib/wolfssl/wolfcrypt/src/ed25519.o \
75+
./lib/wolfssl/wolfcrypt/src/ge_low_mem.o \
76+
./src/ed25519_pub_key.o
77+
CFLAGS+=-DWOLFBOOT_SIGN_ED25519 -nostdlib -DWOLFSSL_STATIC_MEMORY
78+
LDFLAGS+=-nostdlib
5179
endif
5280

53-
MATH_OBJS:=./lib/wolfssl/wolfcrypt/src/sp_int.o
54-
55-
ifeq ($(CORTEX_M0),1)
56-
CFLAGS:=-mcpu=cortex-m0
57-
MATH_OBJS += ./lib/wolfssl/wolfcrypt/src/sp_c32.o
58-
else
59-
ifeq ($(NO_ASM),1)
60-
MATH_OBJS += ./lib/wolfssl/wolfcrypt/src/sp_c32.o
61-
CFLAGS:=-mcpu=cortex-m3
62-
else
63-
CFLAGS:=-mcpu=cortex-m3 -D__WOLFBOOT -DWOLFSSL_SP_ASM -DWOLFSSL_SP_ARM_CORTEX_M_ASM -fomit-frame-pointer
64-
MATH_OBJS += ./lib/wolfssl/wolfcrypt/src/sp_cortexm.o
65-
endif
66-
endif
6781

68-
ifeq ($(FASTMATH),1)
69-
MATH_OBJS:=./lib/wolfssl/wolfcrypt/src/integer.o
70-
CFLAGS+=-DUSE_FAST_MATH
71-
endif
72-
73-
CFLAGS+=-mthumb -Wall -Wextra -Wno-main -Wstack-usage=1024 -ffreestanding -Wno-unused \
74-
-I. -Ilib/bootutil/include -Iinclude/ -Ilib/wolfssl -nostartfiles \
82+
CFLAGS+=-Wall -Wextra -Wno-main -Wstack-usage=1024 -ffreestanding -Wno-unused \
83+
-I. -Iinclude/ -Ilib/wolfssl -nostartfiles \
7584
-DWOLFSSL_USER_SETTINGS \
76-
-mthumb -mlittle-endian -mthumb-interwork \
7785
-DPLATFORM_$(TARGET)
7886

79-
ifeq ($(TARGET),kinetis)
80-
CFLAGS+= -I$(KINETIS_DRIVERS)/drivers -I$(KINETIS_DRIVERS) -DCPU_MK64FN1M0VLL12 -I$(KINETIS_CMSIS)/Include -DDEBUG_CONSOLE_ASSERT_DISABLE=1
81-
OBJS+= $(KINETIS_DRIVERS)/drivers/fsl_clock.o $(KINETIS_DRIVERS)/drivers/fsl_ftfx_flash.o $(KINETIS_DRIVERS)/drivers/fsl_ftfx_cache.o $(KINETIS_DRIVERS)/drivers/fsl_ftfx_controller.o
82-
endif
83-
8487
ifeq ($(SPI_FLASH),1)
8588
EXT_FLASH=1
8689
CFLAGS+= -DSPI_FLASH=1
@@ -91,7 +94,6 @@ ifeq ($(EXT_FLASH),1)
9194
CFLAGS+= -DEXT_FLASH=1 -DPART_UPDATE_EXT=1 -DPART_SWAP_EXT=1
9295
endif
9396

94-
9597
ifeq ($(ALLOW_DOWNGRADE),1)
9698
CFLAGS+= -DALLOW_DOWNGRADE
9799
endif
@@ -100,87 +102,76 @@ ifeq ($(NVM_FLASH_WRITEONCE),1)
100102
CFLAGS+= -DNVM_FLASH_WRITEONCE
101103
endif
102104

103-
LDFLAGS:=-T $(LSCRIPT) -Wl,-gc-sections -Wl,-Map=wolfboot.map -ffreestanding -nostartfiles -mcpu=cortex-m3 -mthumb
104-
ASFLAGS:=$(CFLAGS)
105105

106-
ifeq ($(SIGN),ED25519)
107-
OBJS+= ./lib/wolfssl/wolfcrypt/src/sha512.o \
108-
./lib/wolfssl/wolfcrypt/src/ed25519.o \
109-
./lib/wolfssl/wolfcrypt/src/ge_low_mem.o \
110-
./src/ed25519_pub_key.o
111-
CFLAGS+=-DWOLFBOOT_SIGN_ED25519 -nostdlib -DWOLFSSL_STATIC_MEMORY
112-
LDFLAGS+=-nostdlib
113-
endif
114-
115-
ifeq ($(SIGN),ECC256)
116-
OBJS+= \
117-
$(MATH_OBJS) \
118-
./lib/wolfssl/wolfcrypt/src/ecc.o \
119-
./lib/wolfssl/wolfcrypt/src/ge_low_mem.o \
120-
./lib/wolfssl/wolfcrypt/src/memory.o \
121-
./lib/wolfssl/wolfcrypt/src/wc_port.o \
122-
./src/ecc256_pub_key.o \
123-
./src/xmalloc.o
124-
CFLAGS+=-DWOLFBOOT_SIGN_ECC256 -DXMALLOC_USER
125-
endif
126106

127107
ifeq ($(DEBUG),1)
128108
CFLAGS+=-O0 -g -ggdb3 -DDEBUG=1
129109
else
130110
CFLAGS+=-Os
131111
endif
132112

113+
ifeq ($(V),0)
114+
Q=@
115+
endif
116+
133117
ifeq ($(VTOR),0)
134118
CFLAGS+=-DNO_VTOR
135119
endif
136120

121+
ASFLAGS:=$(CFLAGS)
137122

138123
all: factory.bin
139124

140-
141125
wolfboot.bin: wolfboot.elf
142-
$(OBJCOPY) -O binary $^ $@
143-
$(SIZE) wolfboot.elf
126+
@echo "\t[BIN] $@"
127+
$(Q)$(OBJCOPY) -O binary $^ $@
144128

145129
wolfboot.hex: wolfboot.elf
146-
$(OBJCOPY) -O ihex $^ $@
130+
@echo "\t[HEX] $@"
131+
$(Q)$(OBJCOPY) -O ihex $^ $@
147132

148133
align: wolfboot-align.bin
149134

150-
wolfboot-align.bin: wolfboot.elf
151-
$(OBJCOPY) -O binary $^ $@ --pad-to=$(BOOT0_OFFSET) --gap-fill=255
152-
$(SIZE) wolfboot.elf
153-
135+
wolfboot-align.bin: wolfboot.bin
136+
@cat include/target.h |grep WOLFBOOT_PARTITION_BOOT_ADDRESS | head -1 | sed -e "s/.*[ ]//g" > .wolfboot-offset
137+
@printf "%d" `cat .wolfboot-offset` > .wolfboot-offset
138+
@printf "%d" $(ARCH_FLASH_OFFSET) >.wolfboot-arch-offset
139+
@expr `cat .wolfboot-offset` - `cat .wolfboot-arch-offset` >.wolfboot-partition-size
140+
@dd if=/dev/zero bs=`cat .wolfboot-partition-size` count=1 2>/dev/null | tr "\000" "\377" > $(@)
141+
@rm -f .wolfboot-partition-size .wolfboot-offset .wolfboot-arch-offset
142+
@dd if=$^ of=$(@) conv=notrunc 2>/dev/null
143+
@echo
144+
@echo "\t[SIZE]"
145+
@$(SIZE) wolfboot.elf
146+
@echo
154147

155148
test-app/image.bin:
156-
make -C test-app TARGET=$(TARGET) EXT_FLASH=$(EXT_FLASH) SPI_FLASH=$(SPI_FLASH)
149+
@make -C test-app TARGET=$(TARGET) EXT_FLASH=$(EXT_FLASH) SPI_FLASH=$(SPI_FLASH) ARCH=$(ARCH) V=$(V)
150+
@rm -f src/*.o hal/*.o
157151

158152
include tools/test.mk
159153

160154
tools/ed25519/ed25519_sign:
161-
make -C tools/ed25519
155+
@make -C tools/ed25519
162156

163157
tools/ecc256/ecc256_sign:
164-
make -C tools/ecc256
158+
@make -C tools/ecc256
165159

166160
ed25519.der: tools/ed25519/ed25519_sign
167-
tools/ed25519/ed25519_keygen src/ed25519_pub_key.c
161+
@tools/ed25519/ed25519_keygen src/ed25519_pub_key.c
168162

169163
ecc256.der: tools/ecc256/ecc256_sign
170-
tools/ecc256/ecc256_keygen src/ecc256_pub_key.c
164+
@tools/ecc256/ecc256_keygen src/ecc256_pub_key.c
171165

172166
factory.bin: $(BOOT_IMG) wolfboot-align.bin $(SIGN_TOOL) $(PRIVATE_KEY)
173-
$(SIGN_TOOL) $(BOOT_IMG) $(PRIVATE_KEY) 1
174-
cat wolfboot-align.bin $(BOOT_IMG).v1.signed > $@
175-
176-
second.img: $(BOOT_IMG) wolfboot-align.bin $(SIGN_TOOL) $(PRIVATE_KEY)
177-
$(SIGN_TOOL) $(BOOT_IMG) $(PRIVATE_KEY) 1 65536
178-
$(SIGN_TOOL) $(BOOT_IMG) $(PRIVATE_KEY) 2
179-
cat wolfboot-align.bin $(BOOT_IMG).v1.signed $(BOOT_IMG).v2.signed > $@
167+
@echo "\t[SIGN] $(BOOT_IMG)"
168+
$(Q)$(SIGN_TOOL) $(BOOT_IMG) $(PRIVATE_KEY) 1 >/dev/null
169+
@echo "\t[MERGE] $@"
170+
@cat wolfboot-align.bin $(BOOT_IMG).v1.signed > $@
180171

181172
wolfboot.elf: $(OBJS) $(LSCRIPT)
182-
grep stat $(OBJS)
183-
$(LD) $(LDFLAGS) -Wl,--start-group $(OBJS) -Wl,--end-group -o $@
173+
@echo "\t[LD] $@"
174+
$(Q)$(LD) $(LDFLAGS) -Wl,--start-group $(OBJS) -Wl,--end-group -o $@
184175

185176
src/ed25519_pub_key.c: ed25519.der
186177

@@ -189,13 +180,23 @@ src/ecc256_pub_key.c: ecc256.der
189180
keys: $(PRIVATE_KEY)
190181

191182
clean:
192-
rm -f *.bin *.elf $(OBJS) wolfboot.map *.bin *.hex hal/*.o
193-
make -C test-app clean
183+
@find . -type f -name "*.o" | xargs -x rm -f
184+
@rm -f *.bin *.elf wolfboot.map *.bin *.hex
185+
@make -C test-app clean
194186

195187
distclean: clean
196-
make -C tools/ed25519 clean
197-
make -C tools/ecc256 clean
198-
rm -f *.pem *.der tags ./src/ed25519_pub_key.c ./src/ecc256_pub_key.c
188+
@make -C tools/ed25519 clean
189+
@make -C tools/ecc256 clean
190+
@rm -f *.pem *.der tags ./src/ed25519_pub_key.c ./src/ecc256_pub_key.c
191+
192+
193+
%.o:%.c
194+
@echo "\t[CC-$(ARCH)] $@"
195+
$(Q)$(CC) $(CFLAGS) -c -o $@ $^
196+
197+
%.o:%.S
198+
@echo "\t[AS-$(ARCH)] $@"
199+
$(Q)$(CC) $(CFLAGS) -c -o $@ $^
199200

200201
FORCE:
201202

arch.mk

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
## CPU Architecture selection via $ARCH
2+
3+
## ARM
4+
ifeq ($(ARCH),ARM)
5+
CROSS_COMPILE:=arm-none-eabi-
6+
CFLAGS+=-mthumb -mlittle-endian -mthumb-interwork -DARCH_ARM
7+
LDFLAGS+=-mthumb -mlittle-endian -mthumb-interwork
8+
OBJS+=src/boot_arm.o
9+
ARCH_FLASH_OFFSET=0x0
10+
11+
## Cortex-M CPU
12+
ifeq ($(CORTEX_M0),1)
13+
CFLAGS+=-mcpu=cortex-m0
14+
LDFLAGS+=-mcpu=cortex-m0
15+
MATH_OBJS += ./lib/wolfssl/wolfcrypt/src/sp_c32.o
16+
else
17+
ifeq ($(NO_ASM),1)
18+
MATH_OBJS += ./lib/wolfssl/wolfcrypt/src/sp_c32.o
19+
CFLAGS+=-mcpu=cortex-m3
20+
LDFLAGS+=-mcpu=cortex-m3
21+
else
22+
CFLAGS+=-mcpu=cortex-m3 -DWOLFSSL_SP_ASM -DWOLFSSL_SP_ARM_CORTEX_M_ASM -fomit-frame-pointer
23+
LDFLAGS+=-mcpu=cortex-m3
24+
MATH_OBJS += ./lib/wolfssl/wolfcrypt/src/sp_cortexm.o
25+
endif
26+
endif
27+
endif
28+
29+
## RISCV
30+
ifeq ($(ARCH),RISCV)
31+
CROSS_COMPILE:=riscv32-unknown-elf-
32+
CFLAGS+=-fno-builtin-printf -DUSE_PLIC -DUSE_M_TIME -g -march=rv32imac -mabi=ilp32 -mcmodel=medany -nostartfiles -DARCH_RISCV
33+
LDFLAGS+=-march=rv32imac -mabi=ilp32 -mcmodel=medany
34+
OBJS+=src/boot_riscv.o src/vector_riscv.o
35+
ARCH_FLASH_OFFSET=0x20400000
36+
endif
37+
38+
## Toolchain setup
39+
CC=$(CROSS_COMPILE)gcc
40+
LD=$(CROSS_COMPILE)gcc
41+
AS=$(CROSS_COMPILE)gcc
42+
OBJCOPY:=$(CROSS_COMPILE)objcopy
43+
SIZE:=$(CROSS_COMPILE)size
44+
BOOT_IMG?=test-app/image.bin
45+
46+
## Target specific configuration
47+
ifeq ($(TARGET),samr21)
48+
CORTEX_M0=1
49+
endif
50+
51+
ifeq ($(TARGET),kinetis)
52+
CFLAGS+= -I$(KINETIS_DRIVERS)/drivers -I$(KINETIS_DRIVERS) -DCPU_$(KINETIS_CPU) -I$(KINETIS_CMSIS)/Include -DDEBUG_CONSOLE_ASSERT_DISABLE=1
53+
OBJS+= $(KINETIS_DRIVERS)/drivers/fsl_clock.o $(KINETIS_DRIVERS)/drivers/fsl_ftfx_flash.o $(KINETIS_DRIVERS)/drivers/fsl_ftfx_cache.o $(KINETIS_DRIVERS)/drivers/fsl_ftfx_controller.o
54+
endif

0 commit comments

Comments
 (0)