mirror of
https://github.com/trezor/trezor-firmware.git
synced 2024-12-24 15:28:10 +00:00
29c16c212d
[no changelog]
102 lines
2.4 KiB
C
102 lines
2.4 KiB
C
#include <stdio.h>
|
|
#include <unistd.h>
|
|
|
|
#include "bootui.h"
|
|
#include "common.h"
|
|
#include "display.h"
|
|
#include "flash.h"
|
|
#include "model.h"
|
|
#include "rust_ui.h"
|
|
#ifdef USE_OPTIGA
|
|
#include "secret.h"
|
|
#endif
|
|
|
|
#include "emulator.h"
|
|
|
|
#undef FIRMWARE_START
|
|
|
|
uint8_t *FIRMWARE_START = 0;
|
|
uint32_t stay_in_bootloader_flag;
|
|
|
|
void set_core_clock(int) {}
|
|
|
|
int bootloader_main(void);
|
|
|
|
bool sector_is_empty(uint16_t sector) {
|
|
const uint8_t *storage = flash_get_address(sector, 0, 0);
|
|
size_t storage_size = flash_sector_size(sector);
|
|
for (size_t i = 0; i < storage_size; i++) {
|
|
if (storage[i] != 0xFF) {
|
|
return false;
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
|
|
__attribute__((noreturn)) int main(int argc, char **argv) {
|
|
flash_init();
|
|
FIRMWARE_START = (uint8_t *)flash_area_get_address(&FIRMWARE_AREA, 0, 0);
|
|
|
|
// simulate non-empty storage so that we know whether it was erased or not
|
|
if (sector_is_empty(STORAGE_AREAS[0].subarea[0].first_sector)) {
|
|
secbool ret = flash_area_write_word(&STORAGE_AREAS[0], 16, 0x12345678);
|
|
(void)ret;
|
|
}
|
|
|
|
if (argc == 2) {
|
|
if (argv[1][0] == 's') {
|
|
// Run the firmware
|
|
stay_in_bootloader_flag = STAY_IN_BOOTLOADER_FLAG;
|
|
}
|
|
#ifdef USE_OPTIGA
|
|
else if (argv[1][0] == 'l') {
|
|
// write bootloader-lock secret
|
|
secret_write_header();
|
|
}
|
|
#endif
|
|
} else if (argc == 4) {
|
|
display_init();
|
|
display_backlight(180);
|
|
screen_fatal_error_rust(argv[1], argv[2], argv[3]);
|
|
display_refresh();
|
|
ui_click();
|
|
exit(0);
|
|
}
|
|
|
|
bootloader_main();
|
|
hal_delay(3000);
|
|
jump_to(NULL);
|
|
}
|
|
|
|
void display_set_little_endian(void) {}
|
|
|
|
void display_reinit(void) {}
|
|
|
|
void mpu_config_bootloader(void) {}
|
|
|
|
void mpu_config_off(void) {}
|
|
|
|
__attribute__((noreturn)) void jump_to(void *addr) {
|
|
bool storage_is_erased =
|
|
sector_is_empty(STORAGE_AREAS[0].subarea[0].first_sector) &&
|
|
sector_is_empty(STORAGE_AREAS[1].subarea[0].first_sector);
|
|
|
|
if (storage_is_erased) {
|
|
printf("STORAGE WAS ERASED\n");
|
|
screen_fatal_error_rust("BOOTLOADER EXIT", "Jumped to firmware",
|
|
"STORAGE WAS ERASED");
|
|
} else {
|
|
printf("storage was retained\n");
|
|
screen_fatal_error_rust("BOOTLOADER EXIT", "Jumped to firmware",
|
|
"STORAGE WAS RETAINED");
|
|
}
|
|
display_backlight(180);
|
|
display_refresh();
|
|
hal_delay(3000);
|
|
exit(0);
|
|
}
|
|
|
|
void ensure_compatible_settings(void) {}
|
|
|
|
void main_clean_exit(int code) { exit(code); }
|