hc
2024-10-22 8ac6c7a54ed1b98d142dce24b11c6de6a1e239a5
kernel/include/xen/xen-ops.h
....@@ -5,6 +5,7 @@
55 #include <linux/percpu.h>
66 #include <linux/notifier.h>
77 #include <linux/efi.h>
8
+#include <xen/features.h>
89 #include <asm/xen/interface.h>
910 #include <xen/interface/vcpu.h>
1011
....@@ -60,80 +61,29 @@
6061 unsigned int order) { }
6162 #endif
6263
64
+#if defined(CONFIG_XEN_PV)
65
+int 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
69
+static 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
+
6379 struct vm_area_struct;
64
-
65
-/*
66
- * xen_remap_domain_gfn_array() - map an array of foreign frames by gfn
67
- * @vma: VMA to map the pages into
68
- * @addr: Address at which to map the pages
69
- * @gfn: Array of GFNs to map
70
- * @nr: Number entries in the GFN array
71
- * @err_ptr: Returns per-GFN error status.
72
- * @prot: page protection mask
73
- * @domid: Domain owning the pages
74
- * @pages: Array of pages if this domain has an auto-translated physmap
75
- *
76
- * @gfn and @err_ptr may point to the same buffer, the GFNs will be
77
- * overwritten by the error codes after they are mapped.
78
- *
79
- * Returns the number of successfully mapped frames, or a -ve error
80
- * code.
81
- */
82
-int xen_remap_domain_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 domid,
87
- struct page **pages);
88
-
89
-/*
90
- * xen_remap_domain_mfn_array() - map an array of foreign frames by mfn
91
- * @vma: VMA to map the pages into
92
- * @addr: Address at which to map the pages
93
- * @mfn: Array of MFNs to map
94
- * @nr: Number entries in the MFN array
95
- * @err_ptr: Returns per-MFN error status.
96
- * @prot: page protection mask
97
- * @domid: Domain owning the pages
98
- * @pages: Array of pages if this domain has an auto-translated physmap
99
- *
100
- * @mfn and @err_ptr may point to the same buffer, the MFNs will be
101
- * overwritten by the error codes after they are mapped.
102
- *
103
- * Returns the number of successfully mapped frames, or a -ve error
104
- * code.
105
- */
106
-int xen_remap_domain_mfn_array(struct vm_area_struct *vma,
107
- unsigned long addr, xen_pfn_t *mfn, int nr,
108
- int *err_ptr, pgprot_t prot,
109
- unsigned int domid, struct page **pages);
110
-
111
-/* xen_remap_domain_gfn_range() - map a range of foreign frames
112
- * @vma: VMA to map the pages into
113
- * @addr: Address at which to map the pages
114
- * @gfn: First GFN to map.
115
- * @nr: Number frames to map
116
- * @prot: page protection mask
117
- * @domid: Domain owning the pages
118
- * @pages: Array of pages if this domain has an auto-translated physmap
119
- *
120
- * Returns the number of successfully mapped frames, or a -ve error
121
- * code.
122
- */
123
-int xen_remap_domain_gfn_range(struct vm_area_struct *vma,
124
- unsigned long addr,
125
- xen_pfn_t gfn, int nr,
126
- pgprot_t prot, unsigned domid,
127
- struct page **pages);
128
-int xen_unmap_domain_gfn_range(struct vm_area_struct *vma,
129
- int numpgs, struct page **pages);
13080
13181 #ifdef CONFIG_XEN_AUTO_XLATE
13282 int xen_xlate_remap_gfn_array(struct vm_area_struct *vma,
13383 unsigned long addr,
13484 xen_pfn_t *gfn, int nr,
13585 int *err_ptr, pgprot_t prot,
136
- unsigned domid,
86
+ unsigned int domid,
13787 struct page **pages);
13888 int xen_xlate_unmap_gfn_range(struct vm_area_struct *vma,
13989 int nr, struct page **pages);
....@@ -159,48 +109,113 @@
159109 }
160110 #endif
161111
112
+int xen_remap_vma_range(struct vm_area_struct *vma, unsigned long addr,
113
+ unsigned long len);
114
+
115
+/*
116
+ * xen_remap_domain_gfn_array() - map an array of foreign frames by gfn
117
+ * @vma: VMA to map the pages into
118
+ * @addr: Address at which to map the pages
119
+ * @gfn: Array of GFNs to map
120
+ * @nr: Number entries in the GFN array
121
+ * @err_ptr: Returns per-GFN error status.
122
+ * @prot: page protection mask
123
+ * @domid: Domain owning the pages
124
+ * @pages: Array of pages if this domain has an auto-translated physmap
125
+ *
126
+ * @gfn and @err_ptr may point to the same buffer, the GFNs will be
127
+ * overwritten by the error codes after they are mapped.
128
+ *
129
+ * Returns the number of successfully mapped frames, or a -ve error
130
+ * code.
131
+ */
132
+static inline int xen_remap_domain_gfn_array(struct vm_area_struct *vma,
133
+ unsigned long addr,
134
+ xen_pfn_t *gfn, int nr,
135
+ int *err_ptr, pgprot_t prot,
136
+ unsigned int domid,
137
+ struct page **pages)
138
+{
139
+ if (xen_feature(XENFEAT_auto_translated_physmap))
140
+ return xen_xlate_remap_gfn_array(vma, addr, gfn, nr, err_ptr,
141
+ prot, domid, pages);
142
+
143
+ /* We BUG_ON because it's a programmer error to pass a NULL err_ptr,
144
+ * and the consequences later is quite hard to detect what the actual
145
+ * cause of "wrong memory was mapped in".
146
+ */
147
+ BUG_ON(err_ptr == NULL);
148
+ return xen_remap_pfn(vma, addr, gfn, nr, err_ptr, prot, domid,
149
+ false, pages);
150
+}
151
+
152
+/*
153
+ * xen_remap_domain_mfn_array() - map an array of foreign frames by mfn
154
+ * @vma: VMA to map the pages into
155
+ * @addr: Address at which to map the pages
156
+ * @mfn: Array of MFNs to map
157
+ * @nr: Number entries in the MFN array
158
+ * @err_ptr: Returns per-MFN error status.
159
+ * @prot: page protection mask
160
+ * @domid: Domain owning the pages
161
+ * @pages: Array of pages if this domain has an auto-translated physmap
162
+ *
163
+ * @mfn and @err_ptr may point to the same buffer, the MFNs will be
164
+ * overwritten by the error codes after they are mapped.
165
+ *
166
+ * Returns the number of successfully mapped frames, or a -ve error
167
+ * code.
168
+ */
169
+static inline int xen_remap_domain_mfn_array(struct vm_area_struct *vma,
170
+ unsigned long addr, xen_pfn_t *mfn,
171
+ int nr, int *err_ptr,
172
+ pgprot_t prot, unsigned int domid,
173
+ struct page **pages)
174
+{
175
+ if (xen_feature(XENFEAT_auto_translated_physmap))
176
+ return -EOPNOTSUPP;
177
+
178
+ return xen_remap_pfn(vma, addr, mfn, nr, err_ptr, prot, domid,
179
+ true, pages);
180
+}
181
+
182
+/* xen_remap_domain_gfn_range() - map a range of foreign frames
183
+ * @vma: VMA to map the pages into
184
+ * @addr: Address at which to map the pages
185
+ * @gfn: First GFN to map.
186
+ * @nr: Number frames to map
187
+ * @prot: page protection mask
188
+ * @domid: Domain owning the pages
189
+ * @pages: Array of pages if this domain has an auto-translated physmap
190
+ *
191
+ * Returns the number of successfully mapped frames, or a -ve error
192
+ * code.
193
+ */
194
+static inline int xen_remap_domain_gfn_range(struct vm_area_struct *vma,
195
+ unsigned long addr,
196
+ xen_pfn_t gfn, int nr,
197
+ pgprot_t prot, unsigned int domid,
198
+ struct page **pages)
199
+{
200
+ if (xen_feature(XENFEAT_auto_translated_physmap))
201
+ return -EOPNOTSUPP;
202
+
203
+ return xen_remap_pfn(vma, addr, &gfn, nr, NULL, prot, domid, false,
204
+ pages);
205
+}
206
+
207
+int xen_unmap_domain_gfn_range(struct vm_area_struct *vma,
208
+ int numpgs, struct page **pages);
209
+
162210 int xen_xlate_map_ballooned_pages(xen_pfn_t **pfns, void **vaddr,
163211 unsigned long nr_grant_frames);
164212
165213 bool xen_running_on_version_or_later(unsigned int major, unsigned int minor);
166214
167
-efi_status_t xen_efi_get_time(efi_time_t *tm, efi_time_cap_t *tc);
168
-efi_status_t xen_efi_set_time(efi_time_t *tm);
169
-efi_status_t xen_efi_get_wakeup_time(efi_bool_t *enabled, efi_bool_t *pending,
170
- efi_time_t *tm);
171
-efi_status_t xen_efi_set_wakeup_time(efi_bool_t enabled, efi_time_t *tm);
172
-efi_status_t xen_efi_get_variable(efi_char16_t *name, efi_guid_t *vendor,
173
- u32 *attr, unsigned long *data_size,
174
- void *data);
175
-efi_status_t xen_efi_get_next_variable(unsigned long *name_size,
176
- efi_char16_t *name, efi_guid_t *vendor);
177
-efi_status_t xen_efi_set_variable(efi_char16_t *name, efi_guid_t *vendor,
178
- u32 attr, unsigned long data_size,
179
- void *data);
180
-efi_status_t xen_efi_query_variable_info(u32 attr, u64 *storage_space,
181
- u64 *remaining_space,
182
- u64 *max_variable_size);
183
-efi_status_t xen_efi_get_next_high_mono_count(u32 *count);
184
-efi_status_t xen_efi_update_capsule(efi_capsule_header_t **capsules,
185
- unsigned long count, unsigned long sg_list);
186
-efi_status_t xen_efi_query_capsule_caps(efi_capsule_header_t **capsules,
187
- unsigned long count, u64 *max_size,
188
- int *reset_type);
189
-void xen_efi_reset_system(int reset_type, efi_status_t status,
190
- unsigned long data_size, efi_char16_t *data);
215
+void xen_efi_runtime_setup(void);
191216
192217
193
-#ifdef CONFIG_PREEMPT
194
-
195
-static inline void xen_preemptible_hcall_begin(void)
196
-{
197
-}
198
-
199
-static inline void xen_preemptible_hcall_end(void)
200
-{
201
-}
202
-
203
-#else
218
+#if defined(CONFIG_XEN_PV) && !defined(CONFIG_PREEMPTION)
204219
205220 DECLARE_PER_CPU(bool, xen_in_preemptible_hcall);
206221
....@@ -214,6 +229,11 @@
214229 __this_cpu_write(xen_in_preemptible_hcall, false);
215230 }
216231
217
-#endif /* CONFIG_PREEMPT */
232
+#else
233
+
234
+static inline void xen_preemptible_hcall_begin(void) { }
235
+static inline void xen_preemptible_hcall_end(void) { }
236
+
237
+#endif /* CONFIG_XEN_PV && !CONFIG_PREEMPTION */
218238
219239 #endif /* INCLUDE_XEN_OPS_H */