1*87e9c424SElvina Yakubova #ifndef LLVM_TOOLS_LLVM_BOLT_SYS_X86_64
2*87e9c424SElvina Yakubova #define LLVM_TOOLS_LLVM_BOLT_SYS_X86_64
3*87e9c424SElvina Yakubova
4*87e9c424SElvina Yakubova // Save all registers while keeping 16B stack alignment
5*87e9c424SElvina Yakubova #define SAVE_ALL \
6*87e9c424SElvina Yakubova "push %%rax\n" \
7*87e9c424SElvina Yakubova "push %%rbx\n" \
8*87e9c424SElvina Yakubova "push %%rcx\n" \
9*87e9c424SElvina Yakubova "push %%rdx\n" \
10*87e9c424SElvina Yakubova "push %%rdi\n" \
11*87e9c424SElvina Yakubova "push %%rsi\n" \
12*87e9c424SElvina Yakubova "push %%rbp\n" \
13*87e9c424SElvina Yakubova "push %%r8\n" \
14*87e9c424SElvina Yakubova "push %%r9\n" \
15*87e9c424SElvina Yakubova "push %%r10\n" \
16*87e9c424SElvina Yakubova "push %%r11\n" \
17*87e9c424SElvina Yakubova "push %%r12\n" \
18*87e9c424SElvina Yakubova "push %%r13\n" \
19*87e9c424SElvina Yakubova "push %%r14\n" \
20*87e9c424SElvina Yakubova "push %%r15\n" \
21*87e9c424SElvina Yakubova "sub $8, %%rsp\n"
22*87e9c424SElvina Yakubova // Mirrors SAVE_ALL
23*87e9c424SElvina Yakubova #define RESTORE_ALL \
24*87e9c424SElvina Yakubova "add $8, %%rsp\n" \
25*87e9c424SElvina Yakubova "pop %%r15\n" \
26*87e9c424SElvina Yakubova "pop %%r14\n" \
27*87e9c424SElvina Yakubova "pop %%r13\n" \
28*87e9c424SElvina Yakubova "pop %%r12\n" \
29*87e9c424SElvina Yakubova "pop %%r11\n" \
30*87e9c424SElvina Yakubova "pop %%r10\n" \
31*87e9c424SElvina Yakubova "pop %%r9\n" \
32*87e9c424SElvina Yakubova "pop %%r8\n" \
33*87e9c424SElvina Yakubova "pop %%rbp\n" \
34*87e9c424SElvina Yakubova "pop %%rsi\n" \
35*87e9c424SElvina Yakubova "pop %%rdi\n" \
36*87e9c424SElvina Yakubova "pop %%rdx\n" \
37*87e9c424SElvina Yakubova "pop %%rcx\n" \
38*87e9c424SElvina Yakubova "pop %%rbx\n" \
39*87e9c424SElvina Yakubova "pop %%rax\n"
40*87e9c424SElvina Yakubova
41*87e9c424SElvina Yakubova namespace {
42*87e9c424SElvina Yakubova
43*87e9c424SElvina Yakubova // Get the difference between runtime addrress of .text section and
44*87e9c424SElvina Yakubova // static address in section header table. Can be extracted from arbitrary
45*87e9c424SElvina Yakubova // pc value recorded at runtime to get the corresponding static address, which
46*87e9c424SElvina Yakubova // in turn can be used to search for indirect call description. Needed because
47*87e9c424SElvina Yakubova // indirect call descriptions are read-only non-relocatable data.
getTextBaseAddress()48*87e9c424SElvina Yakubova uint64_t getTextBaseAddress() {
49*87e9c424SElvina Yakubova uint64_t DynAddr;
50*87e9c424SElvina Yakubova uint64_t StaticAddr;
51*87e9c424SElvina Yakubova __asm__ volatile("leaq __hot_end(%%rip), %0\n\t"
52*87e9c424SElvina Yakubova "movabsq $__hot_end, %1\n\t"
53*87e9c424SElvina Yakubova : "=r"(DynAddr), "=r"(StaticAddr));
54*87e9c424SElvina Yakubova return DynAddr - StaticAddr;
55*87e9c424SElvina Yakubova }
56*87e9c424SElvina Yakubova
57*87e9c424SElvina Yakubova #define _STRINGIFY(x) #x
58*87e9c424SElvina Yakubova #define STRINGIFY(x) _STRINGIFY(x)
59*87e9c424SElvina Yakubova
__read(uint64_t fd,const void * buf,uint64_t count)60*87e9c424SElvina Yakubova uint64_t __read(uint64_t fd, const void *buf, uint64_t count) {
61*87e9c424SElvina Yakubova uint64_t ret;
62*87e9c424SElvina Yakubova #if defined(__APPLE__)
63*87e9c424SElvina Yakubova #define READ_SYSCALL 0x2000003
64*87e9c424SElvina Yakubova #else
65*87e9c424SElvina Yakubova #define READ_SYSCALL 0
66*87e9c424SElvina Yakubova #endif
67*87e9c424SElvina Yakubova __asm__ __volatile__("movq $" STRINGIFY(READ_SYSCALL) ", %%rax\n"
68*87e9c424SElvina Yakubova "syscall\n"
69*87e9c424SElvina Yakubova : "=a"(ret)
70*87e9c424SElvina Yakubova : "D"(fd), "S"(buf), "d"(count)
71*87e9c424SElvina Yakubova : "cc", "rcx", "r11", "memory");
72*87e9c424SElvina Yakubova return ret;
73*87e9c424SElvina Yakubova }
74*87e9c424SElvina Yakubova
__write(uint64_t fd,const void * buf,uint64_t count)75*87e9c424SElvina Yakubova uint64_t __write(uint64_t fd, const void *buf, uint64_t count) {
76*87e9c424SElvina Yakubova uint64_t ret;
77*87e9c424SElvina Yakubova #if defined(__APPLE__)
78*87e9c424SElvina Yakubova #define WRITE_SYSCALL 0x2000004
79*87e9c424SElvina Yakubova #else
80*87e9c424SElvina Yakubova #define WRITE_SYSCALL 1
81*87e9c424SElvina Yakubova #endif
82*87e9c424SElvina Yakubova __asm__ __volatile__("movq $" STRINGIFY(WRITE_SYSCALL) ", %%rax\n"
83*87e9c424SElvina Yakubova "syscall\n"
84*87e9c424SElvina Yakubova : "=a"(ret)
85*87e9c424SElvina Yakubova : "D"(fd), "S"(buf), "d"(count)
86*87e9c424SElvina Yakubova : "cc", "rcx", "r11", "memory");
87*87e9c424SElvina Yakubova return ret;
88*87e9c424SElvina Yakubova }
89*87e9c424SElvina Yakubova
__mmap(uint64_t addr,uint64_t size,uint64_t prot,uint64_t flags,uint64_t fd,uint64_t offset)90*87e9c424SElvina Yakubova void *__mmap(uint64_t addr, uint64_t size, uint64_t prot, uint64_t flags,
91*87e9c424SElvina Yakubova uint64_t fd, uint64_t offset) {
92*87e9c424SElvina Yakubova #if defined(__APPLE__)
93*87e9c424SElvina Yakubova #define MMAP_SYSCALL 0x20000c5
94*87e9c424SElvina Yakubova #else
95*87e9c424SElvina Yakubova #define MMAP_SYSCALL 9
96*87e9c424SElvina Yakubova #endif
97*87e9c424SElvina Yakubova void *ret;
98*87e9c424SElvina Yakubova register uint64_t r8 asm("r8") = fd;
99*87e9c424SElvina Yakubova register uint64_t r9 asm("r9") = offset;
100*87e9c424SElvina Yakubova register uint64_t r10 asm("r10") = flags;
101*87e9c424SElvina Yakubova __asm__ __volatile__("movq $" STRINGIFY(MMAP_SYSCALL) ", %%rax\n"
102*87e9c424SElvina Yakubova "syscall\n"
103*87e9c424SElvina Yakubova : "=a"(ret)
104*87e9c424SElvina Yakubova : "D"(addr), "S"(size), "d"(prot), "r"(r10), "r"(r8),
105*87e9c424SElvina Yakubova "r"(r9)
106*87e9c424SElvina Yakubova : "cc", "rcx", "r11", "memory");
107*87e9c424SElvina Yakubova return ret;
108*87e9c424SElvina Yakubova }
109*87e9c424SElvina Yakubova
__munmap(void * addr,uint64_t size)110*87e9c424SElvina Yakubova uint64_t __munmap(void *addr, uint64_t size) {
111*87e9c424SElvina Yakubova #if defined(__APPLE__)
112*87e9c424SElvina Yakubova #define MUNMAP_SYSCALL 0x2000049
113*87e9c424SElvina Yakubova #else
114*87e9c424SElvina Yakubova #define MUNMAP_SYSCALL 11
115*87e9c424SElvina Yakubova #endif
116*87e9c424SElvina Yakubova uint64_t ret;
117*87e9c424SElvina Yakubova __asm__ __volatile__("movq $" STRINGIFY(MUNMAP_SYSCALL) ", %%rax\n"
118*87e9c424SElvina Yakubova "syscall\n"
119*87e9c424SElvina Yakubova : "=a"(ret)
120*87e9c424SElvina Yakubova : "D"(addr), "S"(size)
121*87e9c424SElvina Yakubova : "cc", "rcx", "r11", "memory");
122*87e9c424SElvina Yakubova return ret;
123*87e9c424SElvina Yakubova }
124*87e9c424SElvina Yakubova
__sigprocmask(int how,const void * set,void * oldset)125*87e9c424SElvina Yakubova uint64_t __sigprocmask(int how, const void *set, void *oldset) {
126*87e9c424SElvina Yakubova #if defined(__APPLE__)
127*87e9c424SElvina Yakubova #define SIGPROCMASK_SYSCALL 0x2000030
128*87e9c424SElvina Yakubova #else
129*87e9c424SElvina Yakubova #define SIGPROCMASK_SYSCALL 14
130*87e9c424SElvina Yakubova #endif
131*87e9c424SElvina Yakubova uint64_t ret;
132*87e9c424SElvina Yakubova register long r10 asm("r10") = sizeof(uint64_t);
133*87e9c424SElvina Yakubova __asm__ __volatile__("movq $" STRINGIFY(SIGPROCMASK_SYSCALL) ", %%rax\n"
134*87e9c424SElvina Yakubova "syscall\n"
135*87e9c424SElvina Yakubova : "=a"(ret)
136*87e9c424SElvina Yakubova : "D"(how), "S"(set), "d"(oldset), "r"(r10)
137*87e9c424SElvina Yakubova : "cc", "rcx", "r11", "memory");
138*87e9c424SElvina Yakubova return ret;
139*87e9c424SElvina Yakubova }
140*87e9c424SElvina Yakubova
__getpid()141*87e9c424SElvina Yakubova uint64_t __getpid() {
142*87e9c424SElvina Yakubova uint64_t ret;
143*87e9c424SElvina Yakubova #if defined(__APPLE__)
144*87e9c424SElvina Yakubova #define GETPID_SYSCALL 20
145*87e9c424SElvina Yakubova #else
146*87e9c424SElvina Yakubova #define GETPID_SYSCALL 39
147*87e9c424SElvina Yakubova #endif
148*87e9c424SElvina Yakubova __asm__ __volatile__("movq $" STRINGIFY(GETPID_SYSCALL) ", %%rax\n"
149*87e9c424SElvina Yakubova "syscall\n"
150*87e9c424SElvina Yakubova : "=a"(ret)
151*87e9c424SElvina Yakubova :
152*87e9c424SElvina Yakubova : "cc", "rcx", "r11", "memory");
153*87e9c424SElvina Yakubova return ret;
154*87e9c424SElvina Yakubova }
155*87e9c424SElvina Yakubova
__exit(uint64_t code)156*87e9c424SElvina Yakubova uint64_t __exit(uint64_t code) {
157*87e9c424SElvina Yakubova #if defined(__APPLE__)
158*87e9c424SElvina Yakubova #define EXIT_SYSCALL 0x2000001
159*87e9c424SElvina Yakubova #else
160*87e9c424SElvina Yakubova #define EXIT_SYSCALL 231
161*87e9c424SElvina Yakubova #endif
162*87e9c424SElvina Yakubova uint64_t ret;
163*87e9c424SElvina Yakubova __asm__ __volatile__("movq $" STRINGIFY(EXIT_SYSCALL) ", %%rax\n"
164*87e9c424SElvina Yakubova "syscall\n"
165*87e9c424SElvina Yakubova : "=a"(ret)
166*87e9c424SElvina Yakubova : "D"(code)
167*87e9c424SElvina Yakubova : "cc", "rcx", "r11", "memory");
168*87e9c424SElvina Yakubova return ret;
169*87e9c424SElvina Yakubova }
170*87e9c424SElvina Yakubova
171*87e9c424SElvina Yakubova #if !defined(__APPLE__)
172*87e9c424SElvina Yakubova // We use a stack-allocated buffer for string manipulation in many pieces of
173*87e9c424SElvina Yakubova // this code, including the code that prints each line of the fdata file. This
174*87e9c424SElvina Yakubova // buffer needs to accomodate large function names, but shouldn't be arbitrarily
175*87e9c424SElvina Yakubova // large (dynamically allocated) for simplicity of our memory space usage.
176*87e9c424SElvina Yakubova
177*87e9c424SElvina Yakubova // Declare some syscall wrappers we use throughout this code to avoid linking
178*87e9c424SElvina Yakubova // against system libc.
__open(const char * pathname,uint64_t flags,uint64_t mode)179*87e9c424SElvina Yakubova uint64_t __open(const char *pathname, uint64_t flags, uint64_t mode) {
180*87e9c424SElvina Yakubova uint64_t ret;
181*87e9c424SElvina Yakubova __asm__ __volatile__("movq $2, %%rax\n"
182*87e9c424SElvina Yakubova "syscall"
183*87e9c424SElvina Yakubova : "=a"(ret)
184*87e9c424SElvina Yakubova : "D"(pathname), "S"(flags), "d"(mode)
185*87e9c424SElvina Yakubova : "cc", "rcx", "r11", "memory");
186*87e9c424SElvina Yakubova return ret;
187*87e9c424SElvina Yakubova }
188*87e9c424SElvina Yakubova
__getdents64(unsigned int fd,dirent64 * dirp,size_t count)189*87e9c424SElvina Yakubova long __getdents64(unsigned int fd, dirent64 *dirp, size_t count) {
190*87e9c424SElvina Yakubova long ret;
191*87e9c424SElvina Yakubova __asm__ __volatile__("movq $217, %%rax\n"
192*87e9c424SElvina Yakubova "syscall"
193*87e9c424SElvina Yakubova : "=a"(ret)
194*87e9c424SElvina Yakubova : "D"(fd), "S"(dirp), "d"(count)
195*87e9c424SElvina Yakubova : "cc", "rcx", "r11", "memory");
196*87e9c424SElvina Yakubova return ret;
197*87e9c424SElvina Yakubova }
198*87e9c424SElvina Yakubova
__readlink(const char * pathname,char * buf,size_t bufsize)199*87e9c424SElvina Yakubova uint64_t __readlink(const char *pathname, char *buf, size_t bufsize) {
200*87e9c424SElvina Yakubova uint64_t ret;
201*87e9c424SElvina Yakubova __asm__ __volatile__("movq $89, %%rax\n"
202*87e9c424SElvina Yakubova "syscall"
203*87e9c424SElvina Yakubova : "=a"(ret)
204*87e9c424SElvina Yakubova : "D"(pathname), "S"(buf), "d"(bufsize)
205*87e9c424SElvina Yakubova : "cc", "rcx", "r11", "memory");
206*87e9c424SElvina Yakubova return ret;
207*87e9c424SElvina Yakubova }
208*87e9c424SElvina Yakubova
__lseek(uint64_t fd,uint64_t pos,uint64_t whence)209*87e9c424SElvina Yakubova uint64_t __lseek(uint64_t fd, uint64_t pos, uint64_t whence) {
210*87e9c424SElvina Yakubova uint64_t ret;
211*87e9c424SElvina Yakubova __asm__ __volatile__("movq $8, %%rax\n"
212*87e9c424SElvina Yakubova "syscall\n"
213*87e9c424SElvina Yakubova : "=a"(ret)
214*87e9c424SElvina Yakubova : "D"(fd), "S"(pos), "d"(whence)
215*87e9c424SElvina Yakubova : "cc", "rcx", "r11", "memory");
216*87e9c424SElvina Yakubova return ret;
217*87e9c424SElvina Yakubova }
218*87e9c424SElvina Yakubova
__ftruncate(uint64_t fd,uint64_t length)219*87e9c424SElvina Yakubova int __ftruncate(uint64_t fd, uint64_t length) {
220*87e9c424SElvina Yakubova int ret;
221*87e9c424SElvina Yakubova __asm__ __volatile__("movq $77, %%rax\n"
222*87e9c424SElvina Yakubova "syscall\n"
223*87e9c424SElvina Yakubova : "=a"(ret)
224*87e9c424SElvina Yakubova : "D"(fd), "S"(length)
225*87e9c424SElvina Yakubova : "cc", "rcx", "r11", "memory");
226*87e9c424SElvina Yakubova return ret;
227*87e9c424SElvina Yakubova }
228*87e9c424SElvina Yakubova
__close(uint64_t fd)229*87e9c424SElvina Yakubova int __close(uint64_t fd) {
230*87e9c424SElvina Yakubova uint64_t ret;
231*87e9c424SElvina Yakubova __asm__ __volatile__("movq $3, %%rax\n"
232*87e9c424SElvina Yakubova "syscall\n"
233*87e9c424SElvina Yakubova : "=a"(ret)
234*87e9c424SElvina Yakubova : "D"(fd)
235*87e9c424SElvina Yakubova : "cc", "rcx", "r11", "memory");
236*87e9c424SElvina Yakubova return ret;
237*87e9c424SElvina Yakubova }
238*87e9c424SElvina Yakubova
__madvise(void * addr,size_t length,int advice)239*87e9c424SElvina Yakubova int __madvise(void *addr, size_t length, int advice) {
240*87e9c424SElvina Yakubova int ret;
241*87e9c424SElvina Yakubova __asm__ __volatile__("movq $28, %%rax\n"
242*87e9c424SElvina Yakubova "syscall\n"
243*87e9c424SElvina Yakubova : "=a"(ret)
244*87e9c424SElvina Yakubova : "D"(addr), "S"(length), "d"(advice)
245*87e9c424SElvina Yakubova : "cc", "rcx", "r11", "memory");
246*87e9c424SElvina Yakubova return ret;
247*87e9c424SElvina Yakubova }
248*87e9c424SElvina Yakubova
__uname(struct UtsNameTy * Buf)249*87e9c424SElvina Yakubova int __uname(struct UtsNameTy *Buf) {
250*87e9c424SElvina Yakubova int Ret;
251*87e9c424SElvina Yakubova __asm__ __volatile__("movq $63, %%rax\n"
252*87e9c424SElvina Yakubova "syscall\n"
253*87e9c424SElvina Yakubova : "=a"(Ret)
254*87e9c424SElvina Yakubova : "D"(Buf)
255*87e9c424SElvina Yakubova : "cc", "rcx", "r11", "memory");
256*87e9c424SElvina Yakubova return Ret;
257*87e9c424SElvina Yakubova }
258*87e9c424SElvina Yakubova
__nanosleep(const timespec * req,timespec * rem)259*87e9c424SElvina Yakubova uint64_t __nanosleep(const timespec *req, timespec *rem) {
260*87e9c424SElvina Yakubova uint64_t ret;
261*87e9c424SElvina Yakubova __asm__ __volatile__("movq $35, %%rax\n"
262*87e9c424SElvina Yakubova "syscall\n"
263*87e9c424SElvina Yakubova : "=a"(ret)
264*87e9c424SElvina Yakubova : "D"(req), "S"(rem)
265*87e9c424SElvina Yakubova : "cc", "rcx", "r11", "memory");
266*87e9c424SElvina Yakubova return ret;
267*87e9c424SElvina Yakubova }
268*87e9c424SElvina Yakubova
__fork()269*87e9c424SElvina Yakubova int64_t __fork() {
270*87e9c424SElvina Yakubova uint64_t ret;
271*87e9c424SElvina Yakubova __asm__ __volatile__("movq $57, %%rax\n"
272*87e9c424SElvina Yakubova "syscall\n"
273*87e9c424SElvina Yakubova : "=a"(ret)
274*87e9c424SElvina Yakubova :
275*87e9c424SElvina Yakubova : "cc", "rcx", "r11", "memory");
276*87e9c424SElvina Yakubova return ret;
277*87e9c424SElvina Yakubova }
278*87e9c424SElvina Yakubova
__mprotect(void * addr,size_t len,int prot)279*87e9c424SElvina Yakubova int __mprotect(void *addr, size_t len, int prot) {
280*87e9c424SElvina Yakubova int ret;
281*87e9c424SElvina Yakubova __asm__ __volatile__("movq $10, %%rax\n"
282*87e9c424SElvina Yakubova "syscall\n"
283*87e9c424SElvina Yakubova : "=a"(ret)
284*87e9c424SElvina Yakubova : "D"(addr), "S"(len), "d"(prot)
285*87e9c424SElvina Yakubova : "cc", "rcx", "r11", "memory");
286*87e9c424SElvina Yakubova return ret;
287*87e9c424SElvina Yakubova }
288*87e9c424SElvina Yakubova
__getppid()289*87e9c424SElvina Yakubova uint64_t __getppid() {
290*87e9c424SElvina Yakubova uint64_t ret;
291*87e9c424SElvina Yakubova __asm__ __volatile__("movq $110, %%rax\n"
292*87e9c424SElvina Yakubova "syscall\n"
293*87e9c424SElvina Yakubova : "=a"(ret)
294*87e9c424SElvina Yakubova :
295*87e9c424SElvina Yakubova : "cc", "rcx", "r11", "memory");
296*87e9c424SElvina Yakubova return ret;
297*87e9c424SElvina Yakubova }
298*87e9c424SElvina Yakubova
__setpgid(uint64_t pid,uint64_t pgid)299*87e9c424SElvina Yakubova int __setpgid(uint64_t pid, uint64_t pgid) {
300*87e9c424SElvina Yakubova int ret;
301*87e9c424SElvina Yakubova __asm__ __volatile__("movq $109, %%rax\n"
302*87e9c424SElvina Yakubova "syscall\n"
303*87e9c424SElvina Yakubova : "=a"(ret)
304*87e9c424SElvina Yakubova : "D"(pid), "S"(pgid)
305*87e9c424SElvina Yakubova : "cc", "rcx", "r11", "memory");
306*87e9c424SElvina Yakubova return ret;
307*87e9c424SElvina Yakubova }
308*87e9c424SElvina Yakubova
__getpgid(uint64_t pid)309*87e9c424SElvina Yakubova uint64_t __getpgid(uint64_t pid) {
310*87e9c424SElvina Yakubova uint64_t ret;
311*87e9c424SElvina Yakubova __asm__ __volatile__("movq $121, %%rax\n"
312*87e9c424SElvina Yakubova "syscall\n"
313*87e9c424SElvina Yakubova : "=a"(ret)
314*87e9c424SElvina Yakubova : "D"(pid)
315*87e9c424SElvina Yakubova : "cc", "rcx", "r11", "memory");
316*87e9c424SElvina Yakubova return ret;
317*87e9c424SElvina Yakubova }
318*87e9c424SElvina Yakubova
__kill(uint64_t pid,int sig)319*87e9c424SElvina Yakubova int __kill(uint64_t pid, int sig) {
320*87e9c424SElvina Yakubova int ret;
321*87e9c424SElvina Yakubova __asm__ __volatile__("movq $62, %%rax\n"
322*87e9c424SElvina Yakubova "syscall\n"
323*87e9c424SElvina Yakubova : "=a"(ret)
324*87e9c424SElvina Yakubova : "D"(pid), "S"(sig)
325*87e9c424SElvina Yakubova : "cc", "rcx", "r11", "memory");
326*87e9c424SElvina Yakubova return ret;
327*87e9c424SElvina Yakubova }
328*87e9c424SElvina Yakubova
__fsync(int fd)329*87e9c424SElvina Yakubova int __fsync(int fd) {
330*87e9c424SElvina Yakubova int ret;
331*87e9c424SElvina Yakubova __asm__ __volatile__("movq $74, %%rax\n"
332*87e9c424SElvina Yakubova "syscall\n"
333*87e9c424SElvina Yakubova : "=a"(ret)
334*87e9c424SElvina Yakubova : "D"(fd)
335*87e9c424SElvina Yakubova : "cc", "rcx", "r11", "memory");
336*87e9c424SElvina Yakubova return ret;
337*87e9c424SElvina Yakubova }
338*87e9c424SElvina Yakubova
339*87e9c424SElvina Yakubova // %rdi %rsi %rdx %r10 %r8
340*87e9c424SElvina Yakubova // sys_prctl int option unsigned unsigned unsigned unsigned
341*87e9c424SElvina Yakubova // long arg2 long arg3 long arg4 long arg5
__prctl(int Option,unsigned long Arg2,unsigned long Arg3,unsigned long Arg4,unsigned long Arg5)342*87e9c424SElvina Yakubova int __prctl(int Option, unsigned long Arg2, unsigned long Arg3,
343*87e9c424SElvina Yakubova unsigned long Arg4, unsigned long Arg5) {
344*87e9c424SElvina Yakubova int Ret;
345*87e9c424SElvina Yakubova register long rdx asm("rdx") = Arg3;
346*87e9c424SElvina Yakubova register long r8 asm("r8") = Arg5;
347*87e9c424SElvina Yakubova register long r10 asm("r10") = Arg4;
348*87e9c424SElvina Yakubova __asm__ __volatile__("movq $157, %%rax\n"
349*87e9c424SElvina Yakubova "syscall\n"
350*87e9c424SElvina Yakubova : "=a"(Ret)
351*87e9c424SElvina Yakubova : "D"(Option), "S"(Arg2), "d"(rdx), "r"(r10), "r"(r8)
352*87e9c424SElvina Yakubova :);
353*87e9c424SElvina Yakubova return Ret;
354*87e9c424SElvina Yakubova }
355*87e9c424SElvina Yakubova
356*87e9c424SElvina Yakubova #endif
357*87e9c424SElvina Yakubova
358*87e9c424SElvina Yakubova } // anonymous namespace
359*87e9c424SElvina Yakubova
360*87e9c424SElvina Yakubova #endif
361