1/* 2 * Copyright 2017, Data61 3 * Commonwealth Scientific and Industrial Research Organisation (CSIRO) 4 * ABN 41 687 119 230. 5 * 6 * This software may be distributed and modified according to the terms of 7 * the BSD 2-Clause license. Note that NO WARRANTY is provided. 8 * See "LICENSE_BSD2.txt" for details. 9 * 10 * @TAG(DATA61_BSD) 11 */ 12 13#ifndef __LIBSEL4_SEL4_SEL4_ARCH_SYSCALLS_SYSCALL_H_ 14#define __LIBSEL4_SEL4_SEL4_ARCH_SYSCALLS_SYSCALL_H_ 15 16#include <autoconf.h> 17#include <sel4/arch/functions.h> 18#include <sel4/types.h> 19 20static inline void 21x64_sys_send(seL4_Word sys, seL4_Word dest, seL4_Word info, seL4_Word msg0, seL4_Word msg1, seL4_Word msg2, seL4_Word msg3) 22{ 23 register seL4_Word mr0 asm("r10") = msg0; 24 register seL4_Word mr1 asm("r8") = msg1; 25 register seL4_Word mr2 asm("r9") = msg2; 26 register seL4_Word mr3 asm("r15") = msg3; 27 28 asm volatile ( 29 "movq %%rsp, %%rbx \n" 30 "syscall \n" 31 "movq %%rbx, %%rsp \n" 32 : 33 : "d" (sys), 34 "D" (dest), 35 "S" (info), 36 "r" (mr0), 37 "r" (mr1), 38 "r" (mr2), 39 "r" (mr3) 40 : "%rcx", "%rbx", "r11" 41 ); 42} 43 44static inline void 45x64_sys_send_null(seL4_Word sys, seL4_Word dest, seL4_Word info) 46{ 47 asm volatile ( 48 "movq %%rsp, %%rbx \n" 49 "syscall \n" 50 "movq %%rbx, %%rsp \n" 51 : 52 : "d" (sys), 53 "D" (dest), 54 "S" (info) 55 : "%rcx", "%rbx", "%r11" 56 ); 57} 58 59static inline void 60x64_sys_recv(seL4_Word sys, seL4_Word src, seL4_Word *out_badge, seL4_Word *out_info, seL4_Word *out_mr0, seL4_Word *out_mr1, seL4_Word *out_mr2, seL4_Word *out_mr3, seL4_Word reply) 61{ 62 register seL4_Word mr0 asm("r10"); 63 register seL4_Word mr1 asm("r8"); 64 register seL4_Word mr2 asm("r9"); 65 register seL4_Word mr3 asm("r15"); 66 register seL4_Word reply_reg asm("r12") = reply; 67 68 asm volatile ( 69 "movq %%rsp, %%rbx \n" 70 "syscall \n" 71 "movq %%rbx, %%rsp \n" 72 : "=D" (*out_badge), 73 "=S" (*out_info), 74 "=r" (mr0), 75 "=r" (mr1), 76 "=r" (mr2), 77 "=r" (mr3) 78 : "d" (sys), 79 "D" (src), 80 "r" (reply_reg) 81 : "%rcx", "%rbx", "r11", "memory" 82 ); 83 *out_mr0 = mr0; 84 *out_mr1 = mr1; 85 *out_mr2 = mr2; 86 *out_mr3 = mr3; 87} 88 89static inline void 90x64_sys_send_recv(seL4_Word sys, seL4_Word dest, seL4_Word *out_dest, seL4_Word info, seL4_Word *out_info, seL4_Word *in_out_mr0, seL4_Word *in_out_mr1, seL4_Word *in_out_mr2, seL4_Word *in_out_mr3, seL4_Word reply) 91{ 92 register seL4_Word mr0 asm("r10") = *in_out_mr0; 93 register seL4_Word mr1 asm("r8") = *in_out_mr1; 94 register seL4_Word mr2 asm("r9") = *in_out_mr2; 95 register seL4_Word mr3 asm("r15") = *in_out_mr3; 96 register seL4_Word reply_reg asm("r12") = reply; 97 98 asm volatile ( 99 "movq %%rsp, %%rbx \n" 100 "syscall \n" 101 "movq %%rbx, %%rsp \n" 102 : "=S" (*out_info), 103 "=r" (mr0), 104 "=r" (mr1), 105 "=r" (mr2), 106 "=r" (mr3), 107 "=D" (*out_dest) 108 : "d" (sys), 109 "D" (dest), 110 "S" (info), 111 "r" (mr0), 112 "r" (mr1), 113 "r" (mr2), 114 "r" (mr3), 115 "r" (reply_reg) 116 : "%rcx", "%rbx", "r11", "memory" 117 ); 118 *in_out_mr0 = mr0; 119 *in_out_mr1 = mr1; 120 *in_out_mr2 = mr2; 121 *in_out_mr3 = mr3; 122} 123 124static inline void 125x64_sys_nbsend_recv(seL4_Word sys, seL4_Word dest, seL4_Word src, seL4_Word *out_dest, seL4_Word info, seL4_Word *out_info, seL4_Word *in_out_mr0, seL4_Word *in_out_mr1, seL4_Word *in_out_mr2, seL4_Word *in_out_mr3, seL4_Word reply) 126{ 127 register seL4_Word mr0 asm("r10") = *in_out_mr0; 128 register seL4_Word mr1 asm("r8") = *in_out_mr1; 129 register seL4_Word mr2 asm("r9") = *in_out_mr2; 130 register seL4_Word mr3 asm("r15") = *in_out_mr3; 131 register seL4_Word reply_reg asm("r12") = reply; 132 register seL4_Word dest_reg asm("r13") = dest; 133 134 asm volatile ( 135 "movq %%rsp, %%rbx \n" 136 "syscall \n" 137 "movq %%rbx, %%rsp \n" 138 : "=S" (*out_info), 139 "=r" (mr0), 140 "=r" (mr1), 141 "=r" (mr2), 142 "=r" (mr3), 143 "=D" (*out_dest) 144 : "d" (sys), 145 "D" (src), 146 "S" (info), 147 "r" (mr0), 148 "r" (mr1), 149 "r" (mr2), 150 "r" (mr3), 151 "r" (reply_reg), 152 "r" (dest_reg) 153 : "%rcx", "%rbx", "r11", "memory" 154 ); 155 *in_out_mr0 = mr0; 156 *in_out_mr1 = mr1; 157 *in_out_mr2 = mr2; 158 *in_out_mr3 = mr3; 159} 160static inline void 161x64_sys_null(seL4_Word sys) 162{ 163 asm volatile ( 164 "movq %%rsp, %%rbx \n" 165 "syscall \n" 166 "movq %%rbx, %%rsp \n" 167 : 168 : "d" (sys) 169 : "%rbx", "%rcx", "%rsi", "%rdi", "%r11" 170 ); 171} 172 173#endif /* __LIBSEL4_SEL4_SEL4_ARCH_SYSCALLS_SYSCALL_H_ */ 174