Commit | Line | Data |
---|---|---|
7995700e SL |
1 | /* SPDX-License-Identifier: GPL-2.0 */ |
2 | #ifndef _ASM_X86_ACRN_H | |
3 | #define _ASM_X86_ACRN_H | |
4 | ||
ebbfc978 YF |
5 | /* |
6 | * This CPUID returns feature bitmaps in EAX. | |
7 | * Guest VM uses this to detect the appropriate feature bit. | |
8 | */ | |
9 | #define ACRN_CPUID_FEATURES 0x40000001 | |
10 | /* Bit 0 indicates whether guest VM is privileged */ | |
11 | #define ACRN_FEATURE_PRIVILEGED_VM BIT(0) | |
12 | ||
81a71f51 FL |
13 | /* |
14 | * Timing Information. | |
15 | * This leaf returns the current TSC frequency in kHz. | |
16 | * | |
17 | * EAX: (Virtual) TSC frequency in kHz. | |
18 | * EBX, ECX, EDX: RESERVED (reserved fields are set to zero). | |
19 | */ | |
20 | #define ACRN_CPUID_TIMING_INFO 0x40000010 | |
21 | ||
7995700e SL |
22 | void acrn_setup_intr_handler(void (*handler)(void)); |
23 | void acrn_remove_intr_handler(void); | |
24 | ||
ebbfc978 YF |
25 | static inline u32 acrn_cpuid_base(void) |
26 | { | |
27 | if (boot_cpu_has(X86_FEATURE_HYPERVISOR)) | |
28 | return hypervisor_cpuid_base("ACRNACRNACRN", 0); | |
29 | ||
30 | return 0; | |
31 | } | |
32 | ||
81a71f51 FL |
33 | static inline unsigned long acrn_get_tsc_khz(void) |
34 | { | |
35 | return cpuid_eax(ACRN_CPUID_TIMING_INFO); | |
36 | } | |
37 | ||
8a0a8719 SL |
38 | /* |
39 | * Hypercalls for ACRN | |
40 | * | |
41 | * - VMCALL instruction is used to implement ACRN hypercalls. | |
42 | * - ACRN hypercall ABI: | |
43 | * - Hypercall number is passed in R8 register. | |
44 | * - Up to 2 arguments are passed in RDI, RSI. | |
45 | * - Return value will be placed in RAX. | |
46 | * | |
47 | * Because GCC doesn't support R8 register as direct register constraints, use | |
48 | * supported constraint as input with a explicit MOV to R8 in beginning of asm. | |
49 | */ | |
50 | static inline long acrn_hypercall0(unsigned long hcall_id) | |
51 | { | |
52 | long result; | |
53 | ||
54 | asm volatile("movl %1, %%r8d\n\t" | |
55 | "vmcall\n\t" | |
56 | : "=a" (result) | |
57 | : "g" (hcall_id) | |
58 | : "r8", "memory"); | |
59 | ||
60 | return result; | |
61 | } | |
62 | ||
63 | static inline long acrn_hypercall1(unsigned long hcall_id, | |
64 | unsigned long param1) | |
65 | { | |
66 | long result; | |
67 | ||
68 | asm volatile("movl %1, %%r8d\n\t" | |
69 | "vmcall\n\t" | |
70 | : "=a" (result) | |
71 | : "g" (hcall_id), "D" (param1) | |
72 | : "r8", "memory"); | |
73 | ||
74 | return result; | |
75 | } | |
76 | ||
77 | static inline long acrn_hypercall2(unsigned long hcall_id, | |
78 | unsigned long param1, | |
79 | unsigned long param2) | |
80 | { | |
81 | long result; | |
82 | ||
83 | asm volatile("movl %1, %%r8d\n\t" | |
84 | "vmcall\n\t" | |
85 | : "=a" (result) | |
86 | : "g" (hcall_id), "D" (param1), "S" (param2) | |
87 | : "r8", "memory"); | |
88 | ||
89 | return result; | |
90 | } | |
91 | ||
7995700e | 92 | #endif /* _ASM_X86_ACRN_H */ |