diff --git a/enc_bootloader/CMakeLists.txt b/enc_bootloader/CMakeLists.txt index 30c903c5..bec6ce84 100644 --- a/enc_bootloader/CMakeLists.txt +++ b/enc_bootloader/CMakeLists.txt @@ -23,8 +23,8 @@ if (NOT USE_PRECOMPILED) set(CMAKE_C_STANDARD 11) set(CMAKE_CXX_STANDARD 17) - if (PICO_SDK_VERSION_STRING VERSION_LESS "2.2.0") - message(FATAL_ERROR "Raspberry Pi Pico SDK version 2.2.0 (or later) required. Your version is ${PICO_SDK_VERSION_STRING}") + if (PICO_SDK_VERSION_STRING VERSION_LESS "2.2.1") + message(FATAL_ERROR "Raspberry Pi Pico SDK version 2.2.1 (or later) required. Your version is ${PICO_SDK_VERSION_STRING}") endif() # Initialize the SDK @@ -64,6 +64,9 @@ if (NOT USE_PRECOMPILED) # AES Code & workspace from 0x20080044 -> 0x20081604, so 0x20080200 -> 0x20081200 is inside that ROM_CHAIN_WORKSPACE=0x20080200) + pico_add_linker_script_override_path(enc_bootloader ${CMAKE_CURRENT_LIST_DIR}/memmap_enc_bootloader + FILES memory_ram.incl memory_scratch.incl section_no_flash_text.incl sections_no_flash_data.incl + ) pico_set_linker_script(enc_bootloader ${CMAKE_CURRENT_LIST_DIR}/memmap_enc_bootloader.ld) target_compile_definitions(enc_bootloader PRIVATE @@ -110,8 +113,13 @@ if (NOT USE_PRECOMPILED) pico_minimize_runtime(enc_bootloader) + pico_add_linker_script_override_path(enc_bootloader ${CMAKE_CURRENT_LIST_DIR}/memmap_common + FILES memory_aliases_no_flash.incl memory_psram.incl memory_xip_ram.incl section_xip_ram.incl sections_psram.incl + ) + pico_set_binary_type(enc_bootloader no_flash) pico_add_dis_output(enc_bootloader) + pico_add_map_output(enc_bootloader) if (USE_MBEDTLS) install(FILES ${CMAKE_CURRENT_BINARY_DIR}/enc_bootloader.elf DESTINATION ${CMAKE_CURRENT_LIST_DIR} RENAME enc_bootloader_mbedtls.elf) diff --git a/enc_bootloader/enc_bootloader.elf b/enc_bootloader/enc_bootloader.elf index 2e84072a..28208ac9 100644 Binary files a/enc_bootloader/enc_bootloader.elf and b/enc_bootloader/enc_bootloader.elf differ diff --git a/enc_bootloader/enc_bootloader_mbedtls.elf b/enc_bootloader/enc_bootloader_mbedtls.elf index 88993b6c..45462c41 100644 Binary files a/enc_bootloader/enc_bootloader_mbedtls.elf and b/enc_bootloader/enc_bootloader_mbedtls.elf differ diff --git a/enc_bootloader/memmap_common/memory_aliases_no_flash.incl b/enc_bootloader/memmap_common/memory_aliases_no_flash.incl new file mode 100644 index 00000000..ee9258f0 --- /dev/null +++ b/enc_bootloader/memmap_common/memory_aliases_no_flash.incl @@ -0,0 +1,6 @@ +/* Store everything where it came from (ram/scratch) - no XIP_RAM or PSRAM */ + +REGION_ALIAS("TEXT_STORE", RAM); +REGION_ALIAS("RAM_STORE", RAM); +REGION_ALIAS("SCRATCH_X_STORE", SCRATCH_X); +REGION_ALIAS("SCRATCH_Y_STORE", SCRATCH_Y); diff --git a/enc_bootloader/memmap_common/memory_psram.incl b/enc_bootloader/memmap_common/memory_psram.incl new file mode 100644 index 00000000..edec1134 --- /dev/null +++ b/enc_bootloader/memmap_common/memory_psram.incl @@ -0,0 +1 @@ +/* Don't use PSRAM */ diff --git a/enc_bootloader/memmap_common/memory_xip_ram.incl b/enc_bootloader/memmap_common/memory_xip_ram.incl new file mode 100644 index 00000000..5fb9b8d9 --- /dev/null +++ b/enc_bootloader/memmap_common/memory_xip_ram.incl @@ -0,0 +1 @@ +/* Don't use XIP_RAM */ diff --git a/enc_bootloader/memmap_common/section_xip_ram.incl b/enc_bootloader/memmap_common/section_xip_ram.incl new file mode 100644 index 00000000..5fb9b8d9 --- /dev/null +++ b/enc_bootloader/memmap_common/section_xip_ram.incl @@ -0,0 +1 @@ +/* Don't use XIP_RAM */ diff --git a/enc_bootloader/memmap_common/sections_psram.incl b/enc_bootloader/memmap_common/sections_psram.incl new file mode 100644 index 00000000..edec1134 --- /dev/null +++ b/enc_bootloader/memmap_common/sections_psram.incl @@ -0,0 +1 @@ +/* Don't use PSRAM */ diff --git a/enc_bootloader/memmap_enc_bootloader.ld b/enc_bootloader/memmap_enc_bootloader.ld index d92441cc..26dbba98 100644 --- a/enc_bootloader/memmap_enc_bootloader.ld +++ b/enc_bootloader/memmap_enc_bootloader.ld @@ -1,263 +1,11 @@ -/* Based on GCC ARM embedded samples. - Defines the following symbols for use by code: - __exidx_start - __exidx_end - __etext - __data_start__ - __preinit_array_start - __preinit_array_end - __init_array_start - __init_array_end - __fini_array_start - __fini_array_end - __data_end__ - __bss_start__ - __bss_end__ - __end__ - end - __HeapLimit - __StackLimit - __StackTop - __stack (== StackTop) -*/ +/* Heavily customised using overrides in memmap_enc_bootloader folder */ -MEMORY -{ - RAM_START(rwx) : ORIGIN = 0x20080000, LENGTH = 0x44 - SCRATCH_X(rwx) : ORIGIN = 0x20080044, LENGTH = 0xfbc - SCRATCH_Y(rwx) : ORIGIN = 0x20081000, LENGTH = 0x800 - RAM(rwx) : ORIGIN = 0x20081800, LENGTH = 0x800 -} +INCLUDE "memmap_no_flash.incl" -ENTRY(_entry_point) +/* Extra assertions */ +ASSERT(__StackBottom >= __scratch_y_end__, "stack collision in scratch_y") +ASSERT(chaff==0x20081000, "Chaff array must be located at 0x20081000") -SECTIONS -{ - .start : { - __logical_binary_start = .; - /* Vectors require 512-byte alignment on v8-M when >48 IRQs are used, - so we would waste RAM if the vector table were not at the - start. */ - KEEP (*(.vectors)) - KEEP (*(.binary_info_header)) - __binary_info_header_end = .; - KEEP (*(.embedded_block)) - __embedded_block_end = .; - } > RAM_START - - .text : { - __text_start = .; - __reset_start = .; - KEEP (*(.reset)) - __reset_end = .; - *(.time_critical*) - *(.text*) - . = ALIGN(4); - *(.init) - *(.fini) - /* Pull all c'tors into .text */ - *crtbegin.o(.ctors) - *crtbegin?.o(.ctors) - *(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors) - *(SORT(.ctors.*)) - *(.ctors) - /* Followed by destructors */ - *crtbegin.o(.dtors) - *crtbegin?.o(.dtors) - *(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors) - *(SORT(.dtors.*)) - *(.dtors) - - *(.eh_frame*) - } > RAM - - .rodata : { - . = ALIGN(4); - *(.rodata*) - *(.srodata*) - . = ALIGN(4); - *(SORT_BY_ALIGNMENT(SORT_BY_NAME(.flashdata*))) - . = ALIGN(4); - } > RAM - - .ARM.extab : - { - *(.ARM.extab* .gnu.linkonce.armextab.*) - } > RAM - - __exidx_start = .; - .ARM.exidx : - { - *(.ARM.exidx* .gnu.linkonce.armexidx.*) - } > RAM - __exidx_end = .; - - /* Machine inspectable binary information */ - . = ALIGN(4); - __binary_info_start = .; - .binary_info : - { - KEEP(*(.binary_info.keep.*)) - *(.binary_info.*) - } > RAM - __binary_info_end = .; - . = ALIGN(4); - - .data : { - __data_start__ = .; - *(vtable) - *(.data*) - *(.sdata*) - - . = ALIGN(4); - *(.after_data.*) - . = ALIGN(4); - /* preinit data */ - PROVIDE_HIDDEN (__mutex_array_start = .); - KEEP(*(SORT(.mutex_array.*))) - KEEP(*(.mutex_array)) - PROVIDE_HIDDEN (__mutex_array_end = .); - - /* We skip all the initializers as we need very little runtime, and preinit_array items - * are __used, so would never be garbage collected even if referenced - */ - . = ALIGN(4); - /* preinit data */ -/* PROVIDE_HIDDEN (__preinit_array_start = .); */ -/* KEEP(*(SORT(.preinit_array.*)))*/ -/* KEEP(*(.preinit_array))*/ -/* PROVIDE_HIDDEN (__preinit_array_end = .);*/ - - . = ALIGN(4); - /* init data */ -/* PROVIDE_HIDDEN (__init_array_start = .);*/ -/* KEEP(*(SORT(.init_array.*)))*/ -/* KEEP(*(.init_array))*/ -/* PROVIDE_HIDDEN (__init_array_end = .);*/ - - . = ALIGN(4); - /* finit data */ -/* PROVIDE_HIDDEN (__fini_array_start = .);*/ -/* *(SORT(.fini_array.*))*/ -/* *(.fini_array)*/ -/* PROVIDE_HIDDEN (__fini_array_end = .);*/ - - *(.jcr) - . = ALIGN(4); - } > RAM - - .tdata : { - . = ALIGN(4); - *(.tdata .tdata.* .gnu.linkonce.td.*) - /* All data end */ - __tdata_end = .; - } > RAM - PROVIDE(__data_end__ = .); - - .uninitialized_data (NOLOAD): { - . = ALIGN(4); - *(.uninitialized_data*) - } > RAM - /* __etext is (for backwards compatibility) the name of the .data init source pointer (...) */ - __etext = LOADADDR(.data); - - .tbss (NOLOAD) : { - . = ALIGN(4); - __bss_start__ = .; - __tls_base = .; - *(.tbss .tbss.* .gnu.linkonce.tb.*) - *(.tcommon) - - __tls_end = .; - } > RAM - - .bss (NOLOAD) : { - . = ALIGN(4); - __tbss_end = .; - - *(SORT_BY_ALIGNMENT(SORT_BY_NAME(.bss*))) - *(COMMON) - PROVIDE(__global_pointer$ = . + 2K); - *(.sbss*) - . = ALIGN(4); - __bss_end__ = .; - } > RAM - - .heap (NOLOAD): - { - __end__ = .; - end = __end__; - KEEP(*(.heap*)) - } > RAM - /* historically on GCC sbrk was growing past __HeapLimit to __StackLimit, however - to be more compatible, we now set __HeapLimit explicitly to where the end of the heap is */ - __HeapLimit = ORIGIN(RAM) + LENGTH(RAM); - - /* Start and end symbols must be word-aligned */ - .scratch_x : { - __scratch_x_start__ = .; - *(.scratch_x.*) - . = ALIGN(4); - __scratch_x_end__ = .; - } > SCRATCH_X - __scratch_x_source__ = LOADADDR(.scratch_x); - - .scratch_y : { - __scratch_y_start__ = .; - *(.scratch_y.*) - . = ALIGN(4); - __scratch_y_end__ = .; - } > SCRATCH_Y - __scratch_y_source__ = LOADADDR(.scratch_y); - - /* .stack*_dummy section doesn't contains any symbols. It is only - * used for linker to calculate size of stack sections, and assign - * values to stack symbols later - * - * stack1 section may be empty/missing if platform_launch_core1 is not used */ - - /* by default we put core 0 stack at the end of scratch Y, so that if core 1 - * stack is not used then all of SCRATCH_X is free. - */ - .stack1_dummy (NOLOAD): - { - *(.stack1*) - } > SCRATCH_X - .stack_dummy (NOLOAD): - { - KEEP(*(.stack*)) - } > SCRATCH_Y - - /* stack limit is poorly named, but historically is maximum heap ptr */ - __StackLimit = ORIGIN(RAM) + LENGTH(RAM); - __StackOneTop = ORIGIN(SCRATCH_X) + LENGTH(SCRATCH_X); - __StackTop = ORIGIN(SCRATCH_Y) + LENGTH(SCRATCH_Y); - __StackOneBottom = __StackOneTop - SIZEOF(.stack1_dummy); - __StackBottom = __StackTop - SIZEOF(.stack_dummy); - PROVIDE(__stack = __StackTop); - ASSERT(__StackBottom >= __scratch_y_end__, "stack collision in scratch_y") - - /* picolibc and LLVM */ - PROVIDE (__heap_start = __end__); - PROVIDE (__heap_end = __HeapLimit); - PROVIDE( __tls_align = MAX(ALIGNOF(.tdata), ALIGNOF(.tbss)) ); - PROVIDE( __tls_size_align = (__tls_size + __tls_align - 1) & ~(__tls_align - 1)); - PROVIDE( __arm32_tls_tcb_offset = MAX(8, __tls_align) ); - - /* llvm-libc */ - PROVIDE (_end = __end__); - PROVIDE (__llvm_libc_heap_limit = __HeapLimit); - - /* Check if data + heap + stack exceeds RAM limit */ - ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed") - - ASSERT( __binary_info_header_end - __logical_binary_start <= 1024, "Binary info must be in first 1024 bytes of the binary") - ASSERT( __embedded_block_end - __logical_binary_start <= 4096, "Embedded block must be in first 4096 bytes of the binary") - - /* todo assert on extra code */ - ASSERT(chaff==0x20081000, "Chaff array must be located at 0x20081000") - - /* Provide symbols for picotool */ - __enc_bootloader_start = ORIGIN(RAM_START); - __enc_bootloader_end = ORIGIN(RAM) + LENGTH(RAM); -} +/* Provide symbols for picotool */ +__enc_bootloader_start = ORIGIN(RAM_START); +__enc_bootloader_end = ORIGIN(RAM) + LENGTH(RAM); diff --git a/enc_bootloader/memmap_enc_bootloader/memory_ram.incl b/enc_bootloader/memmap_enc_bootloader/memory_ram.incl new file mode 100644 index 00000000..dd8f291e --- /dev/null +++ b/enc_bootloader/memmap_enc_bootloader/memory_ram.incl @@ -0,0 +1,8 @@ +/* Entirely custom memory regions - scratch and ram together for ease */ +MEMORY +{ + RAM_START(rwx) : ORIGIN = 0x20080000, LENGTH = 0x44 + SCRATCH_X(rwx) : ORIGIN = 0x20080044, LENGTH = 0xfbc + SCRATCH_Y(rwx) : ORIGIN = 0x20081000, LENGTH = 0x800 + RAM(rwx) : ORIGIN = 0x20081800, LENGTH = 0x800 +} \ No newline at end of file diff --git a/enc_bootloader/memmap_enc_bootloader/memory_scratch.incl b/enc_bootloader/memmap_enc_bootloader/memory_scratch.incl new file mode 100644 index 00000000..0856ac80 --- /dev/null +++ b/enc_bootloader/memmap_enc_bootloader/memory_scratch.incl @@ -0,0 +1 @@ +/* Empty - see memory_ram.incl */ \ No newline at end of file diff --git a/enc_bootloader/memmap_enc_bootloader/section_no_flash_text.incl b/enc_bootloader/memmap_enc_bootloader/section_no_flash_text.incl new file mode 100644 index 00000000..a9777676 --- /dev/null +++ b/enc_bootloader/memmap_enc_bootloader/section_no_flash_text.incl @@ -0,0 +1,48 @@ +/* Custom text section, as .start and .text are split up + Defines the following symbols for use by code: + __logical_binary_start + __binary_info_header_end + __embedded_block_end + __text_start + __reset_start, __reset_end +*/ + +SECTIONS +{ + .start : { + __logical_binary_start = .; + /* Vectors require 512-byte alignment on v8-M when >48 IRQs are used, + so we would waste RAM if the vector table were not at the + start. */ + KEEP (*(.vectors)) + KEEP (*(.binary_info_header)) + __binary_info_header_end = .; + KEEP (*(.embedded_block)) + __embedded_block_end = .; + } > RAM_START + + .text : { + __text_start = .; + __reset_start = .; + KEEP (*(.reset)) + __reset_end = .; + *(.text*) + . = ALIGN(4); + *(.init) + *(.fini) + /* Pull all c'tors into .text */ + *crtbegin.o(.ctors) + *crtbegin?.o(.ctors) + *(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors) + *(SORT(.ctors.*)) + *(.ctors) + /* Followed by destructors */ + *crtbegin.o(.dtors) + *crtbegin?.o(.dtors) + *(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors) + *(SORT(.dtors.*)) + *(.dtors) + + *(.eh_frame*) + } > RAM +} diff --git a/enc_bootloader/memmap_enc_bootloader/sections_no_flash_data.incl b/enc_bootloader/memmap_enc_bootloader/sections_no_flash_data.incl new file mode 100644 index 00000000..0b9daec0 --- /dev/null +++ b/enc_bootloader/memmap_enc_bootloader/sections_no_flash_data.incl @@ -0,0 +1,79 @@ +/* Custom data section - contains contents of section_no_flash_data.incl, with commented out preinit array, and no tdata/tbss + + This skips the other sections normally in sections_no_flash_data.incl, as they are not used +*/ + +SECTIONS +{ + .data : { + __data_start__ = .; + *(vtable) + + *(.time_critical*) + + *(.data*) + *(.sdata*) + + . = ALIGN(4); + PROVIDE_HIDDEN (__emutls_array_start = .); + *(.*.__emutls_v.*) + PROVIDE_HIDDEN (__emutls_array_end = .); + + . = ALIGN(4); + *(.after_data.*) + . = ALIGN(4); + /* preinit data */ + PROVIDE_HIDDEN (__mutex_array_start = .); + KEEP(*(SORT(.mutex_array.*))) + KEEP(*(.mutex_array)) + PROVIDE_HIDDEN (__mutex_array_end = .); + + /* We skip all the initializers as we need very little runtime, and preinit_array items + * are __used, so would never be garbage collected even if referenced + */ + . = ALIGN(4); + /* preinit data */ +/* PROVIDE_HIDDEN (__bothinit_array_start = .); */ +/* PROVIDE_HIDDEN (__preinit_array_start = .); */ +/* KEEP(*(SORT(.preinit_array.*)))*/ +/* KEEP(*(.preinit_array))*/ +/* PROVIDE_HIDDEN (__preinit_array_end = .);*/ + + . = ALIGN(4); + /* init data */ +/* PROVIDE_HIDDEN (__init_array_start = .);*/ +/* KEEP(*(SORT(.init_array.*)))*/ +/* KEEP(*(.init_array))*/ +/* PROVIDE_HIDDEN (__init_array_end = .);*/ +/* PROVIDE_HIDDEN (__bothinit_array_end = .); */ + + . = ALIGN(4); + /* finit data */ +/* PROVIDE_HIDDEN (__fini_array_start = .);*/ +/* *(SORT(.fini_array.*))*/ +/* *(.fini_array)*/ +/* PROVIDE_HIDDEN (__fini_array_end = .);*/ + + *(.jcr) + . = ALIGN(4); + } > RAM + + PROVIDE(__data_end__ = .); + + /* __etext is (for backwards compatibility) the name of the .data init source pointer (...) */ + __etext = LOADADDR(.data); + + . = ALIGN(4); + + .bss (NOLOAD) : { + __bss_start__ = .; + . = ALIGN(4); + + *(SORT_BY_ALIGNMENT(SORT_BY_NAME(.bss*))) + *(COMMON) + PROVIDE(__global_pointer$ = . + 2K); + *(.sbss*) + . = ALIGN(4); + __bss_end__ = .; + } > RAM +} diff --git a/enc_bootloader/memmap_mbedtls.ld b/enc_bootloader/memmap_mbedtls.ld index 912666fb..ee14c3c7 100644 --- a/enc_bootloader/memmap_mbedtls.ld +++ b/enc_bootloader/memmap_mbedtls.ld @@ -1,263 +1,10 @@ -/* Based on GCC ARM embedded samples. - Defines the following symbols for use by code: - __exidx_start - __exidx_end - __etext - __data_start__ - __preinit_array_start - __preinit_array_end - __init_array_start - __init_array_end - __fini_array_start - __fini_array_end - __data_end__ - __bss_start__ - __bss_end__ - __end__ - end - __HeapLimit - __StackLimit - __StackTop - __stack (== StackTop) -*/ +/* Use XIP_CACHE as RAM, but still put stack in scratch x/y */ +RAM_ORIGIN = XIP_RAM_ORIGIN_DEFAULT; +RAM_LENGTH = XIP_RAM_LENGTH_DEFAULT; -MEMORY -{ - RAM(rwx) : ORIGIN = 0x13ffc000, LENGTH = 16k - SCRATCH_X(rwx) : ORIGIN = 0x20080000, LENGTH = 4k - SCRATCH_Y(rwx) : ORIGIN = 0x20081000, LENGTH = 4k -} - -ENTRY(_entry_point) - -SECTIONS -{ - /* Note unlike RP2040, we start the image with a vector table even for - NO_FLASH builds. On Arm, the bootrom expects a VT at the start of the - image by default; on RISC-V, the default is to enter the image at its - lowest address, so an IMAGE_DEF item is required to specify the - nondefault entry point. */ - - .start_text : { - __logical_binary_start = .; - /* Vectors require 512-byte alignment on v8-M when >48 IRQs are used, - so we would waste RAM if the vector table were not at the - start. */ - KEEP (*(.vectors)) - KEEP (*(.binary_info_header)) - __binary_info_header_end = .; - KEEP (*(.embedded_block)) - __embedded_block_end = .; - } > RAM - - .text : { - __reset_start = .; - KEEP (*(.reset)) - __reset_end = .; - *(.time_critical*) - *(.text*) - . = ALIGN(4); - *(.init) - *(.fini) - /* Pull all c'tors into .text */ - *crtbegin.o(.ctors) - *crtbegin?.o(.ctors) - *(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors) - *(SORT(.ctors.*)) - *(.ctors) - /* Followed by destructors */ - *crtbegin.o(.dtors) - *crtbegin?.o(.dtors) - *(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors) - *(SORT(.dtors.*)) - *(.dtors) - - *(.eh_frame*) - } > RAM - - .rodata : { - . = ALIGN(4); - *(.rodata*) - *(.srodata*) - . = ALIGN(4); - *(SORT_BY_ALIGNMENT(SORT_BY_NAME(.flashdata*))) - . = ALIGN(4); - } > RAM - - .ARM.extab : - { - *(.ARM.extab* .gnu.linkonce.armextab.*) - } > RAM - - __exidx_start = .; - .ARM.exidx : - { - *(.ARM.exidx* .gnu.linkonce.armexidx.*) - } > RAM - __exidx_end = .; - - /* Machine inspectable binary information */ - . = ALIGN(4); - __binary_info_start = .; - .binary_info : - { - KEEP(*(.binary_info.keep.*)) - *(.binary_info.*) - } > RAM - __binary_info_end = .; - . = ALIGN(4); - - .data : { - __data_start__ = .; - *(vtable) - *(.data*) - *(.sdata*) - - . = ALIGN(4); - *(.after_data.*) - . = ALIGN(4); - /* preinit data */ - PROVIDE_HIDDEN (__mutex_array_start = .); - KEEP(*(SORT(.mutex_array.*))) - KEEP(*(.mutex_array)) - PROVIDE_HIDDEN (__mutex_array_end = .); - - . = ALIGN(4); - /* preinit data */ - PROVIDE_HIDDEN (__preinit_array_start = .); - KEEP(*(SORT(.preinit_array.*))) - KEEP(*(.preinit_array)) - PROVIDE_HIDDEN (__preinit_array_end = .); - - . = ALIGN(4); - /* init data */ - PROVIDE_HIDDEN (__init_array_start = .); - KEEP(*(SORT(.init_array.*))) - KEEP(*(.init_array)) - PROVIDE_HIDDEN (__init_array_end = .); - - . = ALIGN(4); - /* finit data */ - PROVIDE_HIDDEN (__fini_array_start = .); - *(SORT(.fini_array.*)) - *(.fini_array) - PROVIDE_HIDDEN (__fini_array_end = .); - - *(.jcr) - . = ALIGN(4); - } > RAM - - .tdata : { - . = ALIGN(4); - *(.tdata .tdata.* .gnu.linkonce.td.*) - /* All data end */ - __tdata_end = .; - } > RAM - PROVIDE(__data_end__ = .); - - .uninitialized_data (NOLOAD): { - . = ALIGN(4); - *(.uninitialized_data*) - } > RAM - /* __etext is (for backwards compatibility) the name of the .data init source pointer (...) */ - __etext = LOADADDR(.data); - - .tbss (NOLOAD) : { - . = ALIGN(4); - __bss_start__ = .; - __tls_base = .; - *(.tbss .tbss.* .gnu.linkonce.tb.*) - *(.tcommon) - - __tls_end = .; - } > RAM - - .bss (NOLOAD) : { - . = ALIGN(4); - __tbss_end = .; - - *(SORT_BY_ALIGNMENT(SORT_BY_NAME(.bss*))) - *(COMMON) - PROVIDE(__global_pointer$ = . + 2K); - *(.sbss*) - . = ALIGN(4); - __bss_end__ = .; - } > RAM - - .heap (NOLOAD): - { - __end__ = .; - end = __end__; - KEEP(*(.heap*)) - } > RAM - /* historically on GCC sbrk was growing past __HeapLimit to __StackLimit, however - to be more compatible, we now set __HeapLimit explicitly to where the end of the heap is */ - __HeapLimit = ORIGIN(RAM) + LENGTH(RAM); - - /* Start and end symbols must be word-aligned */ - .scratch_x : { - __scratch_x_start__ = .; - *(.scratch_x.*) - . = ALIGN(4); - __scratch_x_end__ = .; - } > SCRATCH_X - __scratch_x_source__ = LOADADDR(.scratch_x); - - .scratch_y : { - __scratch_y_start__ = .; - *(.scratch_y.*) - . = ALIGN(4); - __scratch_y_end__ = .; - } > SCRATCH_Y - __scratch_y_source__ = LOADADDR(.scratch_y); - - /* .stack*_dummy section doesn't contains any symbols. It is only - * used for linker to calculate size of stack sections, and assign - * values to stack symbols later - * - * stack1 section may be empty/missing if platform_launch_core1 is not used */ - - /* by default we put core 0 stack at the end of scratch Y, so that if core 1 - * stack is not used then all of SCRATCH_X is free. - */ - .stack1_dummy (NOLOAD): - { - *(.stack1*) - } > SCRATCH_X - .stack_dummy (NOLOAD): - { - KEEP(*(.stack*)) - } > SCRATCH_Y - - /* stack limit is poorly named, but historically is maximum heap ptr */ - __StackLimit = ORIGIN(RAM) + LENGTH(RAM); - __StackOneTop = ORIGIN(SCRATCH_X) + LENGTH(SCRATCH_X); - __StackTop = ORIGIN(SCRATCH_Y) + LENGTH(SCRATCH_Y); - __StackOneBottom = __StackOneTop - SIZEOF(.stack1_dummy); - __StackBottom = __StackTop - SIZEOF(.stack_dummy); - PROVIDE(__stack = __StackTop); - - /* picolibc and LLVM */ - PROVIDE (__heap_start = __end__); - PROVIDE (__heap_end = __HeapLimit); - PROVIDE( __tls_align = MAX(ALIGNOF(.tdata), ALIGNOF(.tbss)) ); - PROVIDE( __tls_size_align = (__tls_size + __tls_align - 1) & ~(__tls_align - 1)); - PROVIDE( __arm32_tls_tcb_offset = MAX(8, __tls_align) ); - - /* llvm-libc */ - PROVIDE (_end = __end__); - PROVIDE (__llvm_libc_heap_limit = __HeapLimit); - - /* Check if data + heap + stack exceeds RAM limit */ - ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed") - - ASSERT( __binary_info_header_end - __logical_binary_start <= 1024, "Binary info must be in first 1024 bytes of the binary") - ASSERT( __embedded_block_end - __logical_binary_start <= 4096, "Embedded block must be in first 4096 bytes of the binary") - - /* todo assert on extra code */ - - /* Provide symbols for picotool */ - __enc_bootloader_start = ORIGIN(RAM); - __enc_bootloader_end = ORIGIN(RAM) + LENGTH(RAM); -} +/* Other than that, normal no_flash binary */ +INCLUDE "memmap_no_flash.incl" +/* Provide symbols for picotool */ +__enc_bootloader_start = ORIGIN(RAM); +__enc_bootloader_end = ORIGIN(RAM) + LENGTH(RAM); diff --git a/main.cpp b/main.cpp index 7a3820d9..81a9b0bb 100644 --- a/main.cpp +++ b/main.cpp @@ -8375,8 +8375,10 @@ bool otp_permissions_command::execute(device_map &devices) { for (auto it = perms_json.begin(); it != perms_json.end(); ++it) { settings.otp.lock0 = 0; settings.otp.lock1 = 0; + int page; + if (!get_int(it.key(), page)) continue; std::stringstream ss; - ss << "page" << it.key(); + ss << "page" << page; settings.config.key = ss.str(); std::cout << ss.str() << std::endl; auto perms = it.value(); diff --git a/xip_ram_perms/CMakeLists.txt b/xip_ram_perms/CMakeLists.txt index df963876..fd8f56ba 100644 --- a/xip_ram_perms/CMakeLists.txt +++ b/xip_ram_perms/CMakeLists.txt @@ -20,8 +20,8 @@ if (NOT USE_PRECOMPILED) set(CMAKE_C_STANDARD 11) set(CMAKE_CXX_STANDARD 17) - if (PICO_SDK_VERSION_STRING VERSION_LESS "2.0.0") - message(FATAL_ERROR "Raspberry Pi Pico SDK version 2.0.0 (or later) required. Your version is ${PICO_SDK_VERSION_STRING}") + if (PICO_SDK_VERSION_STRING VERSION_LESS "2.2.1") + message(FATAL_ERROR "Raspberry Pi Pico SDK version 2.2.1 (or later) required. Your version is ${PICO_SDK_VERSION_STRING}") endif() # Initialize the SDK @@ -36,12 +36,7 @@ if (NOT USE_PRECOMPILED) pico_stdlib ) - pico_set_binary_type(xip_ram_perms no_flash) - # create linker script to run from 0x20070000 - file(READ ${PICO_LINKER_SCRIPT_PATH}/memmap_no_flash.ld LINKER_SCRIPT) - string(REPLACE "RAM(rwx) : ORIGIN = 0x20000000, LENGTH = 512k" "RAM(rwx) : ORIGIN = 0x13ffc000, LENGTH = 16k" LINKER_SCRIPT "${LINKER_SCRIPT}") - file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/memmap_xip_ram.ld "${LINKER_SCRIPT}") - pico_set_linker_script(xip_ram_perms ${CMAKE_CURRENT_BINARY_DIR}/memmap_xip_ram.ld) + pico_set_binary_type(xip_ram_perms xip_ram) install(FILES ${CMAKE_CURRENT_BINARY_DIR}/xip_ram_perms.elf DESTINATION ${CMAKE_CURRENT_LIST_DIR}) else() diff --git a/xip_ram_perms/set_perms.c b/xip_ram_perms/set_perms.c index 62139b54..ffaa4ae1 100644 --- a/xip_ram_perms/set_perms.c +++ b/xip_ram_perms/set_perms.c @@ -12,10 +12,6 @@ #include "pico/binary_info.h" -// Very rough - seems to be broken in xip_sram -#define sleep_ms(x) for(int i=0; i