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_CPU_STAT_VMEXITS_MAINTENANCE JAILHOUSE_GENERIC_CPU_STATS
23 #define JAILHOUSE_CPU_STAT_VMEXITS_VIRQ JAILHOUSE_GENERIC_CPU_STATS + 1
24 #define JAILHOUSE_CPU_STAT_VMEXITS_VSGI JAILHOUSE_GENERIC_CPU_STATS + 2
25 #define JAILHOUSE_NUM_CPU_STATS JAILHOUSE_GENERIC_CPU_STATS + 3
28 #define __asmeq(x, y) ".ifnc " x "," y " ; .err ; .endif\n\t"
33 struct jailhouse_comm_region {
34 COMM_REGION_GENERIC_HEADER;
37 static inline __u32 jailhouse_call(__u32 num)
39 register __u32 num_result asm(JAILHOUSE_CALL_NUM_RESULT) = num;
42 __asmeq(JAILHOUSE_CALL_NUM_RESULT, "%0")
43 __asmeq(JAILHOUSE_CALL_NUM_RESULT, "%1")
51 static inline __u32 jailhouse_call_arg1(__u32 num, __u32 arg1)
53 register __u32 num_result asm(JAILHOUSE_CALL_NUM_RESULT) = num;
54 register __u32 __arg1 asm(JAILHOUSE_CALL_ARG1) = arg1;
57 __asmeq(JAILHOUSE_CALL_NUM_RESULT, "%0")
58 __asmeq(JAILHOUSE_CALL_NUM_RESULT, "%1")
59 __asmeq(JAILHOUSE_CALL_ARG1, "%2")
62 : "r" (num_result), "r" (__arg1)
67 static inline __u32 jailhouse_call_arg2(__u32 num, __u32 arg1, __u32 arg2)
69 register __u32 num_result asm(JAILHOUSE_CALL_NUM_RESULT) = num;
70 register __u32 __arg1 asm(JAILHOUSE_CALL_ARG1) = arg1;
71 register __u32 __arg2 asm(JAILHOUSE_CALL_ARG2) = arg2;
74 __asmeq(JAILHOUSE_CALL_NUM_RESULT, "%0")
75 __asmeq(JAILHOUSE_CALL_NUM_RESULT, "%1")
76 __asmeq(JAILHOUSE_CALL_ARG1, "%2")
77 __asmeq(JAILHOUSE_CALL_ARG2, "%3")
80 : "r" (num_result), "r" (__arg1), "r" (__arg2)
86 jailhouse_send_msg_to_cell(struct jailhouse_comm_region *comm_region,
89 comm_region->reply_from_cell = JAILHOUSE_MSG_NONE;
90 /* ensure reply was cleared before sending new message */
91 asm volatile("dmb ishst" : : : "memory");
92 comm_region->msg_to_cell = msg;
96 jailhouse_send_reply_from_cell(struct jailhouse_comm_region *comm_region,
99 comm_region->msg_to_cell = JAILHOUSE_MSG_NONE;
100 /* ensure message was cleared before sending reply */
101 asm volatile("dmb ishst" : : : "memory");
102 comm_region->reply_from_cell = reply;
105 #endif /* !__ASSEMBLY__ */