llvm-project

Форк
0
/
sanitizer_syscall_linux_x86_64.inc 
90 строк · 3.1 Кб
1
//===-- sanitizer_syscall_linux_x86_64.inc ----------------------*- C++ -*-===//
2
//
3
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4
// See https://llvm.org/LICENSE.txt for license information.
5
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6
//
7
//===----------------------------------------------------------------------===//
8
//
9
// Implementations of internal_syscall and internal_iserror for Linux/x86_64.
10
//
11
//===----------------------------------------------------------------------===//
12

13
#define SYSCALL(name) __NR_ ## name
14

15
static uptr internal_syscall(u64 nr) {
16
  u64 retval;
17
  asm volatile("syscall" : "=a"(retval) : "a"(nr) : "rcx", "r11",
18
               "memory", "cc");
19
  return retval;
20
}
21

22
template <typename T1>
23
static uptr internal_syscall(u64 nr, T1 arg1) {
24
  u64 retval;
25
  asm volatile("syscall" : "=a"(retval) : "a"(nr), "D"((u64)arg1) :
26
               "rcx", "r11", "memory", "cc");
27
  return retval;
28
}
29

30
template <typename T1, typename T2>
31
static uptr internal_syscall(u64 nr, T1 arg1, T2 arg2) {
32
  u64 retval;
33
  asm volatile("syscall" : "=a"(retval) : "a"(nr), "D"((u64)arg1),
34
               "S"((u64)arg2) : "rcx", "r11", "memory", "cc");
35
  return retval;
36
}
37

38
template <typename T1, typename T2, typename T3>
39
static uptr internal_syscall(u64 nr, T1 arg1, T2 arg2, T3 arg3) {
40
  u64 retval;
41
  asm volatile("syscall" : "=a"(retval) : "a"(nr), "D"((u64)arg1),
42
               "S"((u64)arg2), "d"((u64)arg3) : "rcx", "r11", "memory", "cc");
43
  return retval;
44
}
45

46
template <typename T1, typename T2, typename T3, typename T4>
47
static uptr internal_syscall(u64 nr, T1 arg1, T2 arg2, T3 arg3, T4 arg4) {
48
  u64 retval;
49
  asm volatile("mov %5, %%r10;"
50
               "syscall" : "=a"(retval) : "a"(nr), "D"((u64)arg1),
51
               "S"((u64)arg2), "d"((u64)arg3), "r"((u64)arg4) :
52
               "rcx", "r11", "r10", "memory", "cc");
53
  return retval;
54
}
55

56
template <typename T1, typename T2, typename T3, typename T4, typename T5>
57
static uptr internal_syscall(u64 nr, T1 arg1, T2 arg2, T3 arg3, T4 arg4,
58
                             T5 arg5) {
59
  u64 retval;
60
  asm volatile("mov %5, %%r10;"
61
               "mov %6, %%r8;"
62
               "syscall" : "=a"(retval) : "a"(nr), "D"((u64)arg1),
63
               "S"((u64)arg2), "d"((u64)arg3), "r"((u64)arg4), "r"((u64)arg5) :
64
               "rcx", "r11", "r10", "r8", "memory", "cc");
65
  return retval;
66
}
67

68
template <typename T1, typename T2, typename T3, typename T4, typename T5,
69
          typename T6>
70
static uptr internal_syscall(u64 nr, T1 arg1, T2 arg2, T3 arg3, T4 arg4,
71
                             T5 arg5, T6 arg6) {
72
  u64 retval;
73
  asm volatile("mov %5, %%r10;"
74
               "mov %6, %%r8;"
75
               "mov %7, %%r9;"
76
               "syscall" : "=a"(retval) : "a"(nr), "D"((u64)arg1),
77
               "S"((u64)arg2), "d"((u64)arg3), "r"((u64)arg4), "r"((u64)arg5),
78
               "r"((u64)arg6) : "rcx", "r11", "r10", "r8", "r9",
79
               "memory", "cc");
80
  return retval;
81
}
82

83
bool internal_iserror(uptr retval, int *rverrno) {
84
  if (retval >= (uptr)-4095) {
85
    if (rverrno)
86
      *rverrno = -retval;
87
    return true;
88
  }
89
  return false;
90
}
91

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.