Iros
 
Loading...
Searching...
No Matches
system_call.h
Go to the documentation of this file.
1#pragma once
2
3#include <iris/uapi/syscall.h>
4
5#include "di/util/prelude.h"
6#include "dius/config.h"
7#include "dius/error.h"
8
9#include DIUS_ARCH_PLATFORM_PATH(system_call.h)
10
11namespace dius::system {
13
14using SystemCallArg = unsigned long;
15using SystemCallResult = unsigned long;
16using SystemCallError = unsigned long;
17
25
26template<detail::SystemCallResult R>
39
40template<detail::SystemCallResult R, detail::SystemCallArgument T1>
44 auto y1 = SystemCallArg(a1);
45 register SystemCallArg x1 asm(DIUS_SYSTEM_CALL_ASM_ARG1) = y1;
48 : DIUS_SYSTEM_CALL_ASM_NUMBER(res), "r"(x1)
50 if (err) {
51 return di::Unexpected(di::BasicError(err));
52 }
53 return R(res);
54}
55
56template<detail::SystemCallResult R, detail::SystemCallArgument T1, detail::SystemCallArgument T2>
57auto system_call(Number number, T1&& a1, T2&& a2) -> di::Expected<R, di::BasicError> {
60 auto y1 = SystemCallArg(a1);
61 auto y2 = SystemCallArg(a2);
62 register SystemCallArg x1 asm(DIUS_SYSTEM_CALL_ASM_ARG1) = y1;
63 register SystemCallArg x2 asm(DIUS_SYSTEM_CALL_ASM_ARG2) = y2;
66 : DIUS_SYSTEM_CALL_ASM_NUMBER(res), "r"(x1), "r"(x2)
68 if (err) {
69 return di::Unexpected(di::BasicError(err));
70 }
71 return R(res);
72}
73
74template<detail::SystemCallResult R, detail::SystemCallArgument T1, detail::SystemCallArgument T2,
75 detail::SystemCallArgument T3>
76auto system_call(Number number, T1&& a1, T2&& a2, T3&& a3) -> di::Expected<R, di::BasicError> {
79 auto y1 = SystemCallArg(a1);
80 auto y2 = SystemCallArg(a2);
81 auto y3 = SystemCallArg(a3);
82 register SystemCallArg x1 asm(DIUS_SYSTEM_CALL_ASM_ARG1) = y1;
83 register SystemCallArg x2 asm(DIUS_SYSTEM_CALL_ASM_ARG2) = y2;
84 register SystemCallArg x3 asm(DIUS_SYSTEM_CALL_ASM_ARG3) = y3;
87 : DIUS_SYSTEM_CALL_ASM_NUMBER(res), "r"(x1), "r"(x2), "r"(x3)
89 if (err) {
90 return di::Unexpected(di::BasicError(err));
91 }
92 return R(res);
93}
94
95template<detail::SystemCallResult R, detail::SystemCallArgument T1, detail::SystemCallArgument T2,
96 detail::SystemCallArgument T3, detail::SystemCallArgument T4>
97auto system_call(Number number, T1&& a1, T2&& a2, T3&& a3, T4&& a4) -> di::Expected<R, di::BasicError> {
100 auto y1 = SystemCallArg(a1);
101 auto y2 = SystemCallArg(a2);
102 auto y3 = SystemCallArg(a3);
103 auto y4 = SystemCallArg(a4);
104 register SystemCallArg x1 asm(DIUS_SYSTEM_CALL_ASM_ARG1) = y1;
105 register SystemCallArg x2 asm(DIUS_SYSTEM_CALL_ASM_ARG2) = y2;
106 register SystemCallArg x3 asm(DIUS_SYSTEM_CALL_ASM_ARG3) = y3;
107 register SystemCallArg x4 asm(DIUS_SYSTEM_CALL_ASM_ARG4) = y4;
110 : DIUS_SYSTEM_CALL_ASM_NUMBER(res), "r"(x1), "r"(x2), "r"(x3), "r"(x4)
112 if (err) {
113 return di::Unexpected(di::BasicError(err));
114 }
115 return R(res);
116}
117
118template<detail::SystemCallResult R, detail::SystemCallArgument T1, detail::SystemCallArgument T2,
119 detail::SystemCallArgument T3, detail::SystemCallArgument T4, detail::SystemCallArgument T5>
120auto system_call(Number number, T1&& a1, T2&& a2, T3&& a3, T4&& a4, T5&& a5) -> di::Expected<R, di::BasicError> {
123 auto y1 = SystemCallArg(a1);
124 auto y2 = SystemCallArg(a2);
125 auto y3 = SystemCallArg(a3);
126 auto y4 = SystemCallArg(a4);
127 auto y5 = SystemCallArg(a5);
128 register SystemCallArg x1 asm(DIUS_SYSTEM_CALL_ASM_ARG1) = y1;
129 register SystemCallArg x2 asm(DIUS_SYSTEM_CALL_ASM_ARG2) = y2;
130 register SystemCallArg x3 asm(DIUS_SYSTEM_CALL_ASM_ARG3) = y3;
131 register SystemCallArg x4 asm(DIUS_SYSTEM_CALL_ASM_ARG4) = y4;
132 register SystemCallArg x5 asm(DIUS_SYSTEM_CALL_ASM_ARG5) = y5;
135 : DIUS_SYSTEM_CALL_ASM_NUMBER(res), "r"(x1), "r"(x2), "r"(x3), "r"(x4), "r"(x5)
137 if (err) {
138 return di::Unexpected(di::BasicError(err));
139 }
140 return R(res);
141}
142
143template<detail::SystemCallResult R, detail::SystemCallArgument T1, detail::SystemCallArgument T2,
144 detail::SystemCallArgument T3, detail::SystemCallArgument T4, detail::SystemCallArgument T5,
145 detail::SystemCallArgument T6>
146auto system_call(Number number, T1&& a1, T2&& a2, T3&& a3, T4&& a4, T5&& a5, T6&& a6)
156 register SystemCallArg x1 asm(DIUS_SYSTEM_CALL_ASM_ARG1) = y1;
157 register SystemCallArg x2 asm(DIUS_SYSTEM_CALL_ASM_ARG2) = y2;
158 register SystemCallArg x3 asm(DIUS_SYSTEM_CALL_ASM_ARG3) = y3;
159 register SystemCallArg x4 asm(DIUS_SYSTEM_CALL_ASM_ARG4) = y4;
160 register SystemCallArg x5 asm(DIUS_SYSTEM_CALL_ASM_ARG5) = y5;
161 register SystemCallArg x6 asm(DIUS_SYSTEM_CALL_ASM_ARG6) = y6;
164 : DIUS_SYSTEM_CALL_ASM_NUMBER(res), "r"(x1), "r"(x2), "r"(x3), "r"(x4), "r"(x5), "r"(x6)
166 if (err) {
167 return di::Unexpected(di::BasicError(err));
168 }
169 return R(res);
170}
171}
#define DIUS_SYSTEM_CALL_ASM_ARG5
Definition system_call.h:13
#define DIUS_SYSTEM_CALL_CLOBBER
Definition system_call.h:16
#define DIUS_SYSTEM_CALL_ASM_ERROR
Definition system_call.h:6
#define DIUS_SYSTEM_CALL_ASM_ARG2
Definition system_call.h:10
#define DIUS_SYSTEM_CALL_ASM_ARG1
Definition system_call.h:9
#define DIUS_SYSTEM_CALL_ASM_RESULT
Definition system_call.h:5
#define DIUS_SYSTEM_CALL_ASM_NUMBER
Definition system_call.h:7
#define DIUS_SYSTEM_CALL_INSTRUCTION
Definition system_call.h:3
#define DIUS_SYSTEM_CALL_ASM_ARG4
Definition system_call.h:12
#define DIUS_SYSTEM_CALL_ASM_ARG3
Definition system_call.h:11
#define DIUS_SYSTEM_CALL_ASM_ARG6
Definition system_call.h:14
Definition expected_forward_declaration.h:8
Definition unexpected.h:14
Definition operations.h:11
Definition system_call.h:20
Definition system_call.h:23
BasicError
Definition default_generic_domain.h:10
constexpr auto to_underlying
Definition to_underlying.h:15
Definition system_call.h:18
Definition system_call.h:11
unsigned long SystemCallArg
Definition system_call.h:14
Number
Definition system_call.h:25
unsigned long SystemCallError
Definition system_call.h:16
unsigned long SystemCallResult
Definition system_call.h:15
auto system_call(Number number) -> di::Expected< R, di::BasicError >
Definition system_call.h:27
SystemCall
Definition syscall.h:4