The Pedigree Project 0.1
x64/syscall-stubs.h
1/*
2 * Copyright (c) 2008-2014, Pedigree Developers
3 *
4 * Please see the CONTRIB file in the root of the source tree for a full
5 * list of contributors.
6 *
7 * Permission to use, copy, modify, and distribute this software for any
8 * purpose with or without fee is hereby granted, provided that the above
9 * copyright notice and this permission notice appear in all copies.
10 *
11 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
12 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
13 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
14 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
15 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
16 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
17 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
18 */
19
20#ifndef SERVICE
21#error syscall-stubs.h requires SERVICE to be defined
22#endif
23#ifndef SERVICE_ERROR
24#error syscall-stubs.h requires SERVICE_ERROR to be defined
25#endif
26#ifndef SERVICE_INIT
27#error syscall-stubs.h requires SERVICE_INIT to be defined
28#endif
29
30static long syscall6(long function, long p1, long p2, long p3, long p4, long p5, long p6) {
31 long eax = ((SERVICE & 0xFFFF) << 16) | (function & 0xFFFF);
32 long ret;
33 long err;
34 register long p5_r __asm__("r8") = p5;
35 register long p6_r __asm__("r9") = p6;
36
37 SERVICE_INIT;
38
39 __asm__ __volatile__("syscall"
40 : "=a"(ret), "=b"(err)
41 : "0"(eax), "1"(p1), "d"(p2), "S"(p3), "D"(p4), "r"(p5_r), "r"(p6_r)
42 : "rcx", "r11", "memory");
43
44 if (err) {
45 SERVICE_ERROR = err;
46 }
47 return ret;
48}
49
50static long syscall6_err(long function, long p1, long p2, long p3, long p4, long p5, long p6,
51 long* err) {
52 long eax = ((SERVICE & 0xFFFF) << 16) | (function & 0xFFFF);
53 long ret;
54 register long p5_r __asm__("r8") = p5;
55 register long p6_r __asm__("r9") = p6;
56
57 *err = 0;
58 __asm__ __volatile__("syscall"
59 : "=a"(ret), "=b"(*err)
60 : "0"(eax), "1"(p1), "d"(p2), "S"(p3), "D"(p4), "r"(p5_r), "r"(p6_r)
61 : "rcx", "r11", "memory");
62
63 return ret;
64}
65
66static long syscall6_for_service_err(long service, long function, long p1, long p2, long p3,
67 long p4, long p5, long p6, long* err) {
68 long eax = ((service & 0xFFFF) << 16) | (function & 0xFFFF);
69 long ret;
70 register long p4_r __asm__("r10") = p4;
71 register long p5_r __asm__("r8") = p5;
72 register long p6_r __asm__("r9") = p6;
73
74 *err = 0;
75 __asm__ __volatile__("syscall"
76 : "=a"(ret)
77 : "0"(eax), "D"(p1), "S"(p2), "d"(p3), "r"(p4_r), "r"(p5_r), "r"(p6_r)
78 : "rcx", "r11", "memory");
79
80 return ret;
81}
82
83static long syscall0(long function) {
84 return syscall6(function, 0, 0, 0, 0, 0, 0);
85}
86
87static long syscall1(long function, long p1) {
88 return syscall6(function, p1, 0, 0, 0, 0, 0);
89}
90
91static long syscall2(long function, long p1, long p2) {
92 return syscall6(function, p1, p2, 0, 0, 0, 0);
93}
94
95static long syscall3(long function, long p1, long p2, long p3) {
96 return syscall6(function, p1, p2, p3, 0, 0, 0);
97}
98
99static long syscall4(long function, long p1, long p2, long p3, long p4) {
100 return syscall6(function, p1, p2, p3, p4, 0, 0);
101}
102
103static long syscall5(long function, long p1, long p2, long p3, long p4, long p5) {
104 return syscall6(function, p1, p2, p3, p4, p5, 0);
105}