The Pedigree Project 0.1
hosted/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
30typedef long (*syscall_caller_t)(long service, long function, long* error, long p1, long p2,
31 long p3, long p4, long p5, long p6);
32
33static syscall_caller_t __hosted_syscall = (syscall_caller_t)0x399000;
34
35static long syscall6(long function, long p1, long p2, long p3, long p4, long p5, long p6) {
36 SERVICE_INIT;
37 long error = 0;
38 long result = __hosted_syscall(SERVICE, function, &error, p1, p2, p3, p4, p5, p6);
39 if (error) {
40 SERVICE_ERROR = error;
41 }
42 return result;
43}
44
45static long syscall6_err(long function, long p1, long p2, long p3, long p4, long p5, long p6,
46 long* err) {
47 *err = 0;
48 return __hosted_syscall(SERVICE, function, err, p1, p2, p3, p4, p5, p6);
49}
50
51static long syscall6_for_service_err(long service, long function, long p1, long p2, long p3,
52 long p4, long p5, long p6, long* err) {
53 return __hosted_syscall(service, function, err, p1, p2, p3, p4, p5, p6);
54}
55
56static long syscall0(long function) {
57 return syscall6(function, 0, 0, 0, 0, 0, 0);
58}
59
60static long syscall1(long function, long p1) {
61 return syscall6(function, p1, 0, 0, 0, 0, 0);
62}
63
64static long syscall2(long function, long p1, long p2) {
65 return syscall6(function, p1, p2, 0, 0, 0, 0);
66}
67
68static long syscall3(long function, long p1, long p2, long p3) {
69 return syscall6(function, p1, p2, p3, 0, 0, 0);
70}
71
72static long syscall4(long function, long p1, long p2, long p3, long p4) {
73 return syscall6(function, p1, p2, p3, p4, 0, 0);
74}
75
76static long syscall5(long function, long p1, long p2, long p3, long p4, long p5) {
77 return syscall6(function, p1, p2, p3, p4, p5, 0);
78}