mirror of
https://github.com/radareorg/radare2.git
synced 2025-02-21 06:40:33 +00:00

$ git grep ' $' | grep -v ^test/ | cut -d : -f 1 | sort -u > /tmp/trailing $ for a in `cat /tmp/trailing` ; do sed -i -e 's/ *$//' $a ; done
204 lines
5.5 KiB
C
204 lines
5.5 KiB
C
/*
|
|
* sfsyscall.h --- SFLib syscall macros for Linux/amd64
|
|
* see http://www.secdev.org/projects/shellforge.html for more informations
|
|
*
|
|
* Copyright (C) 2004 Philippe Biondi <phil@secdev.org>
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify it
|
|
* under the terms of the GNU Lesser General Public License as published by
|
|
* the Free Software Foundation.
|
|
*
|
|
* This program is distributed in the hope that it will be useful, but
|
|
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
* Lesser General Public License for more details.
|
|
*/
|
|
|
|
|
|
/*
|
|
* Automatically generated by gensflib.py
|
|
* Mon Nov 28 13:53:31 2011
|
|
*/
|
|
|
|
#ifndef SFSYSCALL_H
|
|
#define SFSYSCALL_H
|
|
|
|
|
|
/* $Id$ */
|
|
|
|
#ifdef SF_USE_ERRNO
|
|
|
|
static int errno=1234;
|
|
|
|
#define __sfsyscall_return(type, res) \
|
|
do { \
|
|
if ((unsigned long)(res) >= (unsigned long)(-125)) { \
|
|
errno = -(res); \
|
|
res = -1; \
|
|
} \
|
|
return (type) (res); \
|
|
} while (0)
|
|
|
|
#else /* SF_USE_ERRNO */
|
|
|
|
#define __sfsyscall_return(type, res) \
|
|
do { \
|
|
return (type) (res); \
|
|
} while (0)
|
|
|
|
#endif /* SF_USE_ERRNO */
|
|
|
|
|
|
/* syscall macros */
|
|
|
|
#define _sfsyscall0(type, name) \
|
|
type name(void) { \
|
|
long __res; \
|
|
__asm__ volatile("###> " #name " <###\n\t" \
|
|
"syscall" \
|
|
: "=a" (__res) \
|
|
: "0" (__NR_##name) \
|
|
: "memory", "rcx", "r11", "cc" \
|
|
); \
|
|
__sfsyscall_return(type,__res); \
|
|
}
|
|
|
|
#define _sfsyscall1(type, name, type1, arg1) \
|
|
type name(type1 arg1) { \
|
|
long __res; \
|
|
register type1 rdi asm("rdi"); \
|
|
rdi = arg1; \
|
|
asm volatile("###> " #name "(%2) <###\n\t" \
|
|
"syscall" \
|
|
: "=a" (__res) \
|
|
: "0" (__NR_##name), \
|
|
"r" (rdi) \
|
|
: "memory", "rcx", "r11", "cc" \
|
|
); \
|
|
__sfsyscall_return(type,__res); \
|
|
}
|
|
|
|
#define _sfsyscall2(type, name, type1, arg1, type2, arg2) \
|
|
type name(type1 arg1, type2 arg2) { \
|
|
long __res; \
|
|
register type1 rdi asm("rdi"); \
|
|
register type2 rsi asm("rsi"); \
|
|
rdi = arg1; \
|
|
rsi = arg2; \
|
|
__asm__ volatile("###> " #name "(%2, %3) <###\n\t" \
|
|
"syscall" \
|
|
: "=a" (__res) \
|
|
: "0" (__NR_##name), \
|
|
"r" (rdi), \
|
|
"r" (rsi) \
|
|
: "memory", "rcx", "r11", "cc" \
|
|
); \
|
|
__sfsyscall_return(type, __res); \
|
|
}
|
|
|
|
#define _sfsyscall3(type, name, type1, arg1, type2, arg2, type3, arg3) \
|
|
type name(type1 arg1, type2 arg2, type3 arg3) { \
|
|
long __res; \
|
|
register type1 rdi asm("rdi"); \
|
|
register type2 rsi asm("rsi"); \
|
|
register type3 rdx asm("rdx"); \
|
|
rdi = arg1; \
|
|
rsi = arg2; \
|
|
rdx = arg3; \
|
|
asm volatile("###> " #name "(%2, %3, %4) <###\n\t" \
|
|
"syscall" \
|
|
: "=a" (__res) \
|
|
: "0" (__NR_##name), \
|
|
"r" (rdi), \
|
|
"r" (rsi), \
|
|
"r" (rdx) \
|
|
: "memory", "rcx", "r11", "cc" \
|
|
); \
|
|
__sfsyscall_return(type, __res); \
|
|
}
|
|
|
|
#define _sfsyscall4(type, name, type1, arg1, type2, arg2, type3, arg3, type4, arg4) \
|
|
type name(type1 arg1, type2 arg2, type3 arg3, type4 arg4) { \
|
|
long __res; \
|
|
register type1 rdi asm("rdi"); \
|
|
register type2 rsi asm("rsi"); \
|
|
register type3 rdx asm("rdx"); \
|
|
register type4 r10 asm("r10"); \
|
|
rdi = arg1; \
|
|
rsi = arg2; \
|
|
rdx = arg3; \
|
|
r10 = arg4; \
|
|
asm volatile("###> " #name "(%2, %3, %4, %5) <###\n\t" \
|
|
"syscall" \
|
|
: "=a" (__res) \
|
|
: "0" (__NR_##name), \
|
|
"r" (rdi), \
|
|
"r" (rsi), \
|
|
"r" (rdx), \
|
|
"r" (r10) \
|
|
: "memory", "rcx", "r11", "cc" \
|
|
); \
|
|
__sfsyscall_return(type, __res); \
|
|
}
|
|
|
|
#define _sfsyscall5(type, name, type1, arg1, type2, arg2, type3, arg3, type4, arg4, type5, arg5) \
|
|
type name(type1 arg1, type2 arg2, type3 arg3, type4 arg4, \
|
|
type5 arg5) { \
|
|
long __res; \
|
|
register type1 rdi asm("rdi"); \
|
|
register type2 rsi asm("rsi"); \
|
|
register type3 rdx asm("rdx"); \
|
|
register type4 r10 asm("r10"); \
|
|
register type5 r8 asm("r8"); \
|
|
rdi = arg1; \
|
|
rsi = arg2; \
|
|
rdx = arg3; \
|
|
r10 = arg4; \
|
|
r8 = arg5; \
|
|
asm volatile("###> " #name "(%2, %3, %4, %5, %6) <###\n\t" \
|
|
"syscall" \
|
|
: "=a" (__res) \
|
|
: "0" (__NR_##name), \
|
|
"r" (rdi), \
|
|
"r" (rsi), \
|
|
"r" (rdx), \
|
|
"r" (r10), \
|
|
"r" (r8) \
|
|
: "memory", "rcx", "r11", "cc" \
|
|
); \
|
|
__sfsyscall_return(type, __res); \
|
|
}
|
|
|
|
#define _sfsyscall6(type, name, type1, arg1, type2, arg2, type3, arg3, type4, arg4, type5, arg5, type6, arg6)\
|
|
type name(type1 arg1, type2 arg2, type3 arg3, type4 arg4, \
|
|
type5 arg5, type6 arg6) { \
|
|
long __res; \
|
|
register type1 rdi asm("rdi"); \
|
|
register type2 rsi asm("rsi"); \
|
|
register type3 rdx asm("rdx"); \
|
|
register type4 r10 asm("r10"); \
|
|
register type5 r8 asm("r8"); \
|
|
register type6 r9 asm("r9"); \
|
|
rdi = arg1; \
|
|
rsi = arg2; \
|
|
rdx = arg3; \
|
|
r10 = arg4; \
|
|
r8 = arg5; \
|
|
r9 = arg6; \
|
|
asm volatile("###> " #name "(%2, %3, %4, %5, %6, %7) <###\n\t" \
|
|
"syscall" \
|
|
: "=a" (__res) \
|
|
: "0" (__NR_##name), \
|
|
"r" (rdi), \
|
|
"r" (rsi), \
|
|
"r" (rdx), \
|
|
"r" (r10), \
|
|
"r" (r8), \
|
|
"r" (r9) \
|
|
: "memory", "rcx", "r11", "cc" \
|
|
); \
|
|
__sfsyscall_return(type, __res); \
|
|
}
|
|
|
|
#endif /* SFSYSCALL_H */
|