Add get_absolute_time() syscall + implement std::chrono::steady_clock::now() using it.
[barrelfish] / include / barrelfish_kpi / syscalls.h
1 /**
2  * \file
3  * \brief System call numbers.
4  */
5
6 /*
7  * Copyright (c) 2007, 2008, 2009, 2010, ETH Zurich.
8  * All rights reserved.
9  *
10  * This file is distributed under the terms in the attached LICENSE file.
11  * If you do not find this file, copies can be found by writing to:
12  * ETH Zurich D-INFK, Haldeneggsteig 4, CH-8092 Zurich. Attn: Systems Group.
13  */
14
15 #ifndef BARRELFISH_SYSCALLS_H
16 #define BARRELFISH_SYSCALLS_H
17
18 #ifndef __ASSEMBLER__
19
20 #include <stdint.h>
21 #include <errors/errno.h>
22
23 /// return type from a system call: two words
24 struct sysret {
25     errval_t  error;
26     uintptr_t value;
27 };
28
29 /// Macro used for constructing return values from single-value syscalls
30 #define SYSRET(x) (struct sysret){ /*error*/ x, /*value*/ 0 }
31 #endif // __ASSEMBLER__
32
33 /*
34  * These are the system call ordinals. Please keep the space contiguous
35  * as far as possible and make sure SYSCALL_COUNT is the number of system
36  * calls. Lower layers may build direct-mapped syscall tables and so
37  * compactness is a virtue.
38  */
39
40 /* Proper Barrelfish system calls */
41 #define SYSCALL_INVOKE              0       ///< Invoke a cap
42 #define SYSCALL_YIELD               1       ///< Yield the CPU
43 #define SYSCALL_LRPC                2       ///< Fast LRPC
44
45 /* Debug/Benchmarking system calls */
46 #define SYSCALL_DEBUG               3     ///< Benchmarking and debug syscalls
47 #define SYSCALL_REBOOT              4     ///< Reboot the machine
48 #define SYSCALL_NOP                 5     ///< No operation
49 #define SYSCALL_PRINT               6     ///< Write to console
50
51 /* Architecture-specific syscalls
52  * FIXME: shouldn't these be in an arch-specific header? -AB */
53 #ifdef __ARM_ARCH_7M__  //cortex-m3 on pandaboard
54 //overwrite unused syscall instead of creating yet another global one
55 #define SYSCALL_RESUME_CONTEXT      7     ///< Resume a context that the dispatcher can't
56 #else
57 #define SYSCALL_X86_FPU_TRAP_ON     7     ///< Turn FPU trap on (x86)
58 #endif  //__ARM_ARCH_7M__
59
60
61 #define SYSCALL_X86_RELOAD_LDT      8     ///< Reload the LDT register (x86_64)
62 #define SYSCALL_SUSPEND             9     ///< Suspend the CPU
63 #define SYSCALL_GET_ABS_TIME        10    ///< Get time elapsed since boot
64
65 #define SYSCALL_COUNT               11     ///< Number of syscalls [0..SYSCALL_COUNT - 1]
66
67 /*
68  * To understand system calls it might be helpful to know that there
69  * are four different levels of abstraction with multiplexing
70  * performed at three of them (compare with Tennenhouse: Layered
71  * Multiplexing Considered Harmful).
72  *
73  * At the bottom two levels of abstraction are the system call number
74  * as defined in this file.  This is one point of multiplexing and two
75  * levels of abstraction; the second one comes about because the
76  * system calls defined here use non primitive C types such as
77  * "struct sysret" which have to be converted and dealt with by a
78  * level of abstraction to deal with the encoding used over the
79  * protection boundary.  For example, on some architectures
80  * structures, including output structures, are passed by reference in
81  * the argument list.  Therefore below the C abstraction of the system
82  * call there must be a translation to an abstraction which can cross
83  * the protection boundary.
84  *
85  * Above this is the invoke system call.  It deals with two different
86  * ways of doing additional multiplexing, based on the type of the
87  * capability being invoked, and the command being invoked on the
88  * capability.  This defines which kernel system call implementation
89  * is to be run.  An aspect of this is that the arguments to the
90  * intended kernel code have to multiplexed up in user space onto the
91  * invoke system call and demultiplexed by the kernel, thus preventing
92  * direct dispatch to the intended implementation.
93  *
94  * Above this is the endpoint invocation in which the above system
95  * invocation system call is performed and demultiplexed, but the
96  * target capability is a special type in which the implementation
97  * code being called is not in the kernel; in this the arguments to
98  * the desired functionality must be marshalled in such a way that
99  * they can be delivered to the desired domain instead of the kernel.
100  *
101  * Knowing this will help the reader understand the various different
102  * marshalling and unmarshalling code found variously in
103  * monitor_invocations.h, invocations.h, syscalls.c, syscall_arch.h,
104  * syscall.c and related assembler.
105  */
106
107 #endif // BARRELFISH_SYSCALLS_H