71 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			71 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								 * Copyright (c) 2006-2023, RT-Thread Development Team
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * SPDX-License-Identifier: Apache-2.0
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * Change Logs:
							 | 
						||
| 
								 | 
							
								 * Date           Author       Notes
							 | 
						||
| 
								 | 
							
								 * 2022-09-30     RT-Thread    the general porting API for lwp
							 | 
						||
| 
								 | 
							
								 * 2023-07-18     Shell        New signal arch API arch_thread_signal_enter
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifndef __LWP_ARCH_COMM__
							 | 
						||
| 
								 | 
							
								#define __LWP_ARCH_COMM__
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include <mm_aspace.h>
							 | 
						||
| 
								 | 
							
								#include <rtthread.h>
							 | 
						||
| 
								 | 
							
								#include <mmu.h>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * APIs that must port to all architectures
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* syscall handlers */
							 | 
						||
| 
								 | 
							
								void arch_clone_exit(void);
							 | 
						||
| 
								 | 
							
								void arch_fork_exit(void);
							 | 
						||
| 
								 | 
							
								void arch_syscall_exit(void);
							 | 
						||
| 
								 | 
							
								void arch_ret_to_user(void);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* ELF relocation */
							 | 
						||
| 
								 | 
							
								#ifdef ARCH_MM_MMU
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								struct rt_lwp;
							 | 
						||
| 
								 | 
							
								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);
							 | 
						||
| 
								 | 
							
								#else
							 | 
						||
| 
								 | 
							
								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);
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* User entry. enter user program code for the first time */
							 | 
						||
| 
								 | 
							
								void arch_crt_start_umode(void *args, const void *text, void *ustack, void *user_stack);
							 | 
						||
| 
								 | 
							
								void arch_start_umode(void *args, const void *text, void *ustack, void *k_stack);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* lwp create and setup */
							 | 
						||
| 
								 | 
							
								int arch_set_thread_context(void (*exit)(void), void *new_thread_stack,
							 | 
						||
| 
								 | 
							
								                            void *user_stack, void **thread_sp);
							 | 
						||
| 
								 | 
							
								void *arch_get_user_sp(void);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* user space setup and control */
							 | 
						||
| 
								 | 
							
								int arch_user_space_init(struct rt_lwp *lwp);
							 | 
						||
| 
								 | 
							
								void arch_user_space_free(struct rt_lwp *lwp);
							 | 
						||
| 
								 | 
							
								void *arch_kernel_mmu_table_get(void);
							 | 
						||
| 
								 | 
							
								void arch_kuser_init(rt_aspace_t aspace, void *vectors);
							 | 
						||
| 
								 | 
							
								int arch_expand_user_stack(void *addr);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/* thread id register */
							 | 
						||
| 
								 | 
							
								void arch_set_thread_area(void *p);
							 | 
						||
| 
								 | 
							
								void* arch_get_tidr(void);
							 | 
						||
| 
								 | 
							
								void arch_set_tidr(void *p);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/** entry point of architecture signal handling */
							 | 
						||
| 
								 | 
							
								rt_noreturn void arch_thread_signal_enter(int signo, siginfo_t *psiginfo,
							 | 
						||
| 
								 | 
							
								                                          void *exp_frame, void *entry_uaddr,
							 | 
						||
| 
								 | 
							
								                                          lwp_sigset_t *save_sig_mask);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void arch_signal_check_erestart(void *eframe, void *ksp);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void arch_syscall_set_errno(void *eframe, int expected, int code);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								int arch_backtrace_uthread(rt_thread_t thread);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#endif /* __LWP_ARCH_COMM__ */
							 |