Change all references of num_cpus -> num_cores
[akaros.git] / kern / arch / x86 / ros / syscall64.h
1 #ifndef ROS_INC_ARCH_SYSCALL64_H
2 #define ROS_INC_ARCH_SYSCALL64_H
3
4 #ifndef ROS_INC_ARCH_SYSCALL_H
5 #error "Do not include include ros/arch/syscall64.h directly"
6 #endif
7
8 #ifndef ROS_KERNEL
9
10 #include <sys/types.h>
11 #include <stdint.h>
12 #include <ros/common.h>
13 #include <ros/arch/mmu.h>
14 #include <assert.h>
15
16 static inline intreg_t __syscall_sysenter(uintreg_t a0, uintreg_t a1)
17 {
18         intreg_t ret = 0;
19         long dummy;
20         /* we're calling using the amd function call abi.  this asm and the kernel
21          * will save the callee-saved state.  We'll use the clobber list to force
22          * the compiler to save caller-saved state.  As with uthread code, you need
23          * to make sure you have one ABI-compliant, non-inlined function call
24          * between any floating point ops and this.
25          *
26          * Note that syscall doesn't save the stack pointer - using rdx for that.
27          * The kernel will restore it for us. */
28         asm volatile ("movq %%rsp, %%rdx;       "
29                       "syscall;                 "
30                       : "=a"(ret), "=D"(dummy), "=S"(dummy) /* force D, S clobber */
31                       : "D"(a0), "S"(a1)
32                       : "cc", "memory", "rcx", "rdx", "r8", "r9", "r10", "r11");
33         return ret;
34 }
35
36 static inline intreg_t __syscall_trap(uintreg_t a0, uintreg_t a1)
37 {
38         intreg_t ret;
39         /* If you change this, change pop_user_ctx() */
40         asm volatile("int %1"
41                      : "=a" (ret)
42                      : "i" (T_SYSCALL),
43                        "D" (a0),
44                        "S" (a1)
45                      : "cc", "memory");
46         return ret;
47 }
48
49 /* The kernel has a fast path for setting the fs base, used for TLS changes on
50  * machines that can't do it from user space.  The magic value for rdi (D) is a
51  * non-canonical address, which should never be a legitamate syscall. */
52 static inline void __fastcall_setfsbase(uintptr_t fsbase)
53 {
54         long dummy;
55         asm volatile ("syscall" : "=D"(dummy), "=S"(dummy) /* force D, S clobber */
56                                 : "D"(FASTCALL_SETFSBASE), "S"(fsbase)
57                                 : "rax", "r11", "rcx", "rdx", "memory");
58 }
59
60 #endif
61
62 #endif /* ROS_INC_ARCH_SYSCALL64_H */