1 /* SPDX-License-Identifier: GPL-2.0-only */ 2 3 #ifndef PSP_VERSTAGE_SVC_CALL_H 4 #define PSP_VERSTAGE_SVC_CALL_H 5 6 #define SVC_CALL4(SVC_ID, R0, R1, R2, R3, Ret) \ 7 __asm__ __volatile__ ( \ 8 "mov r0, %[reg0]\n\t" \ 9 "mov r1, %[reg1]\n\t" \ 10 "mov r2, %[reg2]\n\t" \ 11 "mov r3, %[reg3]\n\t" \ 12 "svc %[id]\n\t" \ 13 "mov %[result], r0\n\t" \ 14 : [result] "=r" (Ret) /* output */ \ 15 : [id] "i" (SVC_ID), [reg0] "r" (R0), [reg1] "r" (R1), [reg2] "r" (R2), \ 16 [reg3] "r" (R3) /* input(s) */ \ 17 : "r0", "r1", "r2", "r3", "memory", "cc" /* list of clobbered registers */) 18 19 #define SVC_CALL3(SVC_ID, R0, R1, R2, Ret) \ 20 __asm__ __volatile__ ( \ 21 "mov r0, %[reg0]\n\t" \ 22 "mov r1, %[reg1]\n\t" \ 23 "mov r2, %[reg2]\n\t" \ 24 "svc %[id]\n\t" \ 25 "mov %[result], r0\n\t" \ 26 : [result] "=r" (Ret) /* output */ \ 27 : [id] "i" (SVC_ID), [reg0] "r" (R0), [reg1] "r" (R1), [reg2] "r" (R2) \ 28 : "r0", "r1", "r2", "memory", "cc" /* list of clobbered registers */) 29 30 #define SVC_CALL2(SVC_ID, R0, R1, Ret) \ 31 __asm__ __volatile__ ( \ 32 "mov r0, %[reg0]\n\t" \ 33 "mov r1, %[reg1]\n\t" \ 34 "svc %[id]\n\t" \ 35 "mov %[result], r0\n\t" \ 36 : [result] "=r" (Ret) /* output */ \ 37 : [id] "i" (SVC_ID), [reg0] "r" (R0), [reg1] "r" (R1)/* input(s) */ \ 38 : "r0", "r1", "memory", "cc" /* list of clobbered registers */) 39 40 #define SVC_CALL1(SVC_ID, R0, Ret) \ 41 __asm__ __volatile__ ( \ 42 "mov r0, %[reg0]\n\t" \ 43 "svc %[id]\n\t" \ 44 "mov %[result], r0\n\t" \ 45 : [result] "=r" (Ret) /* output */ \ 46 : [id] "i" (SVC_ID), [reg0] "r" (R0) /* input(s) */ \ 47 : "r0", "memory", "cc" /* list of clobbered registers */) 48 49 #define SVC_CALL0(SVC_ID, Ret) \ 50 __asm__ __volatile__ ( \ 51 "svc %[id]\n\t" \ 52 "mov %[result], r0\n\t" \ 53 : [result] "=r" (Ret) /* output */ \ 54 : [id] "I" (SVC_ID) /* input(s) */ \ 55 : "memory", "cc" /* list of clobbered registers */) 56 57 #endif /* PSP_VERSTAGE_SVC_CALL_H */ 58