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 JAILHOUSE_NUM_CPU_STATS JAILHOUSE_GENERIC_CPU_STATS
25 #define __asmeq(x, y) ".ifnc " x "," y " ; .err ; .endif\n\t"
30 static inline __u32 jailhouse_call(__u32 num)
32 register __u32 num_result asm(JAILHOUSE_CALL_NUM_RESULT) = num;
35 __asmeq(JAILHOUSE_CALL_NUM_RESULT, "%0")
36 __asmeq(JAILHOUSE_CALL_NUM_RESULT, "%1")
44 static inline __u32 jailhouse_call_arg1(__u32 num, __u32 arg1)
46 register __u32 num_result asm(JAILHOUSE_CALL_NUM_RESULT) = num;
47 register __u32 __arg1 asm(JAILHOUSE_CALL_ARG1) = arg1;
50 __asmeq(JAILHOUSE_CALL_NUM_RESULT, "%0")
51 __asmeq(JAILHOUSE_CALL_NUM_RESULT, "%1")
52 __asmeq(JAILHOUSE_CALL_ARG1, "%2")
55 : "r" (num_result), "r" (__arg1)
60 static inline __u32 jailhouse_call_arg2(__u32 num, __u32 arg1, __u32 arg2)
62 register __u32 num_result asm(JAILHOUSE_CALL_NUM_RESULT) = num;
63 register __u32 __arg1 asm(JAILHOUSE_CALL_ARG1) = arg1;
64 register __u32 __arg2 asm(JAILHOUSE_CALL_ARG2) = arg2;
67 __asmeq(JAILHOUSE_CALL_NUM_RESULT, "%0")
68 __asmeq(JAILHOUSE_CALL_NUM_RESULT, "%1")
69 __asmeq(JAILHOUSE_CALL_ARG1, "%2")
70 __asmeq(JAILHOUSE_CALL_ARG2, "%3")
73 : "r" (num_result), "r" (__arg1), "r" (__arg2)
79 jailhouse_send_msg_to_cell(struct jailhouse_comm_region *comm_region,
82 comm_region->reply_from_cell = JAILHOUSE_MSG_NONE;
83 /* ensure reply was cleared before sending new message */
84 asm volatile("dmb ishst" : : : "memory");
85 comm_region->msg_to_cell = msg;
89 jailhouse_send_reply_from_cell(struct jailhouse_comm_region *comm_region,
92 comm_region->msg_to_cell = JAILHOUSE_MSG_NONE;
93 /* ensure message was cleared before sending reply */
94 asm volatile("dmb ishst" : : : "memory");
95 comm_region->reply_from_cell = reply;
98 #endif /* !__ASSEMBLY__ */