1 /* 2 * Copyright (c) 2006-2023, RT-Thread Development Team 3 * 4 * SPDX-License-Identifier: Apache-2.0 5 * 6 * Change Logs: 7 * Date Author Notes 8 * 2022-09-30 RT-Thread the general porting API for lwp 9 * 2023-07-18 Shell New signal arch API arch_thread_signal_enter 10 */ 11 12 #ifndef __LWP_ARCH_COMM__ 13 #define __LWP_ARCH_COMM__ 14 15 #include <mm_aspace.h> 16 #include <rtthread.h> 17 #include <mmu.h> 18 19 /** 20 * APIs that must port to all architectures 21 */ 22 23 /* syscall handlers */ 24 void arch_clone_exit(void); 25 void arch_fork_exit(void); 26 void arch_syscall_exit(void); 27 void arch_ret_to_user(void); 28 29 /* ELF relocation */ 30 #ifdef ARCH_MM_MMU 31 32 struct rt_lwp; 33 void arch_elf_reloc(rt_aspace_t aspace, void *text_start, void *rel_dyn_start, size_t rel_dyn_size, void *got_start, size_t got_size, void *dynsym); 34 #else 35 void arch_elf_reloc(void *text_start, void *rel_dyn_start, size_t rel_dyn_size, void *got_start, size_t got_size, void *dynsym); 36 #endif 37 38 /* User entry. enter user program code for the first time */ 39 void arch_crt_start_umode(void *args, const void *text, void *ustack, void *user_stack); 40 void arch_start_umode(void *args, const void *text, void *ustack, void *k_stack); 41 42 /* lwp create and setup */ 43 int arch_set_thread_context(void (*exit)(void), void *new_thread_stack, 44 void *user_stack, void **thread_sp); 45 void *arch_get_user_sp(void); 46 47 /* user space setup and control */ 48 int arch_user_space_init(struct rt_lwp *lwp); 49 void arch_user_space_free(struct rt_lwp *lwp); 50 void *arch_kernel_mmu_table_get(void); 51 void arch_kuser_init(rt_aspace_t aspace, void *vectors); 52 int arch_expand_user_stack(void *addr); 53 54 /* thread id register */ 55 void arch_set_thread_area(void *p); 56 void* arch_get_tidr(void); 57 void arch_set_tidr(void *p); 58 59 /** entry point of architecture signal handling */ 60 rt_noreturn void arch_thread_signal_enter(int signo, siginfo_t *psiginfo, 61 void *exp_frame, void *entry_uaddr, 62 lwp_sigset_t *save_sig_mask); 63 64 void arch_signal_check_erestart(void *eframe, void *ksp); 65 66 void arch_syscall_set_errno(void *eframe, int expected, int code); 67 68 int arch_backtrace_uthread(rt_thread_t thread); 69 70 #endif /* __LWP_ARCH_COMM__ */ 71