xref: /kernel/linux/linux-5.10/include/xen/xen-ops.h (revision 8c2ecf20)
18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
28c2ecf20Sopenharmony_ci#ifndef INCLUDE_XEN_OPS_H
38c2ecf20Sopenharmony_ci#define INCLUDE_XEN_OPS_H
48c2ecf20Sopenharmony_ci
58c2ecf20Sopenharmony_ci#include <linux/percpu.h>
68c2ecf20Sopenharmony_ci#include <linux/notifier.h>
78c2ecf20Sopenharmony_ci#include <linux/efi.h>
88c2ecf20Sopenharmony_ci#include <xen/features.h>
98c2ecf20Sopenharmony_ci#include <asm/xen/interface.h>
108c2ecf20Sopenharmony_ci#include <xen/interface/vcpu.h>
118c2ecf20Sopenharmony_ci
128c2ecf20Sopenharmony_ciDECLARE_PER_CPU(struct vcpu_info *, xen_vcpu);
138c2ecf20Sopenharmony_ci
148c2ecf20Sopenharmony_ciDECLARE_PER_CPU(uint32_t, xen_vcpu_id);
158c2ecf20Sopenharmony_cistatic inline uint32_t xen_vcpu_nr(int cpu)
168c2ecf20Sopenharmony_ci{
178c2ecf20Sopenharmony_ci	return per_cpu(xen_vcpu_id, cpu);
188c2ecf20Sopenharmony_ci}
198c2ecf20Sopenharmony_ci
208c2ecf20Sopenharmony_ci#define XEN_VCPU_ID_INVALID U32_MAX
218c2ecf20Sopenharmony_ci
228c2ecf20Sopenharmony_civoid xen_arch_pre_suspend(void);
238c2ecf20Sopenharmony_civoid xen_arch_post_suspend(int suspend_cancelled);
248c2ecf20Sopenharmony_ci
258c2ecf20Sopenharmony_civoid xen_timer_resume(void);
268c2ecf20Sopenharmony_civoid xen_arch_resume(void);
278c2ecf20Sopenharmony_civoid xen_arch_suspend(void);
288c2ecf20Sopenharmony_ci
298c2ecf20Sopenharmony_civoid xen_reboot(int reason);
308c2ecf20Sopenharmony_ci
318c2ecf20Sopenharmony_civoid xen_resume_notifier_register(struct notifier_block *nb);
328c2ecf20Sopenharmony_civoid xen_resume_notifier_unregister(struct notifier_block *nb);
338c2ecf20Sopenharmony_ci
348c2ecf20Sopenharmony_cibool xen_vcpu_stolen(int vcpu);
358c2ecf20Sopenharmony_civoid xen_setup_runstate_info(int cpu);
368c2ecf20Sopenharmony_civoid xen_time_setup_guest(void);
378c2ecf20Sopenharmony_civoid xen_manage_runstate_time(int action);
388c2ecf20Sopenharmony_civoid xen_get_runstate_snapshot(struct vcpu_runstate_info *res);
398c2ecf20Sopenharmony_ciu64 xen_steal_clock(int cpu);
408c2ecf20Sopenharmony_ci
418c2ecf20Sopenharmony_ciint xen_setup_shutdown_event(void);
428c2ecf20Sopenharmony_ci
438c2ecf20Sopenharmony_ciextern unsigned long *xen_contiguous_bitmap;
448c2ecf20Sopenharmony_ci
458c2ecf20Sopenharmony_ci#if defined(CONFIG_XEN_PV) || defined(CONFIG_ARM) || defined(CONFIG_ARM64)
468c2ecf20Sopenharmony_ciint xen_create_contiguous_region(phys_addr_t pstart, unsigned int order,
478c2ecf20Sopenharmony_ci				unsigned int address_bits,
488c2ecf20Sopenharmony_ci				dma_addr_t *dma_handle);
498c2ecf20Sopenharmony_ci
508c2ecf20Sopenharmony_civoid xen_destroy_contiguous_region(phys_addr_t pstart, unsigned int order);
518c2ecf20Sopenharmony_ci#else
528c2ecf20Sopenharmony_cistatic inline int xen_create_contiguous_region(phys_addr_t pstart,
538c2ecf20Sopenharmony_ci					       unsigned int order,
548c2ecf20Sopenharmony_ci					       unsigned int address_bits,
558c2ecf20Sopenharmony_ci					       dma_addr_t *dma_handle)
568c2ecf20Sopenharmony_ci{
578c2ecf20Sopenharmony_ci	return 0;
588c2ecf20Sopenharmony_ci}
598c2ecf20Sopenharmony_ci
608c2ecf20Sopenharmony_cistatic inline void xen_destroy_contiguous_region(phys_addr_t pstart,
618c2ecf20Sopenharmony_ci						 unsigned int order) { }
628c2ecf20Sopenharmony_ci#endif
638c2ecf20Sopenharmony_ci
648c2ecf20Sopenharmony_ci#if defined(CONFIG_XEN_PV)
658c2ecf20Sopenharmony_ciint xen_remap_pfn(struct vm_area_struct *vma, unsigned long addr,
668c2ecf20Sopenharmony_ci		  xen_pfn_t *pfn, int nr, int *err_ptr, pgprot_t prot,
678c2ecf20Sopenharmony_ci		  unsigned int domid, bool no_translate, struct page **pages);
688c2ecf20Sopenharmony_ci#else
698c2ecf20Sopenharmony_cistatic inline int xen_remap_pfn(struct vm_area_struct *vma, unsigned long addr,
708c2ecf20Sopenharmony_ci				xen_pfn_t *pfn, int nr, int *err_ptr,
718c2ecf20Sopenharmony_ci				pgprot_t prot,  unsigned int domid,
728c2ecf20Sopenharmony_ci				bool no_translate, struct page **pages)
738c2ecf20Sopenharmony_ci{
748c2ecf20Sopenharmony_ci	BUG();
758c2ecf20Sopenharmony_ci	return 0;
768c2ecf20Sopenharmony_ci}
778c2ecf20Sopenharmony_ci#endif
788c2ecf20Sopenharmony_ci
798c2ecf20Sopenharmony_cistruct vm_area_struct;
808c2ecf20Sopenharmony_ci
818c2ecf20Sopenharmony_ci#ifdef CONFIG_XEN_AUTO_XLATE
828c2ecf20Sopenharmony_ciint xen_xlate_remap_gfn_array(struct vm_area_struct *vma,
838c2ecf20Sopenharmony_ci			      unsigned long addr,
848c2ecf20Sopenharmony_ci			      xen_pfn_t *gfn, int nr,
858c2ecf20Sopenharmony_ci			      int *err_ptr, pgprot_t prot,
868c2ecf20Sopenharmony_ci			      unsigned int domid,
878c2ecf20Sopenharmony_ci			      struct page **pages);
888c2ecf20Sopenharmony_ciint xen_xlate_unmap_gfn_range(struct vm_area_struct *vma,
898c2ecf20Sopenharmony_ci			      int nr, struct page **pages);
908c2ecf20Sopenharmony_ci#else
918c2ecf20Sopenharmony_ci/*
928c2ecf20Sopenharmony_ci * These two functions are called from arch/x86/xen/mmu.c and so stubs
938c2ecf20Sopenharmony_ci * are needed for a configuration not specifying CONFIG_XEN_AUTO_XLATE.
948c2ecf20Sopenharmony_ci */
958c2ecf20Sopenharmony_cistatic inline int xen_xlate_remap_gfn_array(struct vm_area_struct *vma,
968c2ecf20Sopenharmony_ci					    unsigned long addr,
978c2ecf20Sopenharmony_ci					    xen_pfn_t *gfn, int nr,
988c2ecf20Sopenharmony_ci					    int *err_ptr, pgprot_t prot,
998c2ecf20Sopenharmony_ci					    unsigned int domid,
1008c2ecf20Sopenharmony_ci					    struct page **pages)
1018c2ecf20Sopenharmony_ci{
1028c2ecf20Sopenharmony_ci	return -EOPNOTSUPP;
1038c2ecf20Sopenharmony_ci}
1048c2ecf20Sopenharmony_ci
1058c2ecf20Sopenharmony_cistatic inline int xen_xlate_unmap_gfn_range(struct vm_area_struct *vma,
1068c2ecf20Sopenharmony_ci					    int nr, struct page **pages)
1078c2ecf20Sopenharmony_ci{
1088c2ecf20Sopenharmony_ci	return -EOPNOTSUPP;
1098c2ecf20Sopenharmony_ci}
1108c2ecf20Sopenharmony_ci#endif
1118c2ecf20Sopenharmony_ci
1128c2ecf20Sopenharmony_ciint xen_remap_vma_range(struct vm_area_struct *vma, unsigned long addr,
1138c2ecf20Sopenharmony_ci			unsigned long len);
1148c2ecf20Sopenharmony_ci
1158c2ecf20Sopenharmony_ci/*
1168c2ecf20Sopenharmony_ci * xen_remap_domain_gfn_array() - map an array of foreign frames by gfn
1178c2ecf20Sopenharmony_ci * @vma:     VMA to map the pages into
1188c2ecf20Sopenharmony_ci * @addr:    Address at which to map the pages
1198c2ecf20Sopenharmony_ci * @gfn:     Array of GFNs to map
1208c2ecf20Sopenharmony_ci * @nr:      Number entries in the GFN array
1218c2ecf20Sopenharmony_ci * @err_ptr: Returns per-GFN error status.
1228c2ecf20Sopenharmony_ci * @prot:    page protection mask
1238c2ecf20Sopenharmony_ci * @domid:   Domain owning the pages
1248c2ecf20Sopenharmony_ci * @pages:   Array of pages if this domain has an auto-translated physmap
1258c2ecf20Sopenharmony_ci *
1268c2ecf20Sopenharmony_ci * @gfn and @err_ptr may point to the same buffer, the GFNs will be
1278c2ecf20Sopenharmony_ci * overwritten by the error codes after they are mapped.
1288c2ecf20Sopenharmony_ci *
1298c2ecf20Sopenharmony_ci * Returns the number of successfully mapped frames, or a -ve error
1308c2ecf20Sopenharmony_ci * code.
1318c2ecf20Sopenharmony_ci */
1328c2ecf20Sopenharmony_cistatic inline int xen_remap_domain_gfn_array(struct vm_area_struct *vma,
1338c2ecf20Sopenharmony_ci					     unsigned long addr,
1348c2ecf20Sopenharmony_ci					     xen_pfn_t *gfn, int nr,
1358c2ecf20Sopenharmony_ci					     int *err_ptr, pgprot_t prot,
1368c2ecf20Sopenharmony_ci					     unsigned int domid,
1378c2ecf20Sopenharmony_ci					     struct page **pages)
1388c2ecf20Sopenharmony_ci{
1398c2ecf20Sopenharmony_ci	if (xen_feature(XENFEAT_auto_translated_physmap))
1408c2ecf20Sopenharmony_ci		return xen_xlate_remap_gfn_array(vma, addr, gfn, nr, err_ptr,
1418c2ecf20Sopenharmony_ci						 prot, domid, pages);
1428c2ecf20Sopenharmony_ci
1438c2ecf20Sopenharmony_ci	/* We BUG_ON because it's a programmer error to pass a NULL err_ptr,
1448c2ecf20Sopenharmony_ci	 * and the consequences later is quite hard to detect what the actual
1458c2ecf20Sopenharmony_ci	 * cause of "wrong memory was mapped in".
1468c2ecf20Sopenharmony_ci	 */
1478c2ecf20Sopenharmony_ci	BUG_ON(err_ptr == NULL);
1488c2ecf20Sopenharmony_ci	return xen_remap_pfn(vma, addr, gfn, nr, err_ptr, prot, domid,
1498c2ecf20Sopenharmony_ci			     false, pages);
1508c2ecf20Sopenharmony_ci}
1518c2ecf20Sopenharmony_ci
1528c2ecf20Sopenharmony_ci/*
1538c2ecf20Sopenharmony_ci * xen_remap_domain_mfn_array() - map an array of foreign frames by mfn
1548c2ecf20Sopenharmony_ci * @vma:     VMA to map the pages into
1558c2ecf20Sopenharmony_ci * @addr:    Address at which to map the pages
1568c2ecf20Sopenharmony_ci * @mfn:     Array of MFNs to map
1578c2ecf20Sopenharmony_ci * @nr:      Number entries in the MFN array
1588c2ecf20Sopenharmony_ci * @err_ptr: Returns per-MFN error status.
1598c2ecf20Sopenharmony_ci * @prot:    page protection mask
1608c2ecf20Sopenharmony_ci * @domid:   Domain owning the pages
1618c2ecf20Sopenharmony_ci * @pages:   Array of pages if this domain has an auto-translated physmap
1628c2ecf20Sopenharmony_ci *
1638c2ecf20Sopenharmony_ci * @mfn and @err_ptr may point to the same buffer, the MFNs will be
1648c2ecf20Sopenharmony_ci * overwritten by the error codes after they are mapped.
1658c2ecf20Sopenharmony_ci *
1668c2ecf20Sopenharmony_ci * Returns the number of successfully mapped frames, or a -ve error
1678c2ecf20Sopenharmony_ci * code.
1688c2ecf20Sopenharmony_ci */
1698c2ecf20Sopenharmony_cistatic inline int xen_remap_domain_mfn_array(struct vm_area_struct *vma,
1708c2ecf20Sopenharmony_ci					     unsigned long addr, xen_pfn_t *mfn,
1718c2ecf20Sopenharmony_ci					     int nr, int *err_ptr,
1728c2ecf20Sopenharmony_ci					     pgprot_t prot, unsigned int domid,
1738c2ecf20Sopenharmony_ci					     struct page **pages)
1748c2ecf20Sopenharmony_ci{
1758c2ecf20Sopenharmony_ci	if (xen_feature(XENFEAT_auto_translated_physmap))
1768c2ecf20Sopenharmony_ci		return -EOPNOTSUPP;
1778c2ecf20Sopenharmony_ci
1788c2ecf20Sopenharmony_ci	return xen_remap_pfn(vma, addr, mfn, nr, err_ptr, prot, domid,
1798c2ecf20Sopenharmony_ci			     true, pages);
1808c2ecf20Sopenharmony_ci}
1818c2ecf20Sopenharmony_ci
1828c2ecf20Sopenharmony_ci/* xen_remap_domain_gfn_range() - map a range of foreign frames
1838c2ecf20Sopenharmony_ci * @vma:     VMA to map the pages into
1848c2ecf20Sopenharmony_ci * @addr:    Address at which to map the pages
1858c2ecf20Sopenharmony_ci * @gfn:     First GFN to map.
1868c2ecf20Sopenharmony_ci * @nr:      Number frames to map
1878c2ecf20Sopenharmony_ci * @prot:    page protection mask
1888c2ecf20Sopenharmony_ci * @domid:   Domain owning the pages
1898c2ecf20Sopenharmony_ci * @pages:   Array of pages if this domain has an auto-translated physmap
1908c2ecf20Sopenharmony_ci *
1918c2ecf20Sopenharmony_ci * Returns the number of successfully mapped frames, or a -ve error
1928c2ecf20Sopenharmony_ci * code.
1938c2ecf20Sopenharmony_ci */
1948c2ecf20Sopenharmony_cistatic inline int xen_remap_domain_gfn_range(struct vm_area_struct *vma,
1958c2ecf20Sopenharmony_ci					     unsigned long addr,
1968c2ecf20Sopenharmony_ci					     xen_pfn_t gfn, int nr,
1978c2ecf20Sopenharmony_ci					     pgprot_t prot, unsigned int domid,
1988c2ecf20Sopenharmony_ci					     struct page **pages)
1998c2ecf20Sopenharmony_ci{
2008c2ecf20Sopenharmony_ci	if (xen_feature(XENFEAT_auto_translated_physmap))
2018c2ecf20Sopenharmony_ci		return -EOPNOTSUPP;
2028c2ecf20Sopenharmony_ci
2038c2ecf20Sopenharmony_ci	return xen_remap_pfn(vma, addr, &gfn, nr, NULL, prot, domid, false,
2048c2ecf20Sopenharmony_ci			     pages);
2058c2ecf20Sopenharmony_ci}
2068c2ecf20Sopenharmony_ci
2078c2ecf20Sopenharmony_ciint xen_unmap_domain_gfn_range(struct vm_area_struct *vma,
2088c2ecf20Sopenharmony_ci			       int numpgs, struct page **pages);
2098c2ecf20Sopenharmony_ci
2108c2ecf20Sopenharmony_ciint xen_xlate_map_ballooned_pages(xen_pfn_t **pfns, void **vaddr,
2118c2ecf20Sopenharmony_ci				  unsigned long nr_grant_frames);
2128c2ecf20Sopenharmony_ci
2138c2ecf20Sopenharmony_cibool xen_running_on_version_or_later(unsigned int major, unsigned int minor);
2148c2ecf20Sopenharmony_ci
2158c2ecf20Sopenharmony_civoid xen_efi_runtime_setup(void);
2168c2ecf20Sopenharmony_ci
2178c2ecf20Sopenharmony_ci
2188c2ecf20Sopenharmony_ci#if defined(CONFIG_XEN_PV) && !defined(CONFIG_PREEMPTION)
2198c2ecf20Sopenharmony_ci
2208c2ecf20Sopenharmony_ciDECLARE_PER_CPU(bool, xen_in_preemptible_hcall);
2218c2ecf20Sopenharmony_ci
2228c2ecf20Sopenharmony_cistatic inline void xen_preemptible_hcall_begin(void)
2238c2ecf20Sopenharmony_ci{
2248c2ecf20Sopenharmony_ci	__this_cpu_write(xen_in_preemptible_hcall, true);
2258c2ecf20Sopenharmony_ci}
2268c2ecf20Sopenharmony_ci
2278c2ecf20Sopenharmony_cistatic inline void xen_preemptible_hcall_end(void)
2288c2ecf20Sopenharmony_ci{
2298c2ecf20Sopenharmony_ci	__this_cpu_write(xen_in_preemptible_hcall, false);
2308c2ecf20Sopenharmony_ci}
2318c2ecf20Sopenharmony_ci
2328c2ecf20Sopenharmony_ci#else
2338c2ecf20Sopenharmony_ci
2348c2ecf20Sopenharmony_cistatic inline void xen_preemptible_hcall_begin(void) { }
2358c2ecf20Sopenharmony_cistatic inline void xen_preemptible_hcall_end(void) { }
2368c2ecf20Sopenharmony_ci
2378c2ecf20Sopenharmony_ci#endif /* CONFIG_XEN_PV && !CONFIG_PREEMPTION */
2388c2ecf20Sopenharmony_ci
2398c2ecf20Sopenharmony_ci#endif /* INCLUDE_XEN_OPS_H */
240