Branch data Line data Source code
1 : : /* 2 : : * Copyright (c) 2010-2015 Wind River Systems, Inc. 3 : : * Copyright (c) 2017 Oticon A/S 4 : : * 5 : : * SPDX-License-Identifier: Apache-2.0 6 : : */ 7 : : 8 : : /** 9 : : * @file 10 : : * @brief Thread support primitives 11 : : * 12 : : * This module provides core thread related primitives for the POSIX 13 : : * architecture 14 : : */ 15 : : 16 : : #include <stdio.h> 17 : : #include <zephyr/toolchain.h> 18 : : #include <zephyr/kernel_structs.h> 19 : : #include <ksched.h> 20 : : 21 : : #include "posix_core.h" 22 : : #include <zephyr/arch/posix/posix_soc_if.h> 23 : : 24 : : #ifdef CONFIG_TRACING 25 : : #include <zephyr/tracing/tracing_macros.h> 26 : : #include <zephyr/tracing/tracing.h> 27 : : #endif 28 : : 29 : : /* Note that in this arch we cheat quite a bit: we use as stack a normal 30 : : * pthreads stack and therefore we ignore the stack size 31 : : */ 32 : 48 : void arch_new_thread(struct k_thread *thread, k_thread_stack_t *stack, 33 : : char *stack_ptr, k_thread_entry_t entry, 34 : : void *p1, void *p2, void *p3) 35 : : { 36 : : 37 : 48 : posix_thread_status_t *thread_status; 38 : : 39 : : /* We store it in the same place where normal archs store the 40 : : * "initial stack frame" 41 : : */ 42 : 48 : thread_status = Z_STACK_PTR_TO_FRAME(posix_thread_status_t, stack_ptr); 43 : : 44 : : /* z_thread_entry() arguments */ 45 : 48 : thread_status->entry_point = entry; 46 : 48 : thread_status->arg1 = p1; 47 : 48 : thread_status->arg2 = p2; 48 : 48 : thread_status->arg3 = p3; 49 : : #if defined(CONFIG_ARCH_HAS_THREAD_ABORT) 50 : 48 : thread_status->aborted = 0; 51 : : #endif 52 : : 53 : 48 : thread->callee_saved.thread_status = thread_status; 54 : : 55 : 48 : thread_status->thread_idx = posix_new_thread((void *)thread_status); 56 : 48 : } 57 : : 58 : 44 : int arch_thread_name_set(struct k_thread *thread, const char *str) 59 : : { 60 : : #define MAX_HOST_THREAD_NAME 16 61 : : 62 : 44 : int ret; 63 : 44 : int thread_index; 64 : 44 : posix_thread_status_t *thread_status; 65 : 44 : char th_name[MAX_HOST_THREAD_NAME]; 66 : : 67 : 44 : thread_status = thread->callee_saved.thread_status; 68 [ + - ]: 44 : if (!thread_status) { 69 : : return -EAGAIN; 70 : : } 71 : : 72 : 44 : thread_index = thread_status->thread_idx; 73 : : 74 [ + - ]: 44 : if (!str) { 75 : : return -EAGAIN; 76 : : } 77 : : 78 : 44 : snprintf(th_name, MAX_HOST_THREAD_NAME, 79 : : #if (CONFIG_NATIVE_SIMULATOR_NUMBER_MCUS > 1) 80 : : STRINGIFY(CONFIG_NATIVE_SIMULATOR_MCU_N) ":" 81 : : #endif 82 : : "%s", str); 83 : : 84 : 44 : ret = posix_arch_thread_name_set(thread_index, th_name); 85 [ - + ]: 44 : if (ret) { 86 : 0 : return -EAGAIN; 87 : : } 88 : : 89 : : return 0; 90 : : } 91 : : 92 : 47 : void posix_arch_thread_entry(void *pa_thread_status) 93 : : { 94 : 47 : posix_thread_status_t *ptr = pa_thread_status; 95 : 47 : posix_irq_full_unlock(); 96 : 47 : z_thread_entry(ptr->entry_point, ptr->arg1, ptr->arg2, ptr->arg3); 97 : : } 98 : : 99 : : #if defined(CONFIG_ARCH_HAS_THREAD_ABORT) 100 : 88 : void z_impl_k_thread_abort(k_tid_t thread) 101 : : { 102 : 88 : unsigned int key; 103 : 88 : int thread_idx; 104 : : 105 : 88 : SYS_PORT_TRACING_OBJ_FUNC_ENTER(k_thread, abort, thread); 106 : : 107 : 88 : posix_thread_status_t *tstatus = 108 : : (posix_thread_status_t *) 109 : : thread->callee_saved.thread_status; 110 : : 111 : 88 : thread_idx = tstatus->thread_idx; 112 : : 113 : 88 : key = irq_lock(); 114 : : 115 [ + + ]: 88 : if (_current == thread) { 116 : 46 : if (tstatus->aborted == 0) { /* LCOV_EXCL_BR_LINE */ 117 : 46 : tstatus->aborted = 1; 118 : : } else { 119 : : posix_print_warning(/* LCOV_EXCL_LINE */ 120 : : "POSIX arch: The kernel is trying to abort and swap " 121 : : "out of an already aborted thread %i. This " 122 : : "should NOT have happened\n", 123 : : thread_idx); 124 : : } 125 : 46 : posix_abort_thread(thread_idx); 126 : : } 127 : : 128 : 88 : z_thread_abort(thread); 129 : : 130 [ - + ]: 42 : if (tstatus->aborted == 0) { 131 : : PC_DEBUG("%s aborting now [%i] %i\n", 132 : : __func__, 133 : : posix_arch_get_unique_thread_id(thread_idx), 134 : 0 : thread_idx); 135 : : 136 : 0 : tstatus->aborted = 1; 137 : 0 : posix_abort_thread(thread_idx); 138 : : } else { 139 : : PC_DEBUG("%s ignoring re_abort of [%i] " 140 : : "%i\n", 141 : : __func__, 142 : : posix_arch_get_unique_thread_id(thread_idx), 143 : 42 : thread_idx); 144 : : } 145 : : 146 : : /* The abort handler might have altered the ready queue. */ 147 : 42 : z_reschedule_irqlock(key); 148 : : 149 : 42 : SYS_PORT_TRACING_OBJ_FUNC_EXIT(k_thread, abort, thread); 150 : 42 : } 151 : : #endif