|
7 | 7 | #define __SYSDEP_STUB_H |
8 | 8 |
|
9 | 9 | #include <sysdep/ptrace_user.h> |
| 10 | +#include <generated/asm-offsets.h> |
10 | 11 |
|
11 | | -#define STUB_SYSCALL_RET PT_INDEX(RAX) |
12 | 12 | #define STUB_MMAP_NR __NR_mmap |
13 | 13 | #define MMAP_OFFSET(o) (o) |
14 | 14 |
|
@@ -82,18 +82,30 @@ static inline void trap_myself(void) |
82 | 82 | __asm("int3"); |
83 | 83 | } |
84 | 84 |
|
85 | | -static inline void remap_stack(long fd, unsigned long offset) |
| 85 | +static inline void remap_stack_and_trap(void) |
86 | 86 | { |
87 | | - __asm__ volatile ("movq %4,%%r10 ; movq %5,%%r8 ; " |
88 | | - "movq %6, %%r9; " __syscall "; movq %7, %%rbx ; " |
89 | | - "movq %%rax, (%%rbx)": |
90 | | - : "a" (STUB_MMAP_NR), "D" (STUB_DATA), |
91 | | - "S" (UM_KERN_PAGE_SIZE), |
92 | | - "d" (PROT_READ | PROT_WRITE), |
93 | | - "g" (MAP_FIXED | MAP_SHARED), "g" (fd), |
94 | | - "g" (offset), |
95 | | - "i" (&((struct stub_data *) STUB_DATA)->child_err) |
96 | | - : __syscall_clobber, "r10", "r8", "r9" ); |
| 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"); |
97 | 109 | } |
98 | 110 |
|
99 | 111 | #endif |
0 commit comments