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"
22 #define __asmeq(x, y) ".ifnc " x "," y " ; .err ; .endif\n\t"
27 static inline __u32 jailhouse_call(__u32 num)
29 register __u32 num_result asm(JAILHOUSE_CALL_NUM_RESULT) = num;
32 __asmeq(JAILHOUSE_CALL_NUM_RESULT, "%0")
33 __asmeq(JAILHOUSE_CALL_NUM_RESULT, "%1")
41 static inline __u32 jailhouse_call_arg1(__u32 num, __u32 arg1)
43 register __u32 num_result asm(JAILHOUSE_CALL_NUM_RESULT) = num;
44 register __u32 __arg1 asm(JAILHOUSE_CALL_ARG1) = arg1;
47 __asmeq(JAILHOUSE_CALL_NUM_RESULT, "%0")
48 __asmeq(JAILHOUSE_CALL_NUM_RESULT, "%1")
49 __asmeq(JAILHOUSE_CALL_ARG1, "%2")
52 : "r" (num_result), "r" (__arg1)
57 static inline __u32 jailhouse_call_arg2(__u32 num, __u32 arg1, __u32 arg2)
59 register __u32 num_result asm(JAILHOUSE_CALL_NUM_RESULT) = num;
60 register __u32 __arg1 asm(JAILHOUSE_CALL_ARG1) = arg1;
61 register __u32 __arg2 asm(JAILHOUSE_CALL_ARG2) = arg2;
64 __asmeq(JAILHOUSE_CALL_NUM_RESULT, "%0")
65 __asmeq(JAILHOUSE_CALL_NUM_RESULT, "%1")
66 __asmeq(JAILHOUSE_CALL_ARG1, "%2")
67 __asmeq(JAILHOUSE_CALL_ARG2, "%3")
70 : "r" (num_result), "r" (__arg1), "r" (__arg2)
76 jailhouse_send_msg_to_cell(struct jailhouse_comm_region *comm_region,
79 comm_region->reply_from_cell = JAILHOUSE_MSG_NONE;
80 /* ensure reply was cleared before sending new message */
81 asm volatile("dmb ishst" : : : "memory");
82 comm_region->msg_to_cell = msg;
86 jailhouse_send_reply_from_cell(struct jailhouse_comm_region *comm_region,
89 comm_region->msg_to_cell = JAILHOUSE_MSG_NONE;
90 /* ensure message was cleared before sending reply */
91 asm volatile("dmb ishst" : : : "memory");
92 comm_region->reply_from_cell = reply;
95 #endif /* !__ASSEMBLY__ */