1e08cae41SH. Peter Anvin #ifndef _ASM_X86_MSHYPER_H 2e08cae41SH. Peter Anvin #define _ASM_X86_MSHYPER_H 3a2a47c6cSKy Srinivasan 4e08cae41SH. Peter Anvin #include <linux/types.h> 51aec1696SThomas Gleixner #include <linux/interrupt.h> 6e08cae41SH. Peter Anvin #include <asm/hyperv.h> 7e08cae41SH. Peter Anvin 8e08cae41SH. Peter Anvin struct ms_hyperv_info { 9e08cae41SH. Peter Anvin u32 features; 10cc2dd402SDenis V. Lunev u32 misc_features; 11e08cae41SH. Peter Anvin u32 hints; 12e08cae41SH. Peter Anvin }; 13e08cae41SH. Peter Anvin 14e08cae41SH. Peter Anvin extern struct ms_hyperv_info ms_hyperv; 15a2a47c6cSKy Srinivasan 163f646ed7SK. Y. Srinivasan /* 173f646ed7SK. Y. Srinivasan * Declare the MSR used to setup pages used to communicate with the hypervisor. 183f646ed7SK. Y. Srinivasan */ 193f646ed7SK. Y. Srinivasan union hv_x64_msr_hypercall_contents { 203f646ed7SK. Y. Srinivasan u64 as_uint64; 213f646ed7SK. Y. Srinivasan struct { 223f646ed7SK. Y. Srinivasan u64 enable:1; 233f646ed7SK. Y. Srinivasan u64 reserved:11; 243f646ed7SK. Y. Srinivasan u64 guest_physical_address:52; 253f646ed7SK. Y. Srinivasan }; 263f646ed7SK. Y. Srinivasan }; 273f646ed7SK. Y. Srinivasan 28352c9624SK. Y. Srinivasan /* 29352c9624SK. Y. Srinivasan * The guest OS needs to register the guest ID with the hypervisor. 30352c9624SK. Y. Srinivasan * The guest ID is a 64 bit entity and the structure of this ID is 31352c9624SK. Y. Srinivasan * specified in the Hyper-V specification: 32352c9624SK. Y. Srinivasan * 33352c9624SK. Y. Srinivasan * msdn.microsoft.com/en-us/library/windows/hardware/ff542653%28v=vs.85%29.aspx 34352c9624SK. Y. Srinivasan * 35352c9624SK. Y. Srinivasan * While the current guideline does not specify how Linux guest ID(s) 36352c9624SK. Y. Srinivasan * need to be generated, our plan is to publish the guidelines for 37352c9624SK. Y. Srinivasan * Linux and other guest operating systems that currently are hosted 38352c9624SK. Y. Srinivasan * on Hyper-V. The implementation here conforms to this yet 39352c9624SK. Y. Srinivasan * unpublished guidelines. 40352c9624SK. Y. Srinivasan * 41352c9624SK. Y. Srinivasan * 42352c9624SK. Y. Srinivasan * Bit(s) 43352c9624SK. Y. Srinivasan * 63 - Indicates if the OS is Open Source or not; 1 is Open Source 44352c9624SK. Y. Srinivasan * 62:56 - Os Type; Linux is 0x100 45352c9624SK. Y. Srinivasan * 55:48 - Distro specific identification 46352c9624SK. Y. Srinivasan * 47:16 - Linux kernel version number 47352c9624SK. Y. Srinivasan * 15:0 - Distro specific identification 48352c9624SK. Y. Srinivasan * 49352c9624SK. Y. Srinivasan * 50352c9624SK. Y. Srinivasan */ 51352c9624SK. Y. Srinivasan 52352c9624SK. Y. Srinivasan #define HV_LINUX_VENDOR_ID 0x8800 53352c9624SK. Y. Srinivasan 54352c9624SK. Y. Srinivasan /* 55352c9624SK. Y. Srinivasan * Generate the guest ID based on the guideline described above. 56352c9624SK. Y. Srinivasan */ 57352c9624SK. Y. Srinivasan 58352c9624SK. Y. Srinivasan static inline __u64 generate_guest_id(__u64 d_info1, __u64 kernel_version, 59352c9624SK. Y. Srinivasan __u64 d_info2) 60352c9624SK. Y. Srinivasan { 61352c9624SK. Y. Srinivasan __u64 guest_id = 0; 62352c9624SK. Y. Srinivasan 63352c9624SK. Y. Srinivasan guest_id = (((__u64)HV_LINUX_VENDOR_ID) << 56); 64352c9624SK. Y. Srinivasan guest_id |= (d_info1 << 48); 65352c9624SK. Y. Srinivasan guest_id |= (kernel_version << 16); 66352c9624SK. Y. Srinivasan guest_id |= d_info2; 67352c9624SK. Y. Srinivasan 68352c9624SK. Y. Srinivasan return guest_id; 69352c9624SK. Y. Srinivasan } 70352c9624SK. Y. Srinivasan 71bc2b0331SK. Y. Srinivasan void hyperv_callback_vector(void); 72cf910e83SSeiji Aguchi #ifdef CONFIG_TRACING 73cf910e83SSeiji Aguchi #define trace_hyperv_callback_vector hyperv_callback_vector 74cf910e83SSeiji Aguchi #endif 75bc2b0331SK. Y. Srinivasan void hyperv_vector_handler(struct pt_regs *regs); 7676d388cdSThomas Gleixner void hv_setup_vmbus_irq(void (*handler)(void)); 7776d388cdSThomas Gleixner void hv_remove_vmbus_irq(void); 78bc2b0331SK. Y. Srinivasan 792517281dSVitaly Kuznetsov void hv_setup_kexec_handler(void (*handler)(void)); 802517281dSVitaly Kuznetsov void hv_remove_kexec_handler(void); 81b4370df2SVitaly Kuznetsov void hv_setup_crash_handler(void (*handler)(struct pt_regs *regs)); 82b4370df2SVitaly Kuznetsov void hv_remove_crash_handler(void); 83*8730046cSK. Y. Srinivasan 84*8730046cSK. Y. Srinivasan #if IS_ENABLED(CONFIG_HYPERV) 85*8730046cSK. Y. Srinivasan void hyperv_init(void); 86*8730046cSK. Y. Srinivasan extern void *hv_hypercall_pg; 87*8730046cSK. Y. Srinivasan #endif 88a2a47c6cSKy Srinivasan #endif 89