18#ifndef __VSF_LINUX_INTERNAL_H__
19#define __VSF_LINUX_INTERNAL_H__
26#if VSF_USE_LINUX == ENABLED
28#if VSF_LINUX_CFG_RELATIVE_PATH == ENABLED
42#if defined(__VSF_LINUX_CLASS_IMPLEMENT)
43# define __VSF_CLASS_IMPLEMENT__
44#elif defined(__VSF_LINUX_CLASS_INHERIT__)
45# define __VSF_CLASS_INHERIT__
56#if VSF_KERNEL_CFG_EDA_SUPPORT_ON_TERMINATE != ENABLED
57# error VSF_KERNEL_CFG_EDA_SUPPORT_ON_TERMINATE MUST be enabled to use vsf_linux
60#if VSF_USE_SIMPLE_STREAM != ENABLED
61# error VSF_USE_SIMPLE_STREAM MUST be enabled to use vsf_linux
64#ifndef VSF_LINUX_CFG_STACKSIZE
65# if defined(VSF_KERNEL_CFG_THREAD_STACK_PAGE_SIZE) && defined(VSF_KERNEL_CFG_THREAD_STACK_GUARDIAN_SIZE)
66# if (VSF_KERNEL_CFG_THREAD_STACK_PAGE_SIZE + VSF_KERNEL_CFG_THREAD_STACK_GUARDIAN_SIZE) < 1024
67# define VSF_LINUX_CFG_STACKSIZE 1024
69# define VSF_LINUX_CFG_STACKSIZE (VSF_KERNEL_CFG_THREAD_STACK_PAGE_SIZE + VSF_KERNEL_CFG_THREAD_STACK_GUARDIAN_SIZE)
72# define VSF_LINUX_CFG_STACKSIZE 1024
75#if VSF_LINUX_CFG_STACKSIZE > 0xFFFF
76# if VSF_KERNEL_CFG_THREAD_STACK_LARGE != ENABLED
77# error stacks should be 16-bit if VSF_KERNEL_CFG_THREAD_STACK_LARGE is not enabled
80#if (VSF_LINUX_CFG_STACKSIZE < (VSF_KERNEL_CFG_THREAD_STACK_PAGE_SIZE + VSF_KERNEL_CFG_THREAD_STACK_GUARDIAN_SIZE))\
81 || (VSF_LINUX_CFG_STACKSIZE & (VSF_KERNEL_CFG_THREAD_STACK_PAGE_SIZE - 1))
82# error invalid VSF_LINUX_CFG_STACKSIZE
87#define vsf_linux_thread_get_priv(__thread) (void *)(&(((vsf_linux_thread_t *)(__thread))[1]))
125#if VSF_LINUX_CFG_PLS_NUM > 0 || VSF_LINUX_CFG_TLS_NUM > 0
126typedef struct vsf_linux_localstorage_t {
128 void (*destructor)(
void *
data);
129} vsf_linux_localstorage_t;
131typedef struct vsf_linux_dynlib_mod_t {
137 void (*init)(
void *ctx);
138} vsf_linux_dynlib_mod_t;
140typedef struct vsf_linux_dynlib_t {
154#if VSF_LINUX_CFG_SUPPORT_SIG == ENABLED
163#if VSF_LINUX_CFG_PLS_NUM > 0
167#if VSF_LINUX_CFG_TLS_NUM > 0
173 implement(vsf_thread_t)
174 implement(vsf_thread_cb_t)
187#if VSF_LINUX_CFG_SUPPORT_SIG == ENABLED
190#if VSF_LINUX_CFG_TLS_NUM > 0
193#if VSF_ARCH_USE_THREAD_REG == ENABLED \
194 && VSF_LINUX_USE_SIMPLE_LIBC == ENABLED && VSF_LINUX_USE_SIMPLE_STDLIB == ENABLED\
195 && VSF_LINUX_APPLET_USE_LIBC_STDLIB == ENABLED && !defined(__VSF_APPLET__)
199 } process_reg_backup;
209 unsigned short wantval;
232#if VSF_KERNEL_CFG_EDA_SUPPORT_TIMER == ENABLED
244#if VSF_LINUX_USE_SIMPLE_LIBC == ENABLED && VSF_LINUX_USE_SIMPLE_STDLIB == ENABLED\
245 && VSF_LINUX_SIMPLE_STDLIB_CFG_HEAP_MONITOR == ENABLED
253#if VSF_LINUX_SIMPLE_STDLIB_CFG_HEAP_MONITOR_TRACE_CALLER == ENABLED
262# if VSF_LINUX_SIMPLE_STDLIB_HEAP_MONITOR_MAX == ENABLED
274#if VSF_LINUX_LIBC_USE_ENVIRON == ENABLED
277#if VSF_LINUX_USE_VFORK == ENABLED
278 jmp_buf __vfork_jmpbuf;
283#
if VSF_ARCH_USE_THREAD_REG ==
ENABLED
296#if VSF_KERNEL_CFG_EDA_SUPPORT_TIMER == ENABLED
300#if VSF_LINUX_USE_SIMPLE_LIBC == ENABLED && VSF_LINUX_USE_SIMPLE_STDLIB == ENABLED\
301 && VSF_LINUX_SIMPLE_STDLIB_CFG_HEAP_MONITOR == ENABLED
308#define __VSF_LINUX_PROCESS_HAS_PATH (VSF_LINUX_USE_PROCFS == ENABLED || VSF_LINUX_USE_APPLET == ENABLED || VSF_LINUX_USE_SCRIPT == ENABLED)
309#if __VSF_LINUX_PROCESS_HAS_PATH
313#if VSF_USE_LOADER == ENABLED
329#if VSF_LINUX_CFG_SUPPORT_SIG == ENABLED
343#if VSF_LINUX_USE_VFORK == ENABLED
347#if VSF_LINUX_CFG_PLS_NUM > 0
349 vsf_bitmap(vsf_linux_pls_bitmap) dynlib_bitmap;
354#if VSF_LINUX_CFG_TLS_NUM > 0
366#if VSF_LINUX_USE_APPLET == ENABLED
370#if VSF_LINUX_CFG_PLS_NUM > 0
378# ifndef __VSF_APPLET__
383#if defined(__VSF_APPLET__) && (defined(__VSF_APPLET_LIB__) || defined(__VSF_APPLET_LINUX_FUNDMENTAL_LIB__))\
384 && VSF_APPLET_CFG_ABI_PATCH != ENABLED && VSF_LINUX_USE_APPLET == ENABLED
386#ifndef VSF_LINUX_APPLET_FUNDMENTAL_VPLT
387# if VSF_LINUX_USE_APPLET == ENABLED
388# define VSF_LINUX_APPLET_FUNDMENTAL_VPLT \
389 ((vsf_linux_fundmental_vplt_t *)(VSF_LINUX_APPLET_VPLT->fundmental_vplt))
391# define VSF_LINUX_APPLET_FUNDMENTAL_VPLT \
392 ((vsf_linux_fundmental_vplt_t *)vsf_vplt((void *)0))
396#define VSF_LINUX_APPLET_FUNDMENTAL_ENTRY(__NAME) \
397 VSF_APPLET_VPLT_ENTRY_FUNC_ENTRY(VSF_LINUX_APPLET_FUNDMENTAL_VPLT, __NAME)
398#define VSF_LINUX_APPLET_FUNDMENTAL_IMP(...) \
399 VSF_APPLET_VPLT_ENTRY_FUNC_IMP(VSF_LINUX_APPLET_FUNDMENTAL_VPLT, __VA_ARGS__)
401#if VSF_LINUX_CFG_PLS_NUM > 0
402VSF_LINUX_APPLET_FUNDMENTAL_IMP(vsf_linux_dynlib_ctx_get,
void *,
const vsf_linux_dynlib_mod_t *mod) {
404 return VSF_LINUX_APPLET_FUNDMENTAL_ENTRY(vsf_linux_dynlib_ctx_get)(mod);
406VSF_LINUX_APPLET_FUNDMENTAL_IMP(vsf_linux_dynlib_ctx_set,
int,
const vsf_linux_dynlib_mod_t *mod,
void *ctx) {
408 return VSF_LINUX_APPLET_FUNDMENTAL_ENTRY(vsf_linux_dynlib_ctx_set)(mod, ctx);
416# if VSF_USE_LOADER == ENABLED
425#if VSF_LINUX_CFG_PLS_NUM > 0
426extern void * vsf_linux_dynlib_ctx_get(
const vsf_linux_dynlib_mod_t *mod);
427extern int vsf_linux_dynlib_ctx_set(
const vsf_linux_dynlib_mod_t *mod,
void *ctx);
430#define vsf_linux_dynlib_ctx vsf_linux_dynlib_ctx_get
435# if VSF_USE_LOADER == ENABLED
457#if VSF_LINUX_SIMPLE_STDLIB_CFG_HEAP_MONITOR == ENABLED
459# if VSF_LINUX_SIMPLE_STDLIB_CFG_HEAP_MONITOR_TRACE_CALLER == ENABLED
460# define __malloc_ex(__process, __size) ____malloc_ex((__process), (__size), __FILE__, __FUNCTION__, __LINE__)
461# define __calloc_ex(__process, __n, __size) ____calloc_ex((__process), (__n), (__size), __FILE__, __FUNCTION__, __LINE__)
462# define __realloc_ex(__process, __ptr, __size) ____realloc_ex((__process), (__ptr), (__size), __FILE__, __FUNCTION__, __LINE__)
463# define __strdup_ex(__process, __str) ____strdup_ex((__process), (char *)(__str), __FILE__, __FUNCTION__, __LINE__)
465# define __malloc_ex(__process, __size) ____malloc_ex((__process), (__size), NULL, NULL, 0)
466# define __calloc_ex(__process, __n, __size) ____calloc_ex((__process), (__n), (__size), NULL, NULL, 0)
467# define __realloc_ex(__process, __ptr, __size) ____realloc_ex((__process), (__ptr), (__size), NULL, NULL, 0)
468# define __strdup_ex(__process, __str) ____strdup_ex((__process), (char *)(__str), NULL, NULL, 0)
471# define __malloc_ex(__process, __size) vsf_linux_process_heap_malloc((__process), (__size))
472# define __calloc_ex(__process, __n, __size) vsf_linux_process_heap_calloc((__process), (__n), (__size))
473# define __free_ex(__process, __ptr) vsf_linux_process_heap_free((__process), (__ptr))
474# define __realloc_ex(__process, __ptr, __size) vsf_linux_process_heap_realloc((__process), (__ptr), (__size))
475# define __strdup_ex(__process, __str) vsf_linux_process_heap_strdup((__process), (char *)(__str))
490#if VSF_LINUX_CFG_PLS_NUM > 0
491extern vsf_err_t vsf_linux_library_init(
int *lib_idx,
void *lib_ctx,
void (*destructor)(
void *));
492extern void * vsf_linux_library_ctx(
int lib_idx);
494extern vsf_err_t vsf_linux_dynlib_init(
int *lib_idx,
int module_num,
int bss_size);
498#if VSF_LINUX_CFG_PLS_NUM > 0
499extern int vsf_linux_pls_alloc(
void);
500extern void vsf_linux_pls_free(
int idx);
501extern vsf_linux_localstorage_t * vsf_linux_pls_get(
int idx);
504#if defined(__VSF_LINUX_CLASS_IMPLEMENT) || defined(__VSF_LINUX_CLASS_INHERIT__)
505# if VSF_LINUX_CFG_TLS_NUM > 0
506extern int vsf_linux_tls_alloc(
void (*destructor)(
void *));
507extern void vsf_linux_tls_free(
int idx);
508extern vsf_linux_localstorage_t * vsf_linux_tls_get(
int idx);
515#define __vsf_linux_start_process_internal3(__entry, __argv, __stack_size, __prio)\
516 __vsf_linux_start_process_internal((__entry), (__argv), (__stack_size), (__prio))
517#define __vsf_linux_start_process_internal2(__entry, __argv, __stack_size) \
518 __vsf_linux_start_process_internal3((__entry), (__argv), (__stack_size), VSF_LINUX_CFG_PRIO_LOWEST)
519#define __vsf_linux_start_process_internal1(__entry, __argv) \
520 __vsf_linux_start_process_internal2((__entry), (__argv), 0)
521#define __vsf_linux_start_process_internal0(__entry) \
522 __vsf_linux_start_process_internal1(__entry, NULL)
525#define vsf_linux_start_process_internal(__entry, ...) \
526 __PLOOC_EVAL(__vsf_linux_start_process_internal, __VA_ARGS__)((__entry), ##__VA_ARGS__)
538#if VSF_ARCH_USE_THREAD_REG == ENABLED
549 int stack_size,
void *stack);
581#undef __VSF_LINUX_CLASS_IMPLEMENT
582#undef __VSF_LINUX_CLASS_INHERIT__
#define ENABLED
Definition __type.h:28
vsf_err_t
Definition __type.h:42
Definition vsf_heap.h:114
Definition vsf_linux.h:270
Definition vsf_linux.h:171
Definition vsf_linux.h:150
Definition vsf_simple_stream.h:254
uint64_t vsf_systimer_tick_t
Definition cortex_a_generic.h:73
struct ieee80211_ext_chansw_ie data
Definition ieee80211.h:80
__le16 timeout
Definition ieee80211.h:94
int pid_t
Definition types.h:85
int key_t
Definition types.h:84
#define PATH_MAX
Definition limits.h:11
#define vsf_dcl_class
Definition ooc_class.h:46
#define vsf_class(__name)
Definition ooc_class.h:48
void(* sighandler_t)(int)
Definition signal.h:40
uint32_t uintptr_t
Definition stdint.h:38
unsigned short uint16_t
Definition stdint.h:7
unsigned uint32_t
Definition stdint.h:9
unsigned int uint_fast32_t
Definition stdint.h:27
unsigned char uint8_t
Definition stdint.h:5
Definition vsf_list.h:888
Definition vsf_list.h:883
Definition vsf_linux.h:367
vsf_vplt_info_t info
Definition vsf_linux.h:368
VSF_APPLET_VPLT_ENTRY_FUNC_DEF(vsf_linux_get_cur_process)
VSF_APPLET_VPLT_ENTRY_FUNC_DEF(vsf_linux_loader_keep_ram)
Definition vsf_linux.h:260
vsf_dlist_t list
Definition vsf_linux.h:266
size_t usage
Definition vsf_linux.h:261
size_t max_usage
Definition vsf_linux.h:263
int balance
Definition vsf_linux.h:265
Definition vsf_linux.h:120
vsf_dlist_node_t node
Definition vsf_linux.h:121
key_t key
Definition vsf_linux.h:122
Definition vsf_linux.h:101
int argc
Definition vsf_linux.h:102
char const ** argv
Definition vsf_linux.h:103
Definition vsf_linux.h:115
vsf_linux_process_arg_t arg
Definition vsf_linux.h:116
vsf_linux_main_entry_t entry
Definition vsf_linux.h:117
Definition vsf_linux.h:215
void(* sigaction_handler)(int, siginfo_t *, void *)
Definition vsf_linux.h:222
vsf_dlist_node_t node
Definition vsf_linux.h:216
uint8_t sig
Definition vsf_linux.h:217
sighandler_t sighandler
Definition vsf_linux.h:221
sigset_t mask
Definition vsf_linux.h:219
uint32_t flags
Definition vsf_linux.h:218
Definition vsf_linux.h:226
vsf_stream_t * err
Definition vsf_linux.h:229
vsf_stream_t * out
Definition vsf_linux.h:228
vsf_stream_t * in
Definition vsf_linux.h:227
Definition vsf_linux.h:109
void(* on_run)(vsf_thread_cb_t *cb)
Definition vsf_linux.h:111
int priv_size
Definition vsf_linux.h:110
void(* on_terminate)(vsf_linux_thread_t *thread)
Definition vsf_linux.h:112
Definition vsf_linux.h:233
int overrun
Definition vsf_linux.h:236
struct itimerspec value
Definition vsf_linux.h:234
vsf_systimer_tick_t start
Definition vsf_linux.h:238
vsf_callback_timer_t timer
Definition vsf_linux.h:237
struct sigevent evt
Definition vsf_linux.h:235
Definition vsf_linux.h:247
const char * file
Definition vsf_linux.h:255
int line
Definition vsf_linux.h:254
size_t size
Definition vsf_linux.h:251
vsf_dlist_node_t node
Definition vsf_linux.h:248
const char * func
Definition vsf_linux.h:256
void * ptr
Definition vsf_linux.h:250
@ ITIMER_NUM
Definition time.h:39
#define _exit
Definition unistd.h:89
#define dcl_vsf_bitmap(__name, __bit_size)
Definition vsf_bitmap.h:98
#define vsf_bitmap(__name)
Definition vsf_bitmap.h:93
#define VSF_APPLET_VPLT_ENTRY_FUNC_DEF(__NAME)
Definition vsf_cfg.h:156
#define __VSF_VPLT_DECORATOR__
Definition vsf_cfg.h:93
#define VSF_APPLET_VPLT_ENTRY_FUNC_TRACE()
Definition vsf_cfg.h:165
@ VSF_EVT_USER
Definition vsf_eda.h:621
VSF_KERNEL_TIMEOUT_TICK_T vsf_timeout_tick_t
Definition vsf_eda.h:592
uint_fast32_t alignment
Definition vsf_heap.h:135
vsf_prio_t
Definition vsf_kernel_common.h:37
uintptr_t vsf_linux_set_process_reg(uintptr_t reg)
Definition vsf_linux.c:1571
int vsf_linux_trigger_signal(vsf_linux_trigger_t *trig, int sig)
Definition vsf_linux.c:692
int vsf_linux_start_process(vsf_linux_process_t *process)
Definition vsf_linux.c:1365
VSF_CAL_NO_RETURN void vsf_linux_exit_process(int status, bool _exit)
Definition vsf_linux.c:1449
vsf_linux_process_t * vsf_linux_create_process(int stack_size, int heap_size, int priv_size)
Definition vsf_linux.c:1335
int vsf_linux_trigger_pend(vsf_linux_trigger_t *trig, vsf_timeout_tick_t timeout)
Definition vsf_linux.c:712
void vsf_linux_cleanup_process(vsf_linux_process_t *process)
Definition vsf_linux.c:1374
void vsf_linux_thread_on_terminate(vsf_linux_thread_t *thread)
Definition vsf_linux.c:1806
vsf_linux_process_t * __vsf_linux_start_process_internal(vsf_linux_main_entry_t entry, char *const *argv, int stack_size, vsf_prio_t prio)
Definition vsf_linux.c:1577
void vsf_linux_trigger_init(vsf_linux_trigger_t *trig)
Definition vsf_linux.c:683
vsf_linux_process_t * vsf_linux_get_process(pid_t pid)
Definition vsf_linux.c:1598
int vsf_linux_wait_thread(int tid, int *retval)
Definition vsf_linux.c:1869
int vsf_linux_merge_env(vsf_linux_process_t *process, char **env)
Definition vsf_linux.c:651
bool vsf_linux_is_inited(void)
Definition vsf_linux.c:986
int __vsf_linux_process_parse_arg(vsf_linux_process_t *process, vsf_linux_process_arg_t *arg, char *const *argv)
Definition vsf_linux.c:859
void __vsf_linux_process_free_arg(vsf_linux_process_t *process)
Definition vsf_linux.c:846
void vsf_linux_free_env(vsf_linux_process_t *process)
Definition vsf_linux.c:670
vsf_linux_process_t * vsf_linux_get_real_process(vsf_linux_process_t *process)
Definition vsf_linux.c:349
vsf_linux_thread_t * vsf_linux_get_thread(pid_t pid, int tid)
Definition vsf_linux.c:1611
void vsf_linux_detach_process(vsf_linux_process_t *process)
Definition vsf_linux.c:1846
void vsf_linux_detach_thread(vsf_linux_thread_t *thread)
Definition vsf_linux.c:1857
void vsf_linux_delete_process(vsf_linux_process_t *process)
Definition vsf_linux.c:1439
int vsf_linux_fs_get_executable(const char *pathname, vsf_linux_main_entry_t *entry)
Definition vsf_linux.c:2943
int vsf_linux_start_thread(vsf_linux_thread_t *thread, vsf_prio_t priority)
Definition vsf_linux.c:1175
vsf_linux_thread_t * vsf_linux_create_thread(vsf_linux_process_t *process, const vsf_linux_thread_op_t *op, int stack_size, void *stack)
Definition vsf_linux.c:1156
int(* vsf_linux_main_entry_t)(int, char **)
Definition vsf_linux.h:106
void * vsf_linux_process_heap_malloc_aligned(vsf_linux_process_t *process, uint_fast32_t size, uint_fast32_t alignment)
Definition vsf_linux.c:1220
int(* vsf_linux_process_arg_parser_t)(vsf_linux_process_arg_t *arg)
Definition vsf_linux.h:107
void * vsf_linux_malloc_res(size_t size)
Definition vsf_linux.c:961
int vsf_linux_chdir(vsf_linux_process_t *process, char *working_dir)
Definition vsf_linux_fs.c:1596
void * vsf_linux_process_heap_malloc(vsf_linux_process_t *process, size_t size)
Definition vsf_linux.c:1230
void vsf_linux_set_errno(int err)
int vsf_linux_get_errno(void)
vsf_systimer_tick_t vsf_linux_sleep(vsf_timeout_tick_t ticks)
Definition vsf_linux.c:3008
char * vsf_linux_process_heap_strdup(vsf_linux_process_t *process, char *str)
Definition vsf_linux.c:1266
vsf_eda_t * vsf_linux_get_kernel_task(void)
Definition vsf_linux.c:916
void * vsf_linux_process_heap_realloc(vsf_linux_process_t *process, void *buffer, uint_fast32_t size)
Definition vsf_linux.c:1200
int vsf_linux_fs_bind_executable(char *path, vsf_linux_main_entry_t entry)
Definition vsf_linux.c:2972
int vsf_linux_fd_bind_executable(int fd, vsf_linux_main_entry_t entry)
Definition vsf_linux.c:2963
void vsf_linux_free_res(void *ptr)
Definition vsf_linux.c:966
@ __VSF_EVT_LINUX_EVENTFD_INC
Definition vsf_linux.h:94
@ __VSF_EVT_LINUX_TERM_RX
Definition vsf_linux.h:95
int vsf_linux_expandenv(const char *str, char *output, size_t bufflen)
Definition vsf_linux.c:4378
void vsf_linux_loader_keep_ram(void)
Definition vsf_linux.c:4488
size_t vsf_linux_process_heap_size(vsf_linux_process_t *process, void *buffer)
Definition vsf_linux.c:1190
int vsf_linux_generate_path(char *path_out, int path_out_lenlen, char *dir, char *path_in)
Definition vsf_linux.c:779
__VSF_VPLT_DECORATOR__ vsf_linux_fundmental_vplt_t vsf_linux_fundmental_vplt
Definition vsf_linux.c:4722
vsf_linux_process_t * vsf_linux_get_cur_process(void)
Definition vsf_linux.c:1649
void __free_ex(vsf_linux_process_t *process, void *ptr)
Definition vsf_linux_glibc_stdlib.c:122
void vsf_linux_process_heap_free(vsf_linux_process_t *process, void *buffer)
Definition vsf_linux.c:1253
vsf_linux_thread_t * vsf_linux_get_cur_thread(void)
Definition vsf_linux.c:1640
vsf_err_t vsf_linux_init(vsf_linux_stdio_stream_t *stdio_stream)
Definition vsf_linux.c:999
vsf_linux_process_t * vsf_linux_resources_process(void)
Definition vsf_linux.c:955
void * vsf_linux_process_heap_calloc(vsf_linux_process_t *process, size_t n, size_t size)
Definition vsf_linux.c:1241
#define VSF_LINUX_CFG_FD_BITMAP_SIZE
Definition vsf_linux_cfg.h:38
#define VSF_LINUX_CFG_TLS_NUM
Definition vsf_linux_cfg.h:53
#define VSF_LINUX_CFG_ATEXIT_NUM
Definition vsf_linux_cfg.h:73
#define VSF_LINUX_CFG_PLS_NUM
Definition vsf_linux_cfg.h:49
uint32_t size
Definition vsf_memfs.h:50
uint8_t status
Definition vsf_tgui.h:122
int sig
Definition vsf_thread.h:421