aboutsummaryrefslogtreecommitdiff
path: root/lib/darwin/manual-syscall.h
blob: b1bac7ea450d3c267b1c5f5b8694b9942c04a389 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#pragma once

#define GEN_SYSCALL(name, num) \
    __asm__(".globl _manual_" #name "\n" \
            ".pushsection __TEXT,__text,regular,pure_instructions\n" \
            "_manual_" #name ":\n" \
            ".set num, " #num "\n" \
            GEN_SYSCALL_INNER() \
            ".popsection\n")

#if defined(__x86_64__)
/* Look at me, I'm different! */
#define GEN_SYSCALL_INNER() \
    ".if num < 0\n" \
        "mov $(-num | 1 << 24), %eax\n" \
    ".else\n" \
        "mov $( num | 2 << 24), %eax\n" \
    ".endif\n" \
    "mov %rcx, %r10\n" \
    "syscall\n" \
    "ret\n"

#elif defined(__i386__)
#define GEN_SYSCALL_INNER() \
    "mov $num, %eax\n" \
    "pop %edx\n" \
    "mov %esp, %ecx\n" \
    "sysenter\n"
#elif defined(__arm__)
#define GEN_SYSCALL_INNER() \
    "mov r12, #num\n" \
    "svc #0x80\n" \
    "bx lr\n"
#elif defined(__arm64__)
#define GEN_SYSCALL_INNER() \
    "mov x12, #num\n" \
    "svc #0x80\n" \
    "ret\n"
#else
#error ?
#endif