1 /* 2 * Copyright (c) 2015 Wind River Systems, Inc. 3 * 4 * SPDX-License-Identifier: Apache-2.0 5 */ 6 7 /** @file 8 * 9 * @brief Per-thread errno accessor function 10 * 11 * Allow accessing the errno for the current thread without involving the 12 * context switching. 13 */ 14 15 #include <zephyr/kernel.h> 16 #include <zephyr/syscall_handler.h> 17 18 /* 19 * Define _k_neg_eagain for use in assembly files as errno.h is 20 * not assembly language safe. 21 * FIXME: wastes 4 bytes 22 */ 23 const int _k_neg_eagain = -EAGAIN; 24 25 #ifdef CONFIG_ERRNO 26 27 #if defined(CONFIG_LIBC_ERRNO) 28 /* nothing needed here */ 29 #elif defined(CONFIG_ERRNO_IN_TLS) 30 __thread int z_errno_var; 31 #else 32 33 #ifdef CONFIG_USERSPACE z_impl_z_errno(void)34int *z_impl_z_errno(void) 35 { 36 /* Initialized to the lowest address in the stack so the thread can 37 * directly read/write it 38 */ 39 return &_current->userspace_local_data->errno_var; 40 } 41 z_vrfy_z_errno(void)42static inline int *z_vrfy_z_errno(void) 43 { 44 return z_impl_z_errno(); 45 } 46 #include <syscalls/z_errno_mrsh.c> 47 48 #else z_impl_z_errno(void)49int *z_impl_z_errno(void) 50 { 51 return &_current->errno_var; 52 } 53 #endif /* CONFIG_USERSPACE */ 54 55 #endif /* CONFIG_ERRNO_IN_TLS */ 56 57 #endif /* CONFIG_ERRNO */ 58