mirror of
https://github.com/trezor/trezor-firmware.git
synced 2024-11-22 07:28:10 +00:00
embed: rework memory layout, enable stack protector
This commit is contained in:
parent
7117c59ed9
commit
6413c2c23e
28
Makefile
28
Makefile
@ -28,6 +28,14 @@ endif
|
|||||||
STLINK_VER ?= v2
|
STLINK_VER ?= v2
|
||||||
OPENOCD = openocd -f interface/stlink-$(STLINK_VER).cfg -c "transport select hla_swd" -f target/stm32f4x.cfg
|
OPENOCD = openocd -f interface/stlink-$(STLINK_VER).cfg -c "transport select hla_swd" -f target/stm32f4x.cfg
|
||||||
|
|
||||||
|
BOARDLOADER_START = 0x08000000
|
||||||
|
BOOTLOADER_START = 0x08020000
|
||||||
|
FIRMWARE_START = 0x08040000
|
||||||
|
|
||||||
|
BOARDLOADER_MAXSIZE = 49152
|
||||||
|
BOOTLOADER_MAXSIZE = 131072
|
||||||
|
FIRMWARE_MAXSIZE = 786432
|
||||||
|
|
||||||
## help commands:
|
## help commands:
|
||||||
|
|
||||||
help: ## show this help
|
help: ## show this help
|
||||||
@ -109,16 +117,16 @@ clean_cross: ## clean mpy-cross build
|
|||||||
flash: flash_boardloader flash_bootloader flash_firmware ## flash everything using OpenOCD
|
flash: flash_boardloader flash_bootloader flash_firmware ## flash everything using OpenOCD
|
||||||
|
|
||||||
flash_boardloader: $(BOARDLOADER_BUILD_DIR)/boardloader.bin ## flash boardloader using OpenOCD
|
flash_boardloader: $(BOARDLOADER_BUILD_DIR)/boardloader.bin ## flash boardloader using OpenOCD
|
||||||
$(OPENOCD) -c "init; reset halt; flash write_image erase $< 0x08000000; exit"
|
$(OPENOCD) -c "init; reset halt; flash write_image erase $< $(BOARDLOADER_START); exit"
|
||||||
|
|
||||||
flash_bootloader: $(BOOTLOADER_BUILD_DIR)/bootloader.bin ## flash bootloader using OpenOCD
|
flash_bootloader: $(BOOTLOADER_BUILD_DIR)/bootloader.bin ## flash bootloader using OpenOCD
|
||||||
$(OPENOCD) -c "init; reset halt; flash write_image erase $< 0x08010000; exit"
|
$(OPENOCD) -c "init; reset halt; flash write_image erase $< $(BOOTLOADER_START); exit"
|
||||||
|
|
||||||
flash_firmware: $(FIRMWARE_BUILD_DIR)/firmware.bin ## flash firmware using OpenOCD
|
flash_firmware: $(FIRMWARE_BUILD_DIR)/firmware.bin ## flash firmware using OpenOCD
|
||||||
$(OPENOCD) -c "init; reset halt; flash write_image erase $< 0x08020000; exit"
|
$(OPENOCD) -c "init; reset halt; flash write_image erase $< $(FIRMWARE_START); exit"
|
||||||
|
|
||||||
flash_combine: $(FIRMWARE_BUILD_DIR)/combined.bin ## flash combined using OpenOCD
|
flash_combine: $(FIRMWARE_BUILD_DIR)/combined.bin ## flash combined using OpenOCD
|
||||||
$(OPENOCD) -c "init; reset halt; flash write_image erase $< 0x08000000; exit"
|
$(OPENOCD) -c "init; reset halt; flash write_image erase $< $(BOARDLOADER_START); exit"
|
||||||
|
|
||||||
flash_erase: ## erase all sectors in flash bank 0
|
flash_erase: ## erase all sectors in flash bank 0
|
||||||
$(OPENOCD) -c "init; reset halt; flash info 0; flash erase_sector 0 0 last; flash erase_check 0; exit"
|
$(OPENOCD) -c "init; reset halt; flash info 0; flash erase_sector 0 0 last; flash erase_check 0; exit"
|
||||||
@ -159,13 +167,13 @@ bloaty: ## run bloaty size profiler
|
|||||||
bloaty -d compileunits -n 0 -s file $(FIRMWARE_BUILD_DIR)/firmware.elf | less
|
bloaty -d compileunits -n 0 -s file $(FIRMWARE_BUILD_DIR)/firmware.elf | less
|
||||||
|
|
||||||
sizecheck: ## check sizes of binary files
|
sizecheck: ## check sizes of binary files
|
||||||
test 32768 -ge $(shell stat -c%s $(BOARDLOADER_BUILD_DIR)/boardloader.bin)
|
test $(BOARDLOADER_MAXSIZE) -ge $(shell stat -c%s $(BOARDLOADER_BUILD_DIR)/boardloader.bin)
|
||||||
test 65536 -ge $(shell stat -c%s $(BOOTLOADER_BUILD_DIR)/bootloader.bin)
|
test $(BOOTLOADER_MAXSIZE) -ge $(shell stat -c%s $(BOOTLOADER_BUILD_DIR)/bootloader.bin)
|
||||||
test 917504 -ge $(shell stat -c%s $(FIRMWARE_BUILD_DIR)/firmware.bin)
|
test $(FIRMWARE_MAXSIZE) -ge $(shell stat -c%s $(FIRMWARE_BUILD_DIR)/firmware.bin)
|
||||||
|
|
||||||
combine: ## combine boardloader + bootloader + firmware into one combined image
|
combine: ## combine boardloader + bootloader + firmware into one combined image
|
||||||
./tools/combine_firmware \
|
./tools/combine_firmware \
|
||||||
0x08000000 $(BOARDLOADER_BUILD_DIR)/boardloader.bin \
|
$(BOARDLOADER_START) $(BOARDLOADER_BUILD_DIR)/boardloader.bin \
|
||||||
0x08010000 $(BOOTLOADER_BUILD_DIR)/bootloader.bin \
|
$(BOOTLOADER_START) $(BOOTLOADER_BUILD_DIR)/bootloader.bin \
|
||||||
0x08020000 $(FIRMWARE_BUILD_DIR)/firmware.bin \
|
$(FIRMWARE_START) $(FIRMWARE_BUILD_DIR)/firmware.bin \
|
||||||
> $(FIRMWARE_BUILD_DIR)/combined.bin \
|
> $(FIRMWARE_BUILD_DIR)/combined.bin \
|
||||||
|
@ -105,6 +105,7 @@ env.Replace(
|
|||||||
'-std=gnu99 -Wall -Werror -Wdouble-promotion -Wpointer-arith '
|
'-std=gnu99 -Wall -Werror -Wdouble-promotion -Wpointer-arith '
|
||||||
'-mthumb -mtune=cortex-m4 -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=hard '
|
'-mthumb -mtune=cortex-m4 -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=hard '
|
||||||
'-fsingle-precision-constant -fdata-sections -ffunction-sections ' +
|
'-fsingle-precision-constant -fdata-sections -ffunction-sections ' +
|
||||||
|
'-fstack-protector-all ' +
|
||||||
CCFLAGS_MOD,
|
CCFLAGS_MOD,
|
||||||
CCFLAGS_QSTR='-DNO_QSTR -DN_X64 -DN_X86 -DN_THUMB',
|
CCFLAGS_QSTR='-DNO_QSTR -DN_X64 -DN_X86 -DN_THUMB',
|
||||||
LINKFLAGS='-nostdlib -T embed/boardloader/memory.ld --gc-sections',
|
LINKFLAGS='-nostdlib -T embed/boardloader/memory.ld --gc-sections',
|
||||||
|
@ -93,6 +93,7 @@ SOURCE_TREZORHAL = [
|
|||||||
'embed/trezorhal/image.c',
|
'embed/trezorhal/image.c',
|
||||||
'embed/trezorhal/flash.c',
|
'embed/trezorhal/flash.c',
|
||||||
'embed/trezorhal/mini_printf.c',
|
'embed/trezorhal/mini_printf.c',
|
||||||
|
'embed/trezorhal/rng.c',
|
||||||
'embed/trezorhal/stm32.c',
|
'embed/trezorhal/stm32.c',
|
||||||
'embed/trezorhal/touch.c',
|
'embed/trezorhal/touch.c',
|
||||||
'embed/trezorhal/usb.c',
|
'embed/trezorhal/usb.c',
|
||||||
@ -122,6 +123,7 @@ env.Replace(
|
|||||||
'-std=gnu99 -Wall -Werror -Wdouble-promotion -Wpointer-arith '
|
'-std=gnu99 -Wall -Werror -Wdouble-promotion -Wpointer-arith '
|
||||||
'-mthumb -mtune=cortex-m4 -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=hard '
|
'-mthumb -mtune=cortex-m4 -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=hard '
|
||||||
'-fsingle-precision-constant -fdata-sections -ffunction-sections ' +
|
'-fsingle-precision-constant -fdata-sections -ffunction-sections ' +
|
||||||
|
'-fstack-protector-all ' +
|
||||||
CCFLAGS_MOD,
|
CCFLAGS_MOD,
|
||||||
CCFLAGS_QSTR='-DNO_QSTR -DN_X64 -DN_X86 -DN_THUMB',
|
CCFLAGS_QSTR='-DNO_QSTR -DN_X64 -DN_X86 -DN_THUMB',
|
||||||
LINKFLAGS='-nostdlib -T embed/bootloader/memory.ld --gc-sections',
|
LINKFLAGS='-nostdlib -T embed/bootloader/memory.ld --gc-sections',
|
||||||
|
@ -324,6 +324,7 @@ env.Replace(
|
|||||||
'-std=gnu99 -Wall -Werror -Wdouble-promotion -Wpointer-arith '
|
'-std=gnu99 -Wall -Werror -Wdouble-promotion -Wpointer-arith '
|
||||||
'-mthumb -mtune=cortex-m4 -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=hard '
|
'-mthumb -mtune=cortex-m4 -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 -mfloat-abi=hard '
|
||||||
'-fsingle-precision-constant -fdata-sections -ffunction-sections ' +
|
'-fsingle-precision-constant -fdata-sections -ffunction-sections ' +
|
||||||
|
'-fstack-protector-all ' +
|
||||||
CCFLAGS_MOD,
|
CCFLAGS_MOD,
|
||||||
CCFLAGS_QSTR='-DNO_QSTR -DN_X64 -DN_X86 -DN_THUMB',
|
CCFLAGS_QSTR='-DNO_QSTR -DN_X64 -DN_X86 -DN_THUMB',
|
||||||
CCFLAGS_OPT='-O3',
|
CCFLAGS_OPT='-O3',
|
||||||
|
@ -6,16 +6,29 @@
|
|||||||
|-----------|-------------------------|--------:|----------------------
|
|-----------|-------------------------|--------:|----------------------
|
||||||
| Sector 0 | 0x08000000 - 0x08003FFF | 16 KiB | boardloader (1st stage) (write-protected)
|
| Sector 0 | 0x08000000 - 0x08003FFF | 16 KiB | boardloader (1st stage) (write-protected)
|
||||||
| Sector 1 | 0x08004000 - 0x08007FFF | 16 KiB | boardloader (1st stage) (write-protected)
|
| Sector 1 | 0x08004000 - 0x08007FFF | 16 KiB | boardloader (1st stage) (write-protected)
|
||||||
| Sector 2 | 0x08008000 - 0x0800BFFF | 16 KiB | storage area
|
| Sector 2 | 0x08008000 - 0x0800BFFF | 16 KiB | boardloader (1st stage) (write-protected)
|
||||||
| Sector 3 | 0x0800C000 - 0x0800FFFF | 16 KiB | storage area
|
| Sector 3 | 0x0800C000 - 0x0800FFFF | 16 KiB | ?
|
||||||
| Sector 4 | 0x08010000 - 0x0801FFFF | 64 KiB | bootloader (2nd stage)
|
| Sector 4 | 0x08010000 - 0x0801FFFF | 64 KiB | storage area #1
|
||||||
| Sector 5 | 0x08020000 - 0x0803FFFF | 128 KiB | firmware
|
| Sector 5 | 0x08020000 - 0x0803FFFF | 128 KiB | boardloader (2nd stage)
|
||||||
| Sector 6 | 0x08040000 - 0x0805FFFF | 128 KiB | firmware
|
| Sector 6 | 0x08040000 - 0x0805FFFF | 128 KiB | firmware
|
||||||
| Sector 7 | 0x08060000 - 0x0807FFFF | 128 KiB | firmware
|
| Sector 7 | 0x08060000 - 0x0807FFFF | 128 KiB | firmware
|
||||||
| Sector 8 | 0x08080000 - 0x0809FFFF | 128 KiB | firmware
|
| Sector 8 | 0x08080000 - 0x0809FFFF | 128 KiB | firmware
|
||||||
| Sector 9 | 0x080A0000 - 0x080BFFFF | 128 KiB | firmware
|
| Sector 9 | 0x080A0000 - 0x080BFFFF | 128 KiB | firmware
|
||||||
| Sector 10 | 0x080C0000 - 0x080DFFFF | 128 KiB | firmware
|
| Sector 10 | 0x080C0000 - 0x080DFFFF | 128 KiB | firmware
|
||||||
| Sector 11 | 0x080E0000 - 0x080FFFFF | 128 KiB | firmware
|
| Sector 11 | 0x080E0000 - 0x080FFFFF | 128 KiB | firmware
|
||||||
|
|-----------|-------------------------|--------:|----------------------
|
||||||
|
| Sector 12 | 0x08100000 - 0x08103FFF | 16 KiB | ?
|
||||||
|
| Sector 13 | 0x08104000 - 0x08107FFF | 16 KiB | ?
|
||||||
|
| Sector 14 | 0x08108000 - 0x0810BFFF | 16 KiB | ?
|
||||||
|
| Sector 15 | 0x0810C000 - 0x0810FFFF | 16 KiB | ?
|
||||||
|
| Sector 16 | 0x08110000 - 0x0811FFFF | 64 KiB | storage area #2
|
||||||
|
| Sector 17 | 0x08120000 - 0x0813FFFF | 128 KiB | ?
|
||||||
|
| Sector 18 | 0x08140000 - 0x0815FFFF | 128 KiB | ?
|
||||||
|
| Sector 19 | 0x08160000 - 0x0817FFFF | 128 KiB | ?
|
||||||
|
| Sector 20 | 0x08180000 - 0x0819FFFF | 128 KiB | ?
|
||||||
|
| Sector 21 | 0x081A0000 - 0x081BFFFF | 128 KiB | ?
|
||||||
|
| Sector 22 | 0x081C0000 - 0x081DFFFF | 128 KiB | ?
|
||||||
|
| Sector 23 | 0x081E0000 - 0x081FFFFF | 128 KiB | ?
|
||||||
|
|
||||||
## RAM
|
## RAM
|
||||||
|
|
||||||
|
@ -4,6 +4,7 @@
|
|||||||
#include "display.h"
|
#include "display.h"
|
||||||
#include "image.h"
|
#include "image.h"
|
||||||
#include "flash.h"
|
#include "flash.h"
|
||||||
|
#include "rng.h"
|
||||||
#include "sdcard.h"
|
#include "sdcard.h"
|
||||||
#include "version.h"
|
#include "version.h"
|
||||||
|
|
||||||
@ -143,6 +144,8 @@ void check_and_jump(void)
|
|||||||
|
|
||||||
int main(void)
|
int main(void)
|
||||||
{
|
{
|
||||||
|
__stack_chk_guard = rng_get();
|
||||||
|
|
||||||
clear_peripheral_local_memory();
|
clear_peripheral_local_memory();
|
||||||
periph_init();
|
periph_init();
|
||||||
|
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
ENTRY(reset_handler)
|
ENTRY(reset_handler)
|
||||||
|
|
||||||
MEMORY {
|
MEMORY {
|
||||||
FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 32K
|
FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 48K
|
||||||
CCMRAM (wal) : ORIGIN = 0x10000000, LENGTH = 64K
|
CCMRAM (wal) : ORIGIN = 0x10000000, LENGTH = 64K
|
||||||
SRAM (wal) : ORIGIN = 0x20000000, LENGTH = 128K
|
SRAM (wal) : ORIGIN = 0x20000000, LENGTH = 128K
|
||||||
}
|
}
|
||||||
|
@ -6,6 +6,7 @@
|
|||||||
#include "display.h"
|
#include "display.h"
|
||||||
#include "image.h"
|
#include "image.h"
|
||||||
#include "flash.h"
|
#include "flash.h"
|
||||||
|
#include "rng.h"
|
||||||
#include "touch.h"
|
#include "touch.h"
|
||||||
#include "usb.h"
|
#include "usb.h"
|
||||||
#include "version.h"
|
#include "version.h"
|
||||||
@ -16,7 +17,8 @@
|
|||||||
#define IMAGE_MAGIC 0x465A5254 // TRZF
|
#define IMAGE_MAGIC 0x465A5254 // TRZF
|
||||||
#define IMAGE_MAXSIZE (7 * 128 * 1024)
|
#define IMAGE_MAXSIZE (7 * 128 * 1024)
|
||||||
|
|
||||||
void pendsv_isr_handler(void) {
|
void pendsv_isr_handler(void)
|
||||||
|
{
|
||||||
__fatal_error("pendsv", __FILE__, __LINE__, __FUNCTION__);
|
__fatal_error("pendsv", __FILE__, __LINE__, __FUNCTION__);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -193,6 +195,8 @@ void mainloop(void)
|
|||||||
|
|
||||||
int main(void)
|
int main(void)
|
||||||
{
|
{
|
||||||
|
__stack_chk_guard = rng_get();
|
||||||
|
|
||||||
periph_init();
|
periph_init();
|
||||||
|
|
||||||
display_pwm_init();
|
display_pwm_init();
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
ENTRY(reset_handler)
|
ENTRY(reset_handler)
|
||||||
|
|
||||||
MEMORY {
|
MEMORY {
|
||||||
FLASH (rx) : ORIGIN = 0x08010000, LENGTH = 64K
|
FLASH (rx) : ORIGIN = 0x08020000, LENGTH = 128K
|
||||||
CCMRAM (wal) : ORIGIN = 0x10000000, LENGTH = 64K
|
CCMRAM (wal) : ORIGIN = 0x10000000, LENGTH = 64K
|
||||||
SRAM (wal) : ORIGIN = 0x20000000, LENGTH = 128K
|
SRAM (wal) : ORIGIN = 0x20000000, LENGTH = 128K
|
||||||
}
|
}
|
||||||
|
@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
#define NORCOW_STM32 1
|
#define NORCOW_STM32 1
|
||||||
|
|
||||||
#define NORCOW_START_SECTOR 2
|
#define NORCOW_SECTORS {4, 16}
|
||||||
#define NORCOW_START_ADDRESS 0x08008000
|
#define NORCOW_ADDRESSES {0x08010000, 0x08110000}
|
||||||
|
|
||||||
#elif defined TREZOR_UNIX
|
#elif defined TREZOR_UNIX
|
||||||
|
|
||||||
|
@ -21,30 +21,17 @@
|
|||||||
#include "sdcard.h"
|
#include "sdcard.h"
|
||||||
#include "touch.h"
|
#include "touch.h"
|
||||||
|
|
||||||
bool firmware_standalone(void)
|
int main(void)
|
||||||
{
|
{
|
||||||
// linker script defined symbol -- reference 3.5.5 in GNU linker manual
|
__stack_chk_guard = rng_get();
|
||||||
extern const uint32_t _flash_start;
|
|
||||||
return &_flash_start == ((uint32_t *) 0x0800000);
|
|
||||||
}
|
|
||||||
|
|
||||||
int main(void) {
|
|
||||||
|
|
||||||
if (firmware_standalone()) {
|
|
||||||
SystemInit();
|
|
||||||
}
|
|
||||||
|
|
||||||
periph_init();
|
periph_init();
|
||||||
|
|
||||||
pendsv_init();
|
pendsv_init();
|
||||||
|
|
||||||
if (firmware_standalone()) {
|
display_pwm_init();
|
||||||
display_init();
|
display_orientation(0);
|
||||||
} else {
|
display_backlight(255);
|
||||||
display_pwm_init();
|
|
||||||
display_orientation(0);
|
|
||||||
display_backlight(255);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (0 != flash_init()) {
|
if (0 != flash_init()) {
|
||||||
__fatal_error("flash_init", __FILE__, __LINE__, __FUNCTION__);
|
__fatal_error("flash_init", __FILE__, __LINE__, __FUNCTION__);
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
ENTRY(reset_handler)
|
ENTRY(reset_handler)
|
||||||
|
|
||||||
MEMORY {
|
MEMORY {
|
||||||
FLASH (rx) : ORIGIN = 0x08020000, LENGTH = 896K
|
FLASH (rx) : ORIGIN = 0x08040000, LENGTH = 768K
|
||||||
CCMRAM (wal) : ORIGIN = 0x10000000, LENGTH = 64K
|
CCMRAM (wal) : ORIGIN = 0x10000000, LENGTH = 64K
|
||||||
SRAM (wal) : ORIGIN = 0x20000000, LENGTH = 128K
|
SRAM (wal) : ORIGIN = 0x20000000, LENGTH = 128K
|
||||||
}
|
}
|
||||||
|
@ -19,6 +19,13 @@ void __attribute__((noreturn)) __fatal_error(const char *msg, const char *file,
|
|||||||
for (;;);
|
for (;;);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint32_t __stack_chk_guard;
|
||||||
|
|
||||||
|
void __attribute__((noreturn)) __stack_chk_fail(void)
|
||||||
|
{
|
||||||
|
__fatal_error("Stack smashing detected.", NULL, 0, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
#ifndef NDEBUG
|
#ifndef NDEBUG
|
||||||
void __assert_func(const char *file, int line, const char *func, const char *expr) {
|
void __assert_func(const char *file, int line, const char *func, const char *expr) {
|
||||||
display_printf("\nassert(%s)\n", expr);
|
display_printf("\nassert(%s)\n", expr);
|
||||||
|
@ -4,8 +4,8 @@
|
|||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
#define BOARDLOADER_START 0x08000000
|
#define BOARDLOADER_START 0x08000000
|
||||||
#define BOOTLOADER_START 0x08010000
|
#define BOOTLOADER_START 0x08020000
|
||||||
#define FIRMWARE_START 0x08020000
|
#define FIRMWARE_START 0x08040000
|
||||||
#define HEADER_SIZE 0x200
|
#define HEADER_SIZE 0x200
|
||||||
|
|
||||||
extern void memset_reg(volatile void *start, volatile void *stop, uint32_t val);
|
extern void memset_reg(volatile void *start, volatile void *stop, uint32_t val);
|
||||||
@ -20,4 +20,6 @@ void jump_to(uint32_t address);
|
|||||||
|
|
||||||
void hal_delay(uint32_t ms);
|
void hal_delay(uint32_t ms);
|
||||||
|
|
||||||
|
extern uint32_t __stack_chk_guard;
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
2
vendor/norcow
vendored
2
vendor/norcow
vendored
@ -1 +1 @@
|
|||||||
Subproject commit 8d2843aeb58f8fd0fc5162a11d5be1e2575776ca
|
Subproject commit 56f11a3d6c8c77d4ecb82e1a55d3003263ef2a72
|
Loading…
Reference in New Issue
Block a user