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 <sysdep/ptrace_user.h> 10 #include <generated/asm-offsets.h> 11 12 #define STUB_MMAP_NR __NR_mmap 13 #define MMAP_OFFSET(o) (o) 14 15 #define __syscall_clobber "r11","rcx","memory" 16 #define __syscall "syscall" 17 18 static inline long stub_syscall0(long syscall) 19 { 20 long ret; 21 22 __asm__ volatile (__syscall 23 : "=a" (ret) 24 : "0" (syscall) : __syscall_clobber ); 25 26 return ret; 27 } 28 29 static inline long stub_syscall2(long syscall, long arg1, long arg2) 30 { 31 long ret; 32 33 __asm__ volatile (__syscall 34 : "=a" (ret) 35 : "0" (syscall), "D" (arg1), "S" (arg2) : __syscall_clobber ); 36 37 return ret; 38 } 39 40 static inline long stub_syscall3(long syscall, long arg1, long arg2, long arg3) 41 { 42 long ret; 43 44 __asm__ volatile (__syscall 45 : "=a" (ret) 46 : "0" (syscall), "D" (arg1), "S" (arg2), "d" (arg3) 47 : __syscall_clobber ); 48 49 return ret; 50 } 51 52 static inline long stub_syscall4(long syscall, long arg1, long arg2, long arg3, 53 long arg4) 54 { 55 long ret; 56 57 __asm__ volatile ("movq %5,%%r10 ; " __syscall 58 : "=a" (ret) 59 : "0" (syscall), "D" (arg1), "S" (arg2), "d" (arg3), 60 "g" (arg4) 61 : __syscall_clobber, "r10" ); 62 63 return ret; 64 } 65 66 static inline long stub_syscall5(long syscall, long arg1, long arg2, long arg3, 67 long arg4, long arg5) 68 { 69 long ret; 70 71 __asm__ volatile ("movq %5,%%r10 ; movq %6,%%r8 ; " __syscall 72 : "=a" (ret) 73 : "0" (syscall), "D" (arg1), "S" (arg2), "d" (arg3), 74 "g" (arg4), "g" (arg5) 75 : __syscall_clobber, "r10", "r8" ); 76 77 return ret; 78 } 79 80 static inline void trap_myself(void) 81 { 82 __asm("int3"); 83 } 84 85 static inline void remap_stack_and_trap(void) 86 { 87 __asm__ volatile ( 88 "movq %0,%%rax ;" 89 "movq %%rsp,%%rdi ;" 90 "andq %1,%%rdi ;" 91 "movq %2,%%r10 ;" 92 "movq %%rdi,%%r8 ; addq %3,%%r8 ; movq (%%r8),%%r8 ;" 93 "movq %%rdi,%%r9 ; addq %4,%%r9 ; movq (%%r9),%%r9 ;" 94 __syscall ";" 95 "movq %%rsp,%%rdi ; andq %1,%%rdi ;" 96 "addq %5,%%rdi ; movq %%rax, (%%rdi) ;" 97 "int3" 98 : : 99 "g" (STUB_MMAP_NR), 100 "g" (~(UM_KERN_PAGE_SIZE - 1)), 101 "g" (MAP_FIXED | MAP_SHARED), 102 "g" (UML_STUB_FIELD_FD), 103 "g" (UML_STUB_FIELD_OFFSET), 104 "g" (UML_STUB_FIELD_CHILD_ERR), 105 "S" (UM_KERN_PAGE_SIZE), 106 "d" (PROT_READ | PROT_WRITE) 107 : 108 __syscall_clobber, "r10", "r8", "r9"); 109 } 110 111 #endif 112