1 /* Copyright (c) 2008, Sandia National Laboratories */
3 #include <lwk/unistd.h>
4 #include <lwk/liblwk.h>
7 * There is no way to specify inline assembly constraints for %r10 (arg4),
8 * %r8 (arg5), and %r9 (arg6), so the macros below specify the registers
9 * to use for local variables as a work-around.
11 * GCC BUG? -- For some unknown reason, the register specified to store
12 * a local variable is not always honored if the variable
13 * is assigned when it is declared. Work-around by declaring
14 * and assigning on separate lines.
16 #define SYSCALL0(name) \
23 : "memory", "rcx", "r11", "cc" \
28 #define SYSCALL1(name, type1) \
29 int name(type1 arg1) { \
31 register type1 rdi asm("rdi"); \
36 : "0" (__NR_##name), \
38 : "memory", "rcx", "r11", "cc" \
43 #define SYSCALL2(name, type1, type2) \
44 int name(type1 arg1, type2 arg2) { \
46 register type1 rdi asm("rdi"); \
47 register type2 rsi asm("rsi"); \
53 : "0" (__NR_##name), \
56 : "memory", "rcx", "r11", "cc" \
61 #define SYSCALL3(name, type1, type2, type3) \
62 int name(type1 arg1, type2 arg2, type3 arg3) { \
64 register type1 rdi asm("rdi"); \
65 register type2 rsi asm("rsi"); \
66 register type3 rdx asm("rdx"); \
73 : "0" (__NR_##name), \
77 : "memory", "rcx", "r11", "cc" \
82 #define SYSCALL4(name, type1, type2, type3, type4) \
83 int name(type1 arg1, type2 arg2, type3 arg3, type4 arg4) { \
85 register type1 rdi asm("rdi"); \
86 register type2 rsi asm("rsi"); \
87 register type3 rdx asm("rdx"); \
88 register type4 r10 asm("r10"); \
96 : "0" (__NR_##name), \
101 : "memory", "rcx", "r11", "cc" \
106 #define SYSCALL5(name, type1, type2, type3, type4, type5) \
107 int name(type1 arg1, type2 arg2, type3 arg3, type4 arg4, \
110 register type1 rdi asm("rdi"); \
111 register type2 rsi asm("rsi"); \
112 register type3 rdx asm("rdx"); \
113 register type4 r10 asm("r10"); \
114 register type5 r8 asm("r8"); \
123 : "0" (__NR_##name), \
129 : "memory", "rcx", "r11", "cc" \
134 #define SYSCALL6(name, type1, type2, type3, type4, type5, type6)\
135 int name(type1 arg1, type2 arg2, type3 arg3, type4 arg4, \
136 type5 arg5, type6 arg6) { \
138 register type1 rdi asm("rdi"); \
139 register type2 rsi asm("rsi"); \
140 register type3 rdx asm("rdx"); \
141 register type4 r10 asm("r10"); \
142 register type5 r8 asm("r8"); \
143 register type6 r9 asm("r9"); \
153 : "0" (__NR_##name), \
160 : "memory", "rcx", "r11", "cc" \
166 * Physical memory management.
168 SYSCALL1(pmem_add, const struct pmem_region *);
169 SYSCALL1(pmem_update, const struct pmem_region *);
170 SYSCALL2(pmem_query, const struct pmem_region *, struct pmem_region *);
171 SYSCALL4(pmem_alloc, size_t, size_t,
172 const struct pmem_region *, struct pmem_region *);
175 * Address space management.
177 SYSCALL1(aspace_get_myid, id_t *);
178 SYSCALL3(aspace_create, id_t, const char *, id_t *);
179 SYSCALL1(aspace_destroy, id_t);
180 SYSCALL5(aspace_find_hole, id_t, vaddr_t, size_t, size_t, vaddr_t *);
181 SYSCALL6(aspace_add_region,
182 id_t, vaddr_t, size_t, vmflags_t, vmpagesize_t, const char *);
183 SYSCALL3(aspace_del_region, id_t, vaddr_t, size_t);
184 SYSCALL4(aspace_map_pmem, id_t, paddr_t, vaddr_t, size_t);
185 SYSCALL3(aspace_unmap_pmem, id_t, vaddr_t, size_t);
186 SYSCALL4(aspace_smartmap, id_t, id_t, vaddr_t, size_t);
187 SYSCALL2(aspace_unsmartmap, id_t, id_t);
188 SYSCALL1(aspace_dump2console, id_t);
193 SYSCALL1(task_get_myid, id_t *);
194 SYSCALL4(task_create, id_t, const char *, const start_state_t *, id_t *);
195 SYSCALL1(task_exit, int);
196 SYSCALL0(task_yield);
199 * ELF related system calls.
201 SYSCALL2(elf_hwcap, id_t, uint32_t *);