2 * Jailhouse, a Linux-based partitioning hypervisor
4 * Copyright (c) Siemens AG, 2013
7 * Jan Kiszka <jan.kiszka@siemens.com>
9 * This work is licensed under the terms of the GNU GPL, version 2. See
10 * the COPYING file in the top-level directory.
13 #define JAILHOUSE_BASE 0xf0000000
15 #define JAILHOUSE_CALL_INS ".arch_extension virt\n\t" \
17 #define JAILHOUSE_CALL_NUM_RESULT "r0"
18 #define JAILHOUSE_CALL_ARG1 "r1"
19 #define JAILHOUSE_CALL_ARG2 "r2"
20 #define JAILHOUSE_CALL_ARG3 "r3"
21 #define JAILHOUSE_CALL_ARG4 "r4"
24 #define __asmeq(x, y) ".ifnc " x "," y " ; .err ; .endif\n\t"
29 static inline __u32 jailhouse_call0(__u32 num)
31 register __u32 num_result asm(JAILHOUSE_CALL_NUM_RESULT) = num;
34 __asmeq(JAILHOUSE_CALL_NUM_RESULT, "%0")
35 __asmeq(JAILHOUSE_CALL_NUM_RESULT, "%1")
43 static inline __u32 jailhouse_call1(__u32 num, __u32 arg1)
45 register __u32 num_result asm(JAILHOUSE_CALL_NUM_RESULT) = num;
46 register __u32 __arg1 asm(JAILHOUSE_CALL_ARG1) = arg1;
49 __asmeq(JAILHOUSE_CALL_NUM_RESULT, "%0")
50 __asmeq(JAILHOUSE_CALL_NUM_RESULT, "%1")
51 __asmeq(JAILHOUSE_CALL_ARG1, "%2")
54 : "r" (num_result), "r" (__arg1)
59 static inline __u32 jailhouse_call2(__u32 num, __u32 arg1, __u32 arg2)
61 register __u32 num_result asm(JAILHOUSE_CALL_NUM_RESULT) = num;
62 register __u32 __arg1 asm(JAILHOUSE_CALL_ARG1) = arg1;
63 register __u32 __arg2 asm(JAILHOUSE_CALL_ARG2) = arg2;
66 __asmeq(JAILHOUSE_CALL_NUM_RESULT, "%0")
67 __asmeq(JAILHOUSE_CALL_NUM_RESULT, "%1")
68 __asmeq(JAILHOUSE_CALL_ARG1, "%2")
69 __asmeq(JAILHOUSE_CALL_ARG2, "%3")
72 : "r" (num_result), "r" (__arg1), "r" (__arg2)
77 static inline __u32 jailhouse_call3(__u32 num, __u32 arg1, __u32 arg2,
80 register __u32 num_result asm(JAILHOUSE_CALL_NUM_RESULT) = num;
81 register __u32 __arg1 asm(JAILHOUSE_CALL_ARG1) = arg1;
82 register __u32 __arg2 asm(JAILHOUSE_CALL_ARG2) = arg2;
83 register __u32 __arg3 asm(JAILHOUSE_CALL_ARG3) = arg3;
86 __asmeq(JAILHOUSE_CALL_NUM_RESULT, "%0")
87 __asmeq(JAILHOUSE_CALL_NUM_RESULT, "%1")
88 __asmeq(JAILHOUSE_CALL_ARG1, "%2")
89 __asmeq(JAILHOUSE_CALL_ARG2, "%3")
90 __asmeq(JAILHOUSE_CALL_ARG3, "%4")
93 : "r" (num_result), "r" (__arg1), "r" (__arg2), "r" (__arg3)
98 static inline __u32 jailhouse_call4(__u32 num, __u32 arg1, __u32 arg2,
99 __u32 arg3, __u32 arg4)
101 register __u32 num_result asm(JAILHOUSE_CALL_NUM_RESULT) = num;
102 register __u32 __arg1 asm(JAILHOUSE_CALL_ARG1) = arg1;
103 register __u32 __arg2 asm(JAILHOUSE_CALL_ARG2) = arg2;
104 register __u32 __arg3 asm(JAILHOUSE_CALL_ARG3) = arg3;
105 register __u32 __arg4 asm(JAILHOUSE_CALL_ARG4) = arg4;
108 __asmeq(JAILHOUSE_CALL_NUM_RESULT, "%0")
109 __asmeq(JAILHOUSE_CALL_NUM_RESULT, "%1")
110 __asmeq(JAILHOUSE_CALL_ARG1, "%2")
111 __asmeq(JAILHOUSE_CALL_ARG2, "%3")
112 __asmeq(JAILHOUSE_CALL_ARG3, "%4")
113 __asmeq(JAILHOUSE_CALL_ARG4, "%5")
116 : "r" (num_result), "r" (__arg1), "r" (__arg2), "r" (__arg3),
123 jailhouse_send_msg_to_cell(struct jailhouse_comm_region *comm_region,
126 comm_region->reply_from_cell = JAILHOUSE_MSG_NONE;
127 /* ensure reply was cleared before sending new message */
128 asm volatile("dmb ishst" : : : "memory");
129 comm_region->msg_to_cell = msg;
133 jailhouse_send_reply_from_cell(struct jailhouse_comm_region *comm_region,
136 comm_region->msg_to_cell = JAILHOUSE_MSG_NONE;
137 /* ensure message was cleared before sending reply */
138 asm volatile("dmb ishst" : : : "memory");
139 comm_region->reply_from_cell = reply;
142 #endif /* !__ASSEMBLY__ */