1/*
2 * Copyright (c) 2007-2009, ETH Zurich.
3 * All rights reserved.
4 *
5 * This file is distributed under the terms in the attached LICENSE file.
6 * If you do not find this file, copies can be found by writing to:
7 * ETH Zurich D-INFK, Universitaetstr. 6, CH-8092 Zurich. Attn: Systems Group.
8 */
9
10#include <barrelfish/barrelfish.h>
11#include <barrelfish/caddr.h>
12#include <barrelfish/dispatch.h>
13
14#include <barrelfish/syscalls.h>
15#include <barrelfish/syscall_arch.h>
16#include <barrelfish_kpi/syscalls.h>
17
18STATIC_ASSERT_SIZEOF(struct sysret, 2 * sizeof(uintptr_t));
19STATIC_ASSERT_OFFSETOF(struct sysret, error, 0 * sizeof(uintptr_t));
20STATIC_ASSERT_OFFSETOF(struct sysret, value, 1 * sizeof(uintptr_t));
21STATIC_ASSERT(SYSCALL_REG == 0, "Bad register for system call argument.");
22
23struct sysret
24syscall(uint64_t num, uint64_t arg1, uint64_t arg2, uint64_t arg3,
25        uint64_t arg4, uint64_t arg5, uint64_t arg6, uint64_t arg7,
26        uint64_t arg8, uint64_t arg9, uint64_t arg10, uint64_t arg11)
27{
28    register uint64_t ret1 __asm("x0")  = num;
29    register uint64_t ret2 __asm("x1")  = arg1;
30    register uint64_t a2   __asm("x2")  = arg2;
31    register uint64_t a3   __asm("x3")  = arg3;
32    register uint64_t a4   __asm("x4")  = arg4;
33    register uint64_t a5   __asm("x5")  = arg5;
34    register uint64_t a6   __asm("x6")  = arg6;
35    register uint64_t a7   __asm("x7")  = arg7;
36    register uint64_t a8   __asm("x8")  = arg8;
37    register uint64_t a9   __asm("x9")  = arg9;
38    register uint64_t a10  __asm("x10") = arg10;
39    register uint64_t a11  __asm("x11") = arg11;
40
41    __asm volatile (
42        "svc #0                         \n\t"
43        :  "=r" (ret1), "=r" (ret2)
44        : "r" (ret1), "r" (ret2), "r" (a2), "r" (a3), "r" (a4), "r" (a5), \
45          "r" (a6), "r" (a7), "r" (a8), "r" (a9), "r" (a10), "r" (a11)
46    );
47
48    return (struct sysret){/*error*/ ret1, /*value*/ ret2};
49}
50
51//
52// System call wrappers
53//
54