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