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