Определить системный вызов в руке - PullRequest
0 голосов
/ 04 февраля 2020

в системном вызове x86 выглядит так:

0F 05                   syscall                 ; LINUX - sys_nanosleep
48 3D 01 F0 FF FF       cmp     rax, 0FFFFFFFFFFFFF001h

Как выглядит системный вызов в ассемблере Arm?

1 Ответ

1 голос
/ 04 февраля 2020

Исходный код для библиотеки musl lib c может помочь: все поддерживаемые архитектуры имеют небольшой заголовочный файл, реализующий 'syscalls'.

x86_64 :

static __inline long __syscall0(long n)
{
    unsigned long ret;
    __asm__ __volatile__ ("syscall" : "=a"(ret) : "a"(n) : "rcx", "r11", "memory");
    return ret;
}

Рука :

#ifdef __thumb__

/* Avoid use of r7 in asm constraints when producing thumb code,
 * since it's reserved as frame pointer and might not be supported. */
#define __ASM____R7__
#define __asm_syscall(...) do { \
    __asm__ __volatile__ ( "mov %1,r7 ; mov r7,%2 ; svc 0 ; mov r7,%1" \
    : "=r"(r0), "=&r"((int){0}) : __VA_ARGS__ : "memory"); \
    return r0; \
    } while (0)

#else

#define __ASM____R7__ __asm__("r7")
#define __asm_syscall(...) do { \
    __asm__ __volatile__ ( "svc 0" \
    : "=r"(r0) : __VA_ARGS__ : "memory"); \
    return r0; \
    } while (0)
#endif

Aarch64 :

#define __asm_syscall(...) do { \
    __asm__ __volatile__ ( "svc 0" \
    : "=r"(x0) : __VA_ARGS__ : "memory", "cc"); \
    return x0; \
    } while (0)

Пример сгенерированного кода:

/* syscall.c */
#define __asm_syscall(...) do { \
    __asm__ __volatile__ ( "svc 0" \
    : "=r"(x0) : __VA_ARGS__ : "memory", "cc"); \
    return x0; \
    } while (0)

static inline long __syscall0(long n)
{
    register long x8 __asm__("x8") = n;
    register long x0 __asm__("x0");
    __asm_syscall("r"(x8));
}

void test(void) {
    __syscall0(1);
}

/opt/arm/9/gcc-arm-9.2-2019.12-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu-objdump -D syscall.o
/opt/arm/9/gcc-arm-9.2-2019.12-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu-gcc -c -o syscall.o syscall.c                    

Disassembly of section .text:

0000000000000000 <__syscall0>:
   0:   d10043ff        sub     sp, sp, #0x10
   4:   f90007e0        str     x0, [sp, #8]
   8:   f94007e8        ldr     x8, [sp, #8]
   c:   d4000001        svc     #0x0
  10:   910043ff        add     sp, sp, #0x10
  14:   d65f03c0        ret

0000000000000018 <test>:
  18:   a9bf7bfd        stp     x29, x30, [sp, #-16]!
  1c:   910003fd        mov     x29, sp
  20:   d2800020        mov     x0, #0x1                        // #1
  24:   97fffff7        bl      0 <__syscall0>
  28:   d503201f        nop
  2c:   a8c17bfd        ldp     x29, x30, [sp], #16
  30:   d65f03c0        ret

При этом документацию по оружию нельзя назвать мусором, даже если вам было трудно найти именно ту информацию, которую вы искали: Раздел "Инструменты исследования" на их веб-сайте отлично ИМХО.

Псевдокод для инструкций SV C и их точное кодирование здесь и здесь , и вы даже можете смоделировать инструкции: Аластер Рейд написал пару интересных статей здесь относительно формальных спецификаций ISA.

...