Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 12 additions & 1 deletion bazel/config/BUILD.bazel
Original file line number Diff line number Diff line change
Expand Up @@ -140,7 +140,7 @@ string_flag(
],
)

# PICO_BAZEL_CONFIG: PICO_DEFAULT_PRINTF_IMPL, The default implementation for pico_printf to link. compiler lets the compiler control printf behavior while pico provides a pico-specific implementation, type=string, default=double, group=build
# PICO_BAZEL_CONFIG: PICO_DEFAULT_PRINTF_IMPL, The default implementation for pico_printf to link. compiler lets the compiler control printf behavior while pico provides a pico-specific implementation, type=string, default=pico, group=build
string_flag(
name = "PICO_DEFAULT_PRINTF_IMPL",
build_setting_default = "pico",
Expand All @@ -151,6 +151,17 @@ string_flag(
],
)

# PICO_BAZEL_CONFIG: PICO_DEFAULT_TLS_IMPL, The default implementation for pico_tls to link; per_thread provides per thread locals global provide shared global values, type=string, default=per_thread, group=build
string_flag(
name = "PICO_DEFAULT_TLS_IMPL",
build_setting_default = "per_thread",
values = [
"per_thread",
"global",
"none",
],
)

# PICO_BAZEL_CONFIG: PICO_ASYNC_CONTEXT_IMPL, The default implementation for pico_async_context to link, type=string, default=threadsafe_background, group=build
string_flag(
name = "PICO_ASYNC_CONTEXT_IMPL",
Expand Down
11 changes: 11 additions & 0 deletions bazel/constraint/BUILD.bazel
Original file line number Diff line number Diff line change
Expand Up @@ -180,6 +180,17 @@ config_setting(
flag_values = {"//bazel/config:PICO_DEFAULT_PRINTF_IMPL": "compiler"},
)

config_setting(
name = "pico_tls_per_thread_enabled",
flag_values = {"//bazel/config:PICO_DEFAULT_TLS_IMPL": "per_thread"},
)

config_setting(
name = "pico_tls_global_enabled",
flag_values = {"//bazel/config:PICO_DEFAULT_TLS_IMPL": "global"},
)


config_setting(
name = "pico_async_context_poll_enabled",
flag_values = {"//bazel/config:PICO_ASYNC_CONTEXT_IMPL": "poll"},
Expand Down
1 change: 1 addition & 0 deletions docs/index.h
Original file line number Diff line number Diff line change
Expand Up @@ -118,6 +118,7 @@
* \cond pico_stdio \defgroup pico_stdio pico_stdio \endcond
* \cond pico_standard_binary_info \defgroup pico_standard_binary_info pico_standard_binary_info \endcond
* \cond pico_standard_link \defgroup pico_standard_link pico_standard_link \endcond
* \cond pico_tls \defgroup pico_tls pico_tls \endcond
* @}
*
* \defgroup misc External API Headers
Expand Down
1 change: 1 addition & 0 deletions src/cmake/rp2_common.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -107,6 +107,7 @@ if (NOT PICO_BARE_METAL)
pico_add_subdirectory(rp2_common/pico_malloc)
pico_add_subdirectory(rp2_common/pico_printf)
pico_add_subdirectory(rp2_common/pico_rand)
pico_add_subdirectory(rp2_common/pico_tls)

if (PICO_COMBINED_DOCS OR NOT PICO_RP2040)
pico_add_subdirectory(rp2_common/pico_sha256)
Expand Down
1 change: 1 addition & 0 deletions src/common/pico_base_headers/BUILD.bazel
Original file line number Diff line number Diff line change
Expand Up @@ -125,6 +125,7 @@ cc_library(
"//src/rp2_common/pico_runtime:__pkg__",
"//src/rp2_common/pico_runtime_init:__pkg__",
"//src/rp2_common/pico_time_adapter:__pkg__",
"//src/rp2_common/pico_tls:__pkg__",
"@picotool//:__subpackages__",
],
deps = [
Expand Down
2 changes: 1 addition & 1 deletion src/rp2040/pico_platform/memmap_blocked_ram.ld
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ INCLUDE "memmap_default.incl"
* │ ├── section_ram_vector_table.incl rp2_common/pico_standard_link
* │ ├── section_uninitialized_data.incl rp2_common/pico_standard_link
* │ ├── section_default_data.incl rp2_common/pico_standard_link
* │ └── section_bss.incl rp2_common/pico_standard_link
* │ └── section_tls.incl rp2_common/pico_standard_link
* ├── section_generated_post_data.incl rp2_common/pico_standard_link
* ├── section_extra_post_data.incl rp2_common/pico_standard_link
* ├── section_heap.incl rp2_common/pico_standard_link
Expand Down
2 changes: 1 addition & 1 deletion src/rp2040/pico_platform/memmap_copy_to_ram.ld
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ INCLUDE "memmap_copy_to_ram.incl"
* ├── section_extra_post_text.incl rp2_common/pico_standard_link
* ├── sections_copy_to_ram_data.incl rp2_common/pico_standard_link
* │ ├── section_copy_to_ram_data.incl rp2_common/pico_standard_link
* │ └── section_bss.incl rp2_common/pico_standard_link
* │ └── section_tls.incl rp2_common/pico_standard_link
* ├── section_generated_post_data.incl rp2_common/pico_standard_link
* ├── section_extra_post_data.incl rp2_common/pico_standard_link
* ├── section_heap.incl rp2_common/pico_standard_link
Expand Down
2 changes: 1 addition & 1 deletion src/rp2040/pico_platform/memmap_default.ld
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ INCLUDE "memmap_default.incl"
* │ ├── section_ram_vector_table.incl rp2_common/pico_standard_link
* │ ├── section_uninitialized_data.incl rp2_common/pico_standard_link
* │ ├── section_default_data.incl rp2_common/pico_standard_link
* │ └── section_bss.incl rp2_common/pico_standard_link
* │ └── section_tls.incl rp2_common/pico_standard_link
* ├── section_generated_post_data.incl rp2_common/pico_standard_link
* ├── section_extra_post_data.incl rp2_common/pico_standard_link
* ├── section_heap.incl rp2_common/pico_standard_link
Expand Down
2 changes: 1 addition & 1 deletion src/rp2040/pico_platform/memmap_no_flash.ld
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ INCLUDE "memmap_no_flash.incl"
* ├── sections_no_flash_data.incl rp2_common/pico_standard_link
* │ ├── section_no_flash_data.incl rp2_common/pico_standard_link
* │ ├── section_uninitialized_data.incl rp2_common/pico_standard_link
* │ └── section_bss.incl rp2_common/pico_standard_link
* │ └── section_tls.incl rp2_common/pico_standard_link
* ├── section_generated_post_data.incl rp2_common/pico_standard_link
* ├── section_extra_post_data.incl rp2_common/pico_standard_link
* ├── section_heap.incl rp2_common/pico_standard_link
Expand Down
2 changes: 1 addition & 1 deletion src/rp2350/pico_platform/memmap_copy_to_ram.ld
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ INCLUDE "memmap_copy_to_ram.incl"
* ├── section_extra_post_text.incl rp2_common/pico_standard_link
* ├── sections_copy_to_ram_data.incl rp2_common/pico_standard_link
* │ ├── section_copy_to_ram_data.incl rp2_common/pico_standard_link
* │ └── section_bss.incl rp2_common/pico_standard_link
* │ └── section_tls.incl rp2_common/pico_standard_link
* ├── section_generated_post_data.incl rp2_common/pico_standard_link
* ├── section_extra_post_data.incl rp2_common/pico_standard_link
* ├── section_heap.incl rp2_common/pico_standard_link
Expand Down
2 changes: 1 addition & 1 deletion src/rp2350/pico_platform/memmap_default.ld
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ INCLUDE "memmap_default.incl"
* │ ├── section_ram_vector_table.incl rp2_common/pico_standard_link
* │ ├── section_uninitialized_data.incl rp2_common/pico_standard_link
* │ ├── section_default_data.incl rp2_common/pico_standard_link
* │ └── section_bss.incl rp2_common/pico_standard_link
* │ └── section_tls.incl rp2_common/pico_standard_link
* ├── section_generated_post_data.incl rp2_common/pico_standard_link
* ├── section_extra_post_data.incl rp2_common/pico_standard_link
* ├── section_heap.incl rp2_common/pico_standard_link
Expand Down
2 changes: 1 addition & 1 deletion src/rp2350/pico_platform/memmap_no_flash.ld
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ INCLUDE "memmap_no_flash.incl"
* ├── sections_no_flash_data.incl rp2_common/pico_standard_link
* │ ├── section_no_flash_data.incl rp2_common/pico_standard_link
* │ ├── section_uninitialized_data.incl rp2_common/pico_standard_link
* │ └── section_bss.incl rp2_common/pico_standard_link
* │ └── section_tls.incl rp2_common/pico_standard_link
* ├── section_generated_post_data.incl rp2_common/pico_standard_link
* ├── section_extra_post_data.incl rp2_common/pico_standard_link
* ├── section_heap.incl rp2_common/pico_standard_link
Expand Down
1 change: 1 addition & 0 deletions src/rp2_common/BUILD.bazel
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,7 @@ alias(
"//src/rp2_common/pico_mem_ops:__pkg__",
"//src/rp2_common/pico_printf:__pkg__",
"//src/rp2_common/pico_runtime_init:__pkg__",
"//src/rp2_common/pico_tls:__pkg__",
],
)

Expand Down
3 changes: 2 additions & 1 deletion src/rp2_common/pico_clib_interface/newlib_interface.c
Original file line number Diff line number Diff line change
Expand Up @@ -157,6 +157,7 @@ int __attribute__((weak)) _getentropy (__unused void *buffer, __unused size_t le
// want to pull in pico_rand. the user can supply their own strong implementation if they need it!
return -1;
}

// exit is not useful... no desire to pull in __call_exitprocs
void exit(int status) {
_exit(status);
Expand Down Expand Up @@ -201,4 +202,4 @@ void runtime_init(void) {
for (void (**p)(void) = &__init_array_start; p < &__init_array_end; ++p) {
(*p)();
}
}
}
24 changes: 0 additions & 24 deletions src/rp2_common/pico_clib_interface/picolibc_interface.c
Original file line number Diff line number Diff line change
Expand Up @@ -134,27 +134,3 @@ void runtime_init(void) {
extern void __libc_init_array(void);
__libc_init_array();
}

#if !PICO_RUNTIME_NO_INIT_PER_CORE_TLS_SETUP
__weak void runtime_init_pre_core_tls_setup(void) {
// for now we just set the same global area on both cores
// note: that this is superfluous with the stock picolibc it seems, since it is itself
// using a version of __aeabi_read_tp that returns the same pointer on both cores
extern char __tls_base[];
extern void _set_tls(void *tls);
_set_tls(__tls_base);
}
#endif

#if !PICO_RUNTIME_SKIP_INIT_PER_CORE_TLS_SETUP
PICO_RUNTIME_INIT_FUNC_PER_CORE(runtime_init_pre_core_tls_setup, PICO_RUNTIME_INIT_PER_CORE_TLS_SETUP);
#endif

//// naked as it must preserve everything except r0 and lr
//uint32_t __attribute__((naked)) WRAPPER_FUNC(__aeabi_read_tp)() {
// // note for now we are just returning a shared instance on both cores
// pico_default_asm_volatile(
// "ldr r0, =__tls_base\n"
// "bx lr\n"
// );
//}
7 changes: 6 additions & 1 deletion src/rp2_common/pico_runtime/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ set(PICO_RUNTIME_LIBRARIES
pico_crt0
pico_clib_interface
pico_stdio
pico_tls
)

foreach(LIB IN LISTS PICO_RUNTIME_LIBRARIES)
Expand Down Expand Up @@ -83,7 +84,8 @@ function(pico_minimize_runtime TARGET)
DOUBLE
FPGA_CHECK
PANIC
AUTO_INIT_MUTEX)
AUTO_INIT_MUTEX
TLS)
cmake_parse_arguments(RUNTIME "" ""
"INCLUDE;EXCLUDE" ${ARGN} )
foreach (INCL_EXCL IN ITEMS INCLUDE EXCLUDE)
Expand Down Expand Up @@ -114,6 +116,9 @@ function(pico_minimize_runtime TARGET)
if (NOT RUNTIME_INCLUDE_AUTO_INIT_MUTEX)
target_compile_definitions(${TARGET} PRIVATE PICO_RUNTIME_SKIP_INIT_MUTEX=1)
endif()
if (NOT RUNTIME_INCLUDE_TLS)
pico_set_tls_implementation(${TARGET} none)
endif()

if (RUNTIME_INCLUDE_PRINTF)
if (NOT RUNTIME_INCLUDE_PRINTF_MINIMAL)
Expand Down
31 changes: 0 additions & 31 deletions src/rp2_common/pico_standard_link/script_include/section_bss.incl

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,10 @@
__fini_array_start, __fini_array_end
__tdata_end
__etext
__bss_start__, __bss_end__
__tls_base, __tls_end
__tbss_end
__global_pointer$
*/

SECTIONS
Expand All @@ -25,6 +29,11 @@ SECTIONS
*(.data*)
*(.sdata*)

. = ALIGN(4);
PROVIDE_HIDDEN (__emutls_array_start = .);
*(.*.__emutls_v.*)
PROVIDE_HIDDEN (__emutls_array_end = .);

. = ALIGN(4);
*(.after_data.*)
. = ALIGN(4);
Expand Down Expand Up @@ -71,4 +80,33 @@ SECTIONS

/* __etext is (for backwards compatibility) the name of the .data init source pointer (...) */
__etext = LOADADDR(.data);

. = ALIGN(4);
/* note that .tbss is expected to directly follow .tdata */
.tbss (NOLOAD) : {
__bss_start__ = .;
__tls_base = .;
*(.tbss .tbss.* .gnu.linkonce.tb.*)
*(.tcommon)

. = ALIGN(4);
__tls_end = .;
} > RAM

/* workaround RISC-V GNU linker bug with spacer section (otherwise it places .bss over .tbss) */
.tbss_space (NOLOAD) : {
. = __bss_start__ + SIZEOF(.tbss);
} > 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
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,10 @@
__data_start__, __data_end__
__mutex_array_start, __mutex_array_end
__etext
__bss_start__, __bss_end__
__tls_base, __tls_end
__tbss_end
__global_pointer$
*/

SECTIONS
Expand All @@ -18,9 +22,15 @@ SECTIONS
*(.rodata*)
. = ALIGN(4);

PROVIDE_HIDDEN (__emutls_array_start = .);
*(.*.__emutls_v.*)
PROVIDE_HIDDEN (__emutls_array_end = .);
. = ALIGN(4);

*(.data*)
*(.sdata*)


. = ALIGN(4);
*(.after_data.*)
. = ALIGN(4);
Expand All @@ -44,4 +54,34 @@ SECTIONS

/* __etext is (for backwards compatibility) the name of the .data init source pointer (...) */
__etext = LOADADDR(.data);

. = ALIGN(4);
/* note that .tbss is expected to directly follow .tdata */
.tbss (NOLOAD) : {
__bss_start__ = .;
__tls_base = .;
*(.tbss .tbss.* .gnu.linkonce.tb.*)
*(.tcommon)

. = ALIGN(4);
__tls_end = .;
} > RAM

/* workaround RISC-V GNU linker bug with spacer section (otherwise it places .bss over .tbss) */
.tbss_space (NOLOAD) : {
. = __bss_start__ + SIZEOF(.tbss);
} > 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

}
Loading
Loading