libsel4: make thread-local ipc buffer optional

At the moment, the seL4 microkit does not setup TLS variable
support. The workaround has been to `#define __thread` (blank)
before including `<sel4/sel4.h>` in `<microkit.h>`, which causes
issues if `<microkit.h>` is included *after* `<sel4/sel4.h>`,
often with obscure linker errors to `__emutls_**` symbols.

Instead we add a libsel4 config option that allows us to build
it with __thread copied out. We introduce an LIBSEL4_THREAD_LOCAL
macro in a similar way to the existing LIBSEL4_INLINE macro.

Signed-off-by: Julia Vassiliki <julia.vassiliki@unsw.edu.au>
This commit is contained in:
Julia Vassiliki
2026-02-13 10:56:08 +11:00
committed by Indan Zupancic
parent b5d53702d4
commit b5cc70d753
4 changed files with 19 additions and 4 deletions

View File

@@ -44,6 +44,15 @@ config_string(
UNQUOTE
)
config_option(
LibSel4UseThreadLocals
LIB_SEL4_USE_THREAD_LOCALS
"mark the __sel4_ipc_buffer variable as thread local using '__thread'. \
This requires thread local storage support and is useful if multiple \
threads share the same virtual address space."
DEFAULT ON
)
if(LibSel4StubsUseIPCBufferOnly)
set(buffer "--buffer")
endif()

View File

@@ -10,10 +10,10 @@
#include <sel4/types.h>
#include <sel4/syscalls.h>
extern __thread seL4_IPCBuffer *__sel4_ipc_buffer;
extern LIBSEL4_THREAD_LOCAL seL4_IPCBuffer *__sel4_ipc_buffer;
#ifdef CONFIG_KERNEL_INVOCATION_REPORT_ERROR_IPC
extern __thread char __sel4_print_error;
extern LIBSEL4_THREAD_LOCAL char __sel4_print_error;
LIBSEL4_INLINE_FUNC char *seL4_GetDebugError(void)
{

View File

@@ -42,6 +42,12 @@
#endif
#if defined(CONFIG_LIB_SEL4_USE_THREAD_LOCALS)
#define LIBSEL4_THREAD_LOCAL __thread
#else
#define LIBSEL4_THREAD_LOCAL
#endif
/* _Static_assert() is a c11 feature. Since the kernel is currently compiled
* with c99, we have to emulate it. */
#if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 201112L)

View File

@@ -7,11 +7,11 @@
#include <sel4/sel4.h>
#ifdef CONFIG_KERNEL_INVOCATION_REPORT_ERROR_IPC
__thread char __sel4_print_error = CONFIG_LIB_SEL4_PRINT_INVOCATION_ERRORS;
LIBSEL4_THREAD_LOCAL char __sel4_print_error = CONFIG_LIB_SEL4_PRINT_INVOCATION_ERRORS;
#endif
/** Userland per-thread IPC buffer address **/
__thread seL4_IPCBuffer *__sel4_ipc_buffer;
LIBSEL4_THREAD_LOCAL seL4_IPCBuffer *__sel4_ipc_buffer;
/** Consider moving bootinfo into libsel4_startup */
seL4_BootInfo *bootinfo;