1 /* SPDX-License-Identifier: GPL-2.0 */ 2 #ifndef INCLUDE_XEN_OPS_H 3 #define INCLUDE_XEN_OPS_H 4 5 #include <linux/percpu.h> 6 #include <linux/notifier.h> 7 #include <linux/efi.h> 8 #include <asm/xen/interface.h> 9 #include <xen/interface/vcpu.h> 10 11 DECLARE_PER_CPU(struct vcpu_info *, xen_vcpu); 12 13 DECLARE_PER_CPU(uint32_t, xen_vcpu_id); 14 static inline uint32_t xen_vcpu_nr(int cpu) 15 { 16 return per_cpu(xen_vcpu_id, cpu); 17 } 18 19 #define XEN_VCPU_ID_INVALID U32_MAX 20 21 void xen_arch_pre_suspend(void); 22 void xen_arch_post_suspend(int suspend_cancelled); 23 24 void xen_timer_resume(void); 25 void xen_arch_resume(void); 26 void xen_arch_suspend(void); 27 28 void xen_reboot(int reason); 29 30 void xen_resume_notifier_register(struct notifier_block *nb); 31 void xen_resume_notifier_unregister(struct notifier_block *nb); 32 33 bool xen_vcpu_stolen(int vcpu); 34 void xen_setup_runstate_info(int cpu); 35 void xen_time_setup_guest(void); 36 void xen_get_runstate_snapshot(struct vcpu_runstate_info *res); 37 u64 xen_steal_clock(int cpu); 38 39 int xen_setup_shutdown_event(void); 40 41 extern unsigned long *xen_contiguous_bitmap; 42 43 #ifdef CONFIG_XEN_PV 44 int xen_create_contiguous_region(phys_addr_t pstart, unsigned int order, 45 unsigned int address_bits, 46 dma_addr_t *dma_handle); 47 48 void xen_destroy_contiguous_region(phys_addr_t pstart, unsigned int order); 49 #else 50 static inline int xen_create_contiguous_region(phys_addr_t pstart, 51 unsigned int order, 52 unsigned int address_bits, 53 dma_addr_t *dma_handle) 54 { 55 return 0; 56 } 57 58 static inline void xen_destroy_contiguous_region(phys_addr_t pstart, 59 unsigned int order) { } 60 #endif 61 62 struct vm_area_struct; 63 64 /* 65 * xen_remap_domain_gfn_array() - map an array of foreign frames 66 * @vma: VMA to map the pages into 67 * @addr: Address at which to map the pages 68 * @gfn: Array of GFNs to map 69 * @nr: Number entries in the GFN array 70 * @err_ptr: Returns per-GFN error status. 71 * @prot: page protection mask 72 * @domid: Domain owning the pages 73 * @pages: Array of pages if this domain has an auto-translated physmap 74 * 75 * @gfn and @err_ptr may point to the same buffer, the GFNs will be 76 * overwritten by the error codes after they are mapped. 77 * 78 * Returns the number of successfully mapped frames, or a -ve error 79 * code. 80 */ 81 int xen_remap_domain_gfn_array(struct vm_area_struct *vma, 82 unsigned long addr, 83 xen_pfn_t *gfn, int nr, 84 int *err_ptr, pgprot_t prot, 85 unsigned domid, 86 struct page **pages); 87 88 /* xen_remap_domain_gfn_range() - map a range of foreign frames 89 * @vma: VMA to map the pages into 90 * @addr: Address at which to map the pages 91 * @gfn: First GFN to map. 92 * @nr: Number frames to map 93 * @prot: page protection mask 94 * @domid: Domain owning the pages 95 * @pages: Array of pages if this domain has an auto-translated physmap 96 * 97 * Returns the number of successfully mapped frames, or a -ve error 98 * code. 99 */ 100 int xen_remap_domain_gfn_range(struct vm_area_struct *vma, 101 unsigned long addr, 102 xen_pfn_t gfn, int nr, 103 pgprot_t prot, unsigned domid, 104 struct page **pages); 105 int xen_unmap_domain_gfn_range(struct vm_area_struct *vma, 106 int numpgs, struct page **pages); 107 int xen_xlate_remap_gfn_array(struct vm_area_struct *vma, 108 unsigned long addr, 109 xen_pfn_t *gfn, int nr, 110 int *err_ptr, pgprot_t prot, 111 unsigned domid, 112 struct page **pages); 113 int xen_xlate_unmap_gfn_range(struct vm_area_struct *vma, 114 int nr, struct page **pages); 115 int xen_xlate_map_ballooned_pages(xen_pfn_t **pfns, void **vaddr, 116 unsigned long nr_grant_frames); 117 118 bool xen_running_on_version_or_later(unsigned int major, unsigned int minor); 119 120 efi_status_t xen_efi_get_time(efi_time_t *tm, efi_time_cap_t *tc); 121 efi_status_t xen_efi_set_time(efi_time_t *tm); 122 efi_status_t xen_efi_get_wakeup_time(efi_bool_t *enabled, efi_bool_t *pending, 123 efi_time_t *tm); 124 efi_status_t xen_efi_set_wakeup_time(efi_bool_t enabled, efi_time_t *tm); 125 efi_status_t xen_efi_get_variable(efi_char16_t *name, efi_guid_t *vendor, 126 u32 *attr, unsigned long *data_size, 127 void *data); 128 efi_status_t xen_efi_get_next_variable(unsigned long *name_size, 129 efi_char16_t *name, efi_guid_t *vendor); 130 efi_status_t xen_efi_set_variable(efi_char16_t *name, efi_guid_t *vendor, 131 u32 attr, unsigned long data_size, 132 void *data); 133 efi_status_t xen_efi_query_variable_info(u32 attr, u64 *storage_space, 134 u64 *remaining_space, 135 u64 *max_variable_size); 136 efi_status_t xen_efi_get_next_high_mono_count(u32 *count); 137 efi_status_t xen_efi_update_capsule(efi_capsule_header_t **capsules, 138 unsigned long count, unsigned long sg_list); 139 efi_status_t xen_efi_query_capsule_caps(efi_capsule_header_t **capsules, 140 unsigned long count, u64 *max_size, 141 int *reset_type); 142 void xen_efi_reset_system(int reset_type, efi_status_t status, 143 unsigned long data_size, efi_char16_t *data); 144 145 146 #ifdef CONFIG_PREEMPT 147 148 static inline void xen_preemptible_hcall_begin(void) 149 { 150 } 151 152 static inline void xen_preemptible_hcall_end(void) 153 { 154 } 155 156 #else 157 158 DECLARE_PER_CPU(bool, xen_in_preemptible_hcall); 159 160 static inline void xen_preemptible_hcall_begin(void) 161 { 162 __this_cpu_write(xen_in_preemptible_hcall, true); 163 } 164 165 static inline void xen_preemptible_hcall_end(void) 166 { 167 __this_cpu_write(xen_in_preemptible_hcall, false); 168 } 169 170 #endif /* CONFIG_PREEMPT */ 171 172 #endif /* INCLUDE_XEN_OPS_H */ 173