mirror of
				https://github.com/qemu/qemu.git
				synced 2025-10-31 12:07:31 +00:00 
			
		
		
		
	 1d9ac91baf
			
		
	
	
		1d9ac91baf
		
	
	
	
	
		
			
			The note test requires gcc 10 for -mbranch-protection=standard. The mmap test uses PROT_BTI and does not require special compiler support. Acked-by: Alex Bennée <alex.bennee@linaro.org> Reviewed-by: Peter Maydell <peter.maydell@linaro.org> Signed-off-by: Richard Henderson <richard.henderson@linaro.org> Message-id: 20201021173749.111103-13-richard.henderson@linaro.org Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
		
			
				
	
	
		
			52 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			52 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /*
 | |
|  * Minimal user-environment for testing BTI.
 | |
|  *
 | |
|  * Normal libc is not (yet) built with BTI support enabled,
 | |
|  * and so could generate a BTI TRAP before ever reaching main.
 | |
|  */
 | |
| 
 | |
| #include <stdlib.h>
 | |
| #include <signal.h>
 | |
| #include <ucontext.h>
 | |
| #include <asm/unistd.h>
 | |
| 
 | |
| int main(void);
 | |
| 
 | |
| void _start(void)
 | |
| {
 | |
|     exit(main());
 | |
| }
 | |
| 
 | |
| void exit(int ret)
 | |
| {
 | |
|     register int x0 __asm__("x0") = ret;
 | |
|     register int x8 __asm__("x8") = __NR_exit;
 | |
| 
 | |
|     asm volatile("svc #0" : : "r"(x0), "r"(x8));
 | |
|     __builtin_unreachable();
 | |
| }
 | |
| 
 | |
| /*
 | |
|  * Irritatingly, the user API struct sigaction does not match the
 | |
|  * kernel API struct sigaction.  So for simplicity, isolate the
 | |
|  * kernel ABI here, and make this act like signal.
 | |
|  */
 | |
| void signal_info(int sig, void (*fn)(int, siginfo_t *, ucontext_t *))
 | |
| {
 | |
|     struct kernel_sigaction {
 | |
|         void (*handler)(int, siginfo_t *, ucontext_t *);
 | |
|         unsigned long flags;
 | |
|         unsigned long restorer;
 | |
|         unsigned long mask;
 | |
|     } sa = { fn, SA_SIGINFO, 0, 0 };
 | |
| 
 | |
|     register int x0 __asm__("x0") = sig;
 | |
|     register void *x1 __asm__("x1") = &sa;
 | |
|     register void *x2 __asm__("x2") = 0;
 | |
|     register int x3 __asm__("x3") = sizeof(unsigned long);
 | |
|     register int x8 __asm__("x8") = __NR_rt_sigaction;
 | |
| 
 | |
|     asm volatile("svc #0"
 | |
|                  : : "r"(x0), "r"(x1), "r"(x2), "r"(x3), "r"(x8) : "memory");
 | |
| }
 |