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.
14 #error 64-bit kernel required!
17 #define JAILHOUSE_BASE 0xfffffffff0000000
19 #define JAILHOUSE_CALL_INS "vmcall"
20 #define JAILHOUSE_CALL_RESULT "=a" (result)
21 #define JAILHOUSE_CALL_NUM "a" (num)
22 #define JAILHOUSE_CALL_ARG1 "D" (arg1)
23 #define JAILHOUSE_CALL_ARG2 "S" (arg2)
26 #define JAILHOUSE_CPU_STAT_VMEXITS_PIO JAILHOUSE_GENERIC_CPU_STATS
27 #define JAILHOUSE_CPU_STAT_VMEXITS_XAPIC JAILHOUSE_GENERIC_CPU_STATS + 1
28 #define JAILHOUSE_CPU_STAT_VMEXITS_CR JAILHOUSE_GENERIC_CPU_STATS + 2
29 #define JAILHOUSE_CPU_STAT_VMEXITS_MSR JAILHOUSE_GENERIC_CPU_STATS + 3
30 #define JAILHOUSE_CPU_STAT_VMEXITS_CPUID JAILHOUSE_GENERIC_CPU_STATS + 4
31 #define JAILHOUSE_CPU_STAT_VMEXITS_XSETBV JAILHOUSE_GENERIC_CPU_STATS + 5
32 #define JAILHOUSE_NUM_CPU_STATS JAILHOUSE_GENERIC_CPU_STATS + 6
36 static inline __u32 jailhouse_call(__u32 num)
40 asm volatile(JAILHOUSE_CALL_INS
41 : JAILHOUSE_CALL_RESULT
47 static inline __u32 jailhouse_call_arg1(__u32 num, __u32 arg1)
51 asm volatile(JAILHOUSE_CALL_INS
52 : JAILHOUSE_CALL_RESULT
53 : JAILHOUSE_CALL_NUM, JAILHOUSE_CALL_ARG1
58 static inline __u32 jailhouse_call_arg2(__u32 num, __u32 arg1, __u32 arg2)
62 asm volatile(JAILHOUSE_CALL_INS
63 : JAILHOUSE_CALL_RESULT
64 : JAILHOUSE_CALL_NUM, JAILHOUSE_CALL_ARG1, JAILHOUSE_CALL_ARG2
70 jailhouse_send_msg_to_cell(struct jailhouse_comm_region *comm_region,
73 comm_region->reply_from_cell = JAILHOUSE_MSG_NONE;
74 /* ensure reply was cleared before sending new message */
75 asm volatile("mfence" : : : "memory");
76 comm_region->msg_to_cell = msg;
80 jailhouse_send_reply_from_cell(struct jailhouse_comm_region *comm_region,
83 comm_region->msg_to_cell = JAILHOUSE_MSG_NONE;
84 /* ensure message was cleared before sending reply */
85 asm volatile("mfence" : : : "memory");
86 comm_region->reply_from_cell = reply;
89 #endif /* !__ASSEMBLY__ */