FILE
stub_32.h
File preview with syntax highlighting.
linux-6.19.14/arch/x86/um/shared/sysdep/stub_32.h
1/* 2 * Copyright (C) 2004 Jeff Dike (jdike@addtoit.com) 3 * Licensed under the GPL 4 */ 5 6#ifndef __SYSDEP_STUB_H 7#define __SYSDEP_STUB_H 8 9#include <stddef.h> 10#include <asm/ptrace.h> 11#include <generated/asm-offsets.h> 12 13#define STUB_MMAP_NR __NR_mmap2 14#define MMAP_OFFSET(o) ((o) >> UM_KERN_PAGE_SHIFT) 15 16static __always_inline long stub_syscall0(long syscall) 17{ 18 long ret; 19 20 __asm__ volatile ("int $0x80" : "=a" (ret) : "0" (syscall) 21 : "memory"); 22 23 return ret; 24} 25 26static __always_inline long stub_syscall1(long syscall, long arg1) 27{ 28 long ret; 29 30 __asm__ volatile ("int $0x80" : "=a" (ret) : "0" (syscall), "b" (arg1) 31 : "memory"); 32 33 return ret; 34} 35 36static __always_inline long stub_syscall2(long syscall, long arg1, long arg2) 37{ 38 long ret; 39 40 __asm__ volatile ("int $0x80" : "=a" (ret) : "0" (syscall), "b" (arg1), 41 "c" (arg2) 42 : "memory"); 43 44 return ret; 45} 46 47static __always_inline long stub_syscall3(long syscall, long arg1, long arg2, 48 long arg3) 49{ 50 long ret; 51 52 __asm__ volatile ("int $0x80" : "=a" (ret) : "0" (syscall), "b" (arg1), 53 "c" (arg2), "d" (arg3) 54 : "memory"); 55 56 return ret; 57} 58 59static __always_inline long stub_syscall4(long syscall, long arg1, long arg2, 60 long arg3, long arg4) 61{ 62 long ret; 63 64 __asm__ volatile ("int $0x80" : "=a" (ret) : "0" (syscall), "b" (arg1), 65 "c" (arg2), "d" (arg3), "S" (arg4) 66 : "memory"); 67 68 return ret; 69} 70 71static __always_inline long stub_syscall5(long syscall, long arg1, long arg2, 72 long arg3, long arg4, long arg5) 73{ 74 long ret; 75 76 __asm__ volatile ("int $0x80" : "=a" (ret) : "0" (syscall), "b" (arg1), 77 "c" (arg2), "d" (arg3), "S" (arg4), "D" (arg5) 78 : "memory"); 79 80 return ret; 81} 82 83static __always_inline long stub_syscall6(long syscall, long arg1, long arg2, 84 long arg3, long arg4, long arg5, 85 long arg6) 86{ 87 struct syscall_args { 88 int ebx, ebp; 89 } args = { arg1, arg6 }; 90 long ret; 91 92 __asm__ volatile ("pushl %%ebp;" 93 "movl 0x4(%%ebx),%%ebp;" 94 "movl (%%ebx),%%ebx;" 95 "int $0x80;" 96 "popl %%ebp" 97 : "=a" (ret) 98 : "0" (syscall), "b" (&args), 99 "c" (arg2), "d" (arg3), "S" (arg4), "D" (arg5) 100 : "memory"); 101 102 return ret; 103} 104 105static __always_inline void trap_myself(void) 106{ 107 __asm("int3"); 108} 109 110static __always_inline void *get_stub_data(void) 111{ 112 unsigned long ret; 113 114 asm volatile ( 115 "call _here_%=;" 116 "_here_%=:" 117 "popl %0;" 118 "andl %1, %0 ;" 119 "addl %2, %0 ;" 120 : "=a" (ret) 121 : "g" (~(UM_KERN_PAGE_SIZE - 1)), 122 "g" (UM_KERN_PAGE_SIZE)); 123 124 return (void *)ret; 125} 126 127#define stub_start(fn) \ 128 asm volatile ( \ 129 "subl %0,%%esp ;" \ 130 "movl %1, %%eax ; " \ 131 "call *%%eax ;" \ 132 :: "i" (STUB_SIZE), \ 133 "i" (&fn)) 134 135static __always_inline void 136stub_seccomp_restore_state(struct stub_data_arch *arch) 137{ 138 for (int i = 0; i < sizeof(arch->tls) / sizeof(arch->tls[0]); i++) { 139 if (arch->sync & (1 << i)) 140 stub_syscall1(__NR_set_thread_area, 141 (unsigned long) &arch->tls[i]); 142 } 143 144 arch->sync = 0; 145} 146 147#endif
~/
Read-only file preview.