mirror of https://github.com/Qortal/Brooklyn
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
104 lines
2.1 KiB
104 lines
2.1 KiB
/* |
|
* Copyright (C) 2004 Jeff Dike ([email protected]) |
|
* Licensed under the GPL |
|
*/ |
|
|
|
#ifndef __SYSDEP_STUB_H |
|
#define __SYSDEP_STUB_H |
|
|
|
#include <asm/ptrace.h> |
|
#include <generated/asm-offsets.h> |
|
|
|
#define STUB_MMAP_NR __NR_mmap2 |
|
#define MMAP_OFFSET(o) ((o) >> UM_KERN_PAGE_SHIFT) |
|
|
|
static inline long stub_syscall0(long syscall) |
|
{ |
|
long ret; |
|
|
|
__asm__ volatile ("int $0x80" : "=a" (ret) : "0" (syscall)); |
|
|
|
return ret; |
|
} |
|
|
|
static inline long stub_syscall1(long syscall, long arg1) |
|
{ |
|
long ret; |
|
|
|
__asm__ volatile ("int $0x80" : "=a" (ret) : "0" (syscall), "b" (arg1)); |
|
|
|
return ret; |
|
} |
|
|
|
static inline long stub_syscall2(long syscall, long arg1, long arg2) |
|
{ |
|
long ret; |
|
|
|
__asm__ volatile ("int $0x80" : "=a" (ret) : "0" (syscall), "b" (arg1), |
|
"c" (arg2)); |
|
|
|
return ret; |
|
} |
|
|
|
static inline long stub_syscall3(long syscall, long arg1, long arg2, long arg3) |
|
{ |
|
long ret; |
|
|
|
__asm__ volatile ("int $0x80" : "=a" (ret) : "0" (syscall), "b" (arg1), |
|
"c" (arg2), "d" (arg3)); |
|
|
|
return ret; |
|
} |
|
|
|
static inline long stub_syscall4(long syscall, long arg1, long arg2, long arg3, |
|
long arg4) |
|
{ |
|
long ret; |
|
|
|
__asm__ volatile ("int $0x80" : "=a" (ret) : "0" (syscall), "b" (arg1), |
|
"c" (arg2), "d" (arg3), "S" (arg4)); |
|
|
|
return ret; |
|
} |
|
|
|
static inline long stub_syscall5(long syscall, long arg1, long arg2, long arg3, |
|
long arg4, long arg5) |
|
{ |
|
long ret; |
|
|
|
__asm__ volatile ("int $0x80" : "=a" (ret) : "0" (syscall), "b" (arg1), |
|
"c" (arg2), "d" (arg3), "S" (arg4), "D" (arg5)); |
|
|
|
return ret; |
|
} |
|
|
|
static inline void trap_myself(void) |
|
{ |
|
__asm("int3"); |
|
} |
|
|
|
static void inline remap_stack_and_trap(void) |
|
{ |
|
__asm__ volatile ( |
|
"movl %%esp,%%ebx ;" |
|
"andl %0,%%ebx ;" |
|
"movl %1,%%eax ;" |
|
"movl %%ebx,%%edi ; addl %2,%%edi ; movl (%%edi),%%edi ;" |
|
"movl %%ebx,%%ebp ; addl %3,%%ebp ; movl (%%ebp),%%ebp ;" |
|
"int $0x80 ;" |
|
"addl %4,%%ebx ; movl %%eax, (%%ebx) ;" |
|
"int $3" |
|
: : |
|
"g" (~(UM_KERN_PAGE_SIZE - 1)), |
|
"g" (STUB_MMAP_NR), |
|
"g" (UML_STUB_FIELD_FD), |
|
"g" (UML_STUB_FIELD_OFFSET), |
|
"g" (UML_STUB_FIELD_CHILD_ERR), |
|
"c" (UM_KERN_PAGE_SIZE), |
|
"d" (PROT_READ | PROT_WRITE), |
|
"S" (MAP_FIXED | MAP_SHARED) |
|
: |
|
"memory"); |
|
} |
|
|
|
#endif
|
|
|