ffa49a8240
Fixes: zephyrproject-rtos#67504 The following error is produced when using the following configuration ``` CONFIG_USERSPACE=y CONFIG_NEWLIB_LIBC=y CONFIG_NEWLIB_LIBC_NANO=n CONFIG_DYNAMIC_OBJECTS=y CONFIG_HEAP_MEM_POOL_SIZE=256 CONFIG_THREAD_LOCAL_STORAGE=y CONFIG_MAIN_STACK_SIZE=2048 ``` ``` os: thread 0x301a2950 (-1) does not have permission on k_mutex 0x301aaca4 os: permission bitmap 01 00 |.. os: syscall z_vrfy_k_mutex_lock failed check: access denied os: r0/a1: 0x00000000 r1/a2: 0x00000000 r2/a3: 0x00000000 os: r3/a4: 0x00000000 r12/ip: 0x00000000 r14/lr: 0x00000000 os: xpsr: 0x00000000 os: s[ 0]: 0x00000000 s[ 1]: 0x00000000 s[ 2]: 0x00000000 s[ 3]: 0x00000000 os: s[ 4]: 0x00000000 s[ 5]: 0x00000000 s[ 6]: 0x00000000 s[ 7]: 0x00000000 os: s[ 8]: 0x00000000 s[ 9]: 0x00000000 s[10]: 0x00000000 s[11]: 0x00000000 os: s[12]: 0x00000000 s[13]: 0x00000000 s[14]: 0x00000000 s[15]: 0x00000000 os: fpscr: 0x00000000 os: Faulting instruction address (r15/pc): 0xee7fdb7d os: >>> ZEPHYR FATAL ERROR 3: Kernel oops on CPU 0 os: Current thread: 0x301a2950 ``` This bug caused by a global mutex used by _vfprintf_r() which is initialized in __sinit() and located in z_malloc_partition not being granted access to be used my multiple user threads despite each user thread being granted read and write permission to the z_malloc_partition. Here is a sample main.c to reproduce the bug ``` extern struct k_mem_partition z_libc_partition; extern struct k_mem_partition z_malloc_partition; static k_tid_t tids[TEST_THDS]; static struct k_thread tcbs[TEST_THDS]; static struct k_mem_domain domains[TEST_THDS]; static K_THREAD_STACK_ARRAY_DEFINE(thd_stacks, TEST_THDS, 2048); static int forbidden_global_data = 2; void thread_worker(void* a, void* b, void* c) { (void)b; (void)c; printf("thd %d started\n", (int)(intptr_t)a); k_sleep(K_MSEC(1000)); forbidden_global_data++; /* This should cause an MPU Fault */ } int main(void) { forbidden_global_data = 1; struct k_mem_partition* share_parts[2] = { &z_libc_partition, &z_malloc_partition, }; for (int i = 0l; i < TEST_THDS; i++) { tids[i] = k_thread_create( &tcbs[i], thd_stacks[i], K_THREAD_STACK_SIZEOF(thd_stacks[i]), thread_worker, (void*)(intptr_t)i, NULL, NULL, 5, K_USER, K_FOREVER); k_mem_domain_init(&domains[i], 2, share_parts); k_mem_domain_add_thread(&domains[i], tids[i]); k_thread_start(tids[i]); } for (int i = 0; i < TEST_THDS; i++) { k_thread_join(tids[i], K_FOREVER); } return 0; } ``` Signed-off-by: James Ogier <jogier@meta.com> |
||
---|---|---|
.. | ||
acpi | ||
cpp | ||
crc | ||
hash | ||
heap | ||
libc | ||
mem_blocks | ||
open-amp | ||
os | ||
posix | ||
runtime | ||
smf | ||
utils | ||
CMakeLists.txt | ||
Kconfig |