blob: 0049a2e8918b99f43f13ece51bf126c69c8c83ae [file] [log] [blame]
/* Copyright (c) 2012 The Regents of the University of California
* Barret Rhoden <brho@cs.berkeley.edu>
* See LICENSE for details.
*
* glibc syscall functions / tools for working with Akaros */
#ifndef _GLIBC_AKAROS_SYSCALL_H
#define _GLIBC_AKAROS_SYSCALL_H
#ifndef __ASSEMBLER__
#include <ros/syscall.h>
#include <ros/event.h>
#ifdef __cplusplus
extern "C" {
#endif
/**************** Functions to invoke syscalls ****************/
/* Convenience wrapper for __ros_syscall_errno. Most code uses this (for now)*/
#define ros_syscall(which, a0, a1, a2, a3, a4, a5) \
__ros_syscall_errno(which, (long)(a0), (long)(a1), (long)(a2), (long)(a3), \
(long)(a4), (long)(a5))
/* Issue a single syscall and block into the 2LS until it completes */
void ros_syscall_sync(struct syscall *sysc);
/* Raw syscall, ignores errors. Usually used by code that can't handle errno
* (TLS). */
long __ros_syscall_noerrno(unsigned int _num, long _a0, long _a1, long _a2,
long _a3, long _a4, long _a5);
/* This version knows about errno and will handle it. */
long __ros_syscall_errno(unsigned int _num, long _a0, long _a1, long _a2,
long _a3, long _a4, long _a5);
/* Bypass PLT when invoked from within libc */
#ifdef libc_hidden_proto
libc_hidden_proto(ros_syscall_sync)
libc_hidden_proto(__ros_syscall_noerrno)
libc_hidden_proto(__ros_syscall_errno)
#endif
/**************** Additional syscall support ****************/
/* Simple ev_q that routes notifs to vcore0's public mbox. This is used by the
* default scp_syscall, but can also be used for signals or other basic
* event/signal needs. */
extern struct event_queue __ros_scp_simple_evq;
/* Attempts to block on sysc, returning when it is done or progress has been
* made. (function is in uthread.c) */
extern void (*ros_syscall_blockon)(struct syscall *sysc);
/* Glibc initial blockon, usable before parlib code can init things (or if it
* never can, like for RTLD). MCPs will need the 'uthread-aware' blockon. */
void __ros_early_syscall_blockon(struct syscall *sysc);
#ifdef __cplusplus
}
#endif
#endif
#endif /* _GLIBC_AKAROS_SYSCALL_H */