linux/include/xen/xen-ops.h
<<
>>
Prefs
   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 <xen/features.h>
   9#include <asm/xen/interface.h>
  10#include <xen/interface/vcpu.h>
  11
  12DECLARE_PER_CPU(struct vcpu_info *, xen_vcpu);
  13
  14DECLARE_PER_CPU(uint32_t, xen_vcpu_id);
  15static inline uint32_t xen_vcpu_nr(int cpu)
  16{
  17        return per_cpu(xen_vcpu_id, cpu);
  18}
  19
  20#define XEN_VCPU_ID_INVALID U32_MAX
  21
  22void xen_arch_pre_suspend(void);
  23void xen_arch_post_suspend(int suspend_cancelled);
  24
  25void xen_timer_resume(void);
  26void xen_arch_resume(void);
  27void xen_arch_suspend(void);
  28
  29void xen_reboot(int reason);
  30
  31void xen_resume_notifier_register(struct notifier_block *nb);
  32void xen_resume_notifier_unregister(struct notifier_block *nb);
  33
  34bool xen_vcpu_stolen(int vcpu);
  35void xen_setup_runstate_info(int cpu);
  36void xen_time_setup_guest(void);
  37void xen_manage_runstate_time(int action);
  38void xen_get_runstate_snapshot(struct vcpu_runstate_info *res);
  39u64 xen_steal_clock(int cpu);
  40
  41int xen_setup_shutdown_event(void);
  42
  43extern unsigned long *xen_contiguous_bitmap;
  44
  45#if defined(CONFIG_XEN_PV) || defined(CONFIG_ARM) || defined(CONFIG_ARM64)
  46int xen_create_contiguous_region(phys_addr_t pstart, unsigned int order,
  47                                unsigned int address_bits,
  48                                dma_addr_t *dma_handle);
  49
  50void xen_destroy_contiguous_region(phys_addr_t pstart, unsigned int order);
  51#else
  52static inline int xen_create_contiguous_region(phys_addr_t pstart,
  53                                               unsigned int order,
  54                                               unsigned int address_bits,
  55                                               dma_addr_t *dma_handle)
  56{
  57        return 0;
  58}
  59
  60static inline void xen_destroy_contiguous_region(phys_addr_t pstart,
  61                                                 unsigned int order) { }
  62#endif
  63
  64#if defined(CONFIG_XEN_PV)
  65int xen_remap_pfn(struct vm_area_struct *vma, unsigned long addr,
  66                  xen_pfn_t *pfn, int nr, int *err_ptr, pgprot_t prot,
  67                  unsigned int domid, bool no_translate, struct page **pages);
  68#else
  69static inline int xen_remap_pfn(struct vm_area_struct *vma, unsigned long addr,
  70                                xen_pfn_t *pfn, int nr, int *err_ptr,
  71                                pgprot_t prot,  unsigned int domid,
  72                                bool no_translate, struct page **pages)
  73{
  74        BUG();
  75        return 0;
  76}
  77#endif
  78
  79struct vm_area_struct;
  80
  81#ifdef CONFIG_XEN_AUTO_XLATE
  82int xen_xlate_remap_gfn_array(struct vm_area_struct *vma,
  83                              unsigned long addr,
  84                              xen_pfn_t *gfn, int nr,
  85                              int *err_ptr, pgprot_t prot,
  86                              unsigned int domid,
  87                              struct page **pages);
  88int xen_xlate_unmap_gfn_range(struct vm_area_struct *vma,
  89                              int nr, struct page **pages);
  90#else
  91/*
  92 * These two functions are called from arch/x86/xen/mmu.c and so stubs
  93 * are needed for a configuration not specifying CONFIG_XEN_AUTO_XLATE.
  94 */
  95static inline int xen_xlate_remap_gfn_array(struct vm_area_struct *vma,
  96                                            unsigned long addr,
  97                                            xen_pfn_t *gfn, int nr,
  98                                            int *err_ptr, pgprot_t prot,
  99                                            unsigned int domid,
 100                                            struct page **pages)
 101{
 102        return -EOPNOTSUPP;
 103}
 104
 105static inline int xen_xlate_unmap_gfn_range(struct vm_area_struct *vma,
 106                                            int nr, struct page **pages)
 107{
 108        return -EOPNOTSUPP;
 109}
 110#endif
 111
 112/*
 113 * xen_remap_domain_gfn_array() - map an array of foreign frames by gfn
 114 * @vma:     VMA to map the pages into
 115 * @addr:    Address at which to map the pages
 116 * @gfn:     Array of GFNs to map
 117 * @nr:      Number entries in the GFN array
 118 * @err_ptr: Returns per-GFN error status.
 119 * @prot:    page protection mask
 120 * @domid:   Domain owning the pages
 121 * @pages:   Array of pages if this domain has an auto-translated physmap
 122 *
 123 * @gfn and @err_ptr may point to the same buffer, the GFNs will be
 124 * overwritten by the error codes after they are mapped.
 125 *
 126 * Returns the number of successfully mapped frames, or a -ve error
 127 * code.
 128 */
 129static inline int xen_remap_domain_gfn_array(struct vm_area_struct *vma,
 130                                             unsigned long addr,
 131                                             xen_pfn_t *gfn, int nr,
 132                                             int *err_ptr, pgprot_t prot,
 133                                             unsigned int domid,
 134                                             struct page **pages)
 135{
 136        if (xen_feature(XENFEAT_auto_translated_physmap))
 137                return xen_xlate_remap_gfn_array(vma, addr, gfn, nr, err_ptr,
 138                                                 prot, domid, pages);
 139
 140        /* We BUG_ON because it's a programmer error to pass a NULL err_ptr,
 141         * and the consequences later is quite hard to detect what the actual
 142         * cause of "wrong memory was mapped in".
 143         */
 144        BUG_ON(err_ptr == NULL);
 145        return xen_remap_pfn(vma, addr, gfn, nr, err_ptr, prot, domid,
 146                             false, pages);
 147}
 148
 149/*
 150 * xen_remap_domain_mfn_array() - map an array of foreign frames by mfn
 151 * @vma:     VMA to map the pages into
 152 * @addr:    Address at which to map the pages
 153 * @mfn:     Array of MFNs to map
 154 * @nr:      Number entries in the MFN array
 155 * @err_ptr: Returns per-MFN error status.
 156 * @prot:    page protection mask
 157 * @domid:   Domain owning the pages
 158 * @pages:   Array of pages if this domain has an auto-translated physmap
 159 *
 160 * @mfn and @err_ptr may point to the same buffer, the MFNs will be
 161 * overwritten by the error codes after they are mapped.
 162 *
 163 * Returns the number of successfully mapped frames, or a -ve error
 164 * code.
 165 */
 166static inline int xen_remap_domain_mfn_array(struct vm_area_struct *vma,
 167                                             unsigned long addr, xen_pfn_t *mfn,
 168                                             int nr, int *err_ptr,
 169                                             pgprot_t prot, unsigned int domid,
 170                                             struct page **pages)
 171{
 172        if (xen_feature(XENFEAT_auto_translated_physmap))
 173                return -EOPNOTSUPP;
 174
 175        return xen_remap_pfn(vma, addr, mfn, nr, err_ptr, prot, domid,
 176                             true, pages);
 177}
 178
 179/* xen_remap_domain_gfn_range() - map a range of foreign frames
 180 * @vma:     VMA to map the pages into
 181 * @addr:    Address at which to map the pages
 182 * @gfn:     First GFN to map.
 183 * @nr:      Number frames to map
 184 * @prot:    page protection mask
 185 * @domid:   Domain owning the pages
 186 * @pages:   Array of pages if this domain has an auto-translated physmap
 187 *
 188 * Returns the number of successfully mapped frames, or a -ve error
 189 * code.
 190 */
 191static inline int xen_remap_domain_gfn_range(struct vm_area_struct *vma,
 192                                             unsigned long addr,
 193                                             xen_pfn_t gfn, int nr,
 194                                             pgprot_t prot, unsigned int domid,
 195                                             struct page **pages)
 196{
 197        if (xen_feature(XENFEAT_auto_translated_physmap))
 198                return -EOPNOTSUPP;
 199
 200        return xen_remap_pfn(vma, addr, &gfn, nr, NULL, prot, domid, false,
 201                             pages);
 202}
 203
 204int xen_unmap_domain_gfn_range(struct vm_area_struct *vma,
 205                               int numpgs, struct page **pages);
 206
 207int xen_xlate_map_ballooned_pages(xen_pfn_t **pfns, void **vaddr,
 208                                  unsigned long nr_grant_frames);
 209
 210bool xen_running_on_version_or_later(unsigned int major, unsigned int minor);
 211
 212efi_status_t xen_efi_get_time(efi_time_t *tm, efi_time_cap_t *tc);
 213efi_status_t xen_efi_set_time(efi_time_t *tm);
 214efi_status_t xen_efi_get_wakeup_time(efi_bool_t *enabled, efi_bool_t *pending,
 215                                     efi_time_t *tm);
 216efi_status_t xen_efi_set_wakeup_time(efi_bool_t enabled, efi_time_t *tm);
 217efi_status_t xen_efi_get_variable(efi_char16_t *name, efi_guid_t *vendor,
 218                                  u32 *attr, unsigned long *data_size,
 219                                  void *data);
 220efi_status_t xen_efi_get_next_variable(unsigned long *name_size,
 221                                       efi_char16_t *name, efi_guid_t *vendor);
 222efi_status_t xen_efi_set_variable(efi_char16_t *name, efi_guid_t *vendor,
 223                                  u32 attr, unsigned long data_size,
 224                                  void *data);
 225efi_status_t xen_efi_query_variable_info(u32 attr, u64 *storage_space,
 226                                         u64 *remaining_space,
 227                                         u64 *max_variable_size);
 228efi_status_t xen_efi_get_next_high_mono_count(u32 *count);
 229efi_status_t xen_efi_update_capsule(efi_capsule_header_t **capsules,
 230                                    unsigned long count, unsigned long sg_list);
 231efi_status_t xen_efi_query_capsule_caps(efi_capsule_header_t **capsules,
 232                                        unsigned long count, u64 *max_size,
 233                                        int *reset_type);
 234void xen_efi_reset_system(int reset_type, efi_status_t status,
 235                          unsigned long data_size, efi_char16_t *data);
 236
 237
 238#ifdef CONFIG_PREEMPT
 239
 240static inline void xen_preemptible_hcall_begin(void)
 241{
 242}
 243
 244static inline void xen_preemptible_hcall_end(void)
 245{
 246}
 247
 248#else
 249
 250DECLARE_PER_CPU(bool, xen_in_preemptible_hcall);
 251
 252static inline void xen_preemptible_hcall_begin(void)
 253{
 254        __this_cpu_write(xen_in_preemptible_hcall, true);
 255}
 256
 257static inline void xen_preemptible_hcall_end(void)
 258{
 259        __this_cpu_write(xen_in_preemptible_hcall, false);
 260}
 261
 262#endif /* CONFIG_PREEMPT */
 263
 264#endif /* INCLUDE_XEN_OPS_H */
 265