diff --git a/dist.sh b/dist.sh index 4d61680..e632eca 100755 --- a/dist.sh +++ b/dist.sh @@ -13,4 +13,4 @@ make_dist() { [ ! -d "$DIST" ] && mkdir "$DIST" || rm "$DIST"/* (PROJECT=libseven VERSION=0.17.0 make_dist) -(PROJECT=minrt VERSION=0.5.1 make_dist) +(PROJECT=minrt VERSION=0.6.0 make_dist) diff --git a/meson.build b/meson.build index e277343..d2479a0 100644 --- a/meson.build +++ b/meson.build @@ -1,5 +1,5 @@ project('sdk-seven', 'c', - version: '0.17.1', + version: '0.18.0', license: 'Zlib', meson_version: '>=0.55.0', default_options: ['warning_level=2', 'c_std=c99']) diff --git a/minrt/CMakeLists.txt b/minrt/CMakeLists.txt index fd49230..0285ff5 100644 --- a/minrt/CMakeLists.txt +++ b/minrt/CMakeLists.txt @@ -11,6 +11,9 @@ set(CMAKE_INCLUDE_FLAG_ASM "-Wa,-I") add_library(minrt STATIC src/gba/crt0.s + src/gba/exit.c + src/gba/fini.c + src/gba/init.c src/gba/ram.c src/gba/rom_header.s ) @@ -24,14 +27,17 @@ target_compile_options(minrt PRIVATE target_link_options(minrt INTERFACE -mthumb - -specs=lib/nocrt0.specs - -L${CMAKE_CURRENT_LIST_DIR}/lib + -specs=${CMAKE_CURRENT_LIST_DIR}lib/nocrt0.specs + -L${CMAKE_CURRENT_LIST_DIR}/lib/ldscripts -Trom.mem -Tgba.x ) add_library(minrt_multiboot STATIC src/gba/crt0.s + src/gba/exit.c + src/gba/fini.c + src/gba/init.c src/gba/ram.c src/gba/multiboot_header.s ) @@ -45,8 +51,8 @@ target_compile_options(minrt_multiboot PRIVATE target_link_options(minrt_multiboot INTERFACE -mthumb - -specs=lib/nocrt0.specs - -L${CMAKE_CURRENT_LIST_DIR}/lib + -specs=${CMAKE_CURRENT_LIST_DIR}lib/nocrt0.specs + -L${CMAKE_CURRENT_LIST_DIR}/lib/ldscripts -Tmultiboot.mem -Tgba.x ) diff --git a/minrt/lib/ldscripts/gba.x b/minrt/lib/ldscripts/gba.x index 38553ec..921ebf4 100644 --- a/minrt/lib/ldscripts/gba.x +++ b/minrt/lib/ldscripts/gba.x @@ -177,16 +177,6 @@ SECTIONS /* Static initialization and finalization */ - .init : - { - KEEP(*(SORT_NONE(.init))) - } >LOAD_REGION - - .fini : - { - KEEP(*(SORT_NONE(.fini))) - } >LOAD_REGION - .preinit_array : { PROVIDE_HIDDEN(__preinit_array_start = .); diff --git a/minrt/meson.build b/minrt/meson.build index 6bf1e99..1fbe0da 100644 --- a/minrt/meson.build +++ b/minrt/meson.build @@ -1,14 +1,10 @@ -version = '0.5.1' +version = '0.6.0' sources = [ - 'src/gba/rom_header.s', - 'src/gba/crt0.s', - 'src/gba/ram.c', -] - -sources_mb = [ - 'src/gba/multiboot_header.s', 'src/gba/crt0.s', + 'src/gba/exit.c', + 'src/gba/fini.c', + 'src/gba/init.c', 'src/gba/ram.c', ] @@ -20,13 +16,13 @@ link_args = ['-specs=' + lib / 'nocrt0.specs', '-L' + lib / 'ldscripts'] minrt = static_library( 'minrt_rom', - sources, + sources + ['src/gba/rom_header.s'], include_directories: includes + ['src/gba'], install: true) minrt_mb = static_library( 'minrt_mb', - sources_mb, + sources + ['src/gba/multiboot_header.s'], include_directories: includes + ['src/gba'], install: true) diff --git a/minrt/src/gba/crt0.s b/minrt/src/gba/crt0.s index 54a8f0d..0226b54 100644 --- a/minrt/src/gba/crt0.s +++ b/minrt/src/gba/crt0.s @@ -113,7 +113,7 @@ _start: ldr r2, =__bss_len @ Initialization - bl __libc_init_array + bl __minrt_init_array @ main(0, NULL,NULL) movs r0, #0 @ argc @@ -126,9 +126,8 @@ pool: .pool .section .text._exit,"ax",%progbits _exit: - @ Disable IRQs and halt - ldr r3, =REG_IME - strh r3, [r3] + ldr r1, =REG_IME + str r1, [r1] b . .section .noinit,"aw",%nobits diff --git a/minrt/src/gba/exit.c b/minrt/src/gba/exit.c new file mode 100644 index 0000000..16fa99b --- /dev/null +++ b/minrt/src/gba/exit.c @@ -0,0 +1,17 @@ +#include +#include + +extern void exit(int code) +{ + void __call_exitprocs(int, void*) __attribute__((weak)); + void __minrt_fini_array(void); + + if (__call_exitprocs) + { + __call_exitprocs(code, NULL); + } + + __minrt_fini_array(); + + _exit(code); +} diff --git a/minrt/src/gba/fini.c b/minrt/src/gba/fini.c new file mode 100644 index 0000000..51e7e92 --- /dev/null +++ b/minrt/src/gba/fini.c @@ -0,0 +1,17 @@ +#include + +extern void (*__fini_array_start []) (void) __attribute__((weak)); +extern void (*__fini_array_end []) (void) __attribute__((weak)); + +extern void __minrt_fini_array(void) +{ + size_t count; + size_t i; + + count = __fini_array_end - __fini_array_start; + + for (i = count; i > 0; i--) + { + __fini_array_start[i-1](); + } +} diff --git a/minrt/src/gba/init.c b/minrt/src/gba/init.c new file mode 100644 index 0000000..f1095a8 --- /dev/null +++ b/minrt/src/gba/init.c @@ -0,0 +1,26 @@ +#include + +extern void (*__preinit_array_start[]) (void) __attribute__((weak)); +extern void (*__preinit_array_end[]) (void) __attribute__((weak)); +extern void (*__init_array_start[]) (void) __attribute__((weak)); +extern void (*__init_array_end[]) (void) __attribute__((weak)); + +extern void __minrt_init_array(void) +{ + size_t count; + size_t i; + + count = __preinit_array_end - __preinit_array_start; + + for (i = 0; i < count; i++) + { + __preinit_array_start[i](); + } + + count = __init_array_end - __init_array_start; + + for (i = 0; i < count; i++) + { + __init_array_start[i](); + } +}