@@ -64,6 +64,7 @@
#include <compat/vcpu.h>
#include <asm/psr.h>
#include <asm/pv/domain.h>
+#include <asm/pv/mm.h>
DEFINE_PER_CPU(struct vcpu *, curr_vcpu);
@@ -992,7 +993,7 @@ int arch_set_info_guest(
return rc;
if ( !compat )
- rc = (int)set_gdt(v, c.nat->gdt_frames, c.nat->gdt_ents);
+ rc = (int)pv_set_gdt(v, c.nat->gdt_frames, c.nat->gdt_ents);
else
{
unsigned long gdt_frames[ARRAY_SIZE(v->arch.pv_vcpu.gdt_frames)];
@@ -1002,7 +1003,7 @@ int arch_set_info_guest(
return -EINVAL;
for ( i = 0; i < n; ++i )
gdt_frames[i] = c.cmp->gdt_frames[i];
- rc = (int)set_gdt(v, gdt_frames, c.cmp->gdt_ents);
+ rc = (int)pv_set_gdt(v, gdt_frames, c.cmp->gdt_ents);
}
if ( rc != 0 )
return rc;
@@ -1101,7 +1102,7 @@ int arch_set_info_guest(
{
if ( cr3_page )
put_page(cr3_page);
- destroy_gdt(v);
+ pv_destroy_gdt(v);
return rc;
}
@@ -1153,7 +1154,7 @@ int arch_vcpu_reset(struct vcpu *v)
{
if ( is_pv_vcpu(v) )
{
- destroy_gdt(v);
+ pv_destroy_gdt(v);
return vcpu_destroy_pagetables(v);
}
@@ -1896,7 +1897,7 @@ int domain_relinquish_resources(struct domain *d)
* the LDT as it automatically gets squashed with the guest
* mappings.
*/
- destroy_gdt(v);
+ pv_destroy_gdt(v);
}
}
@@ -3858,7 +3858,7 @@ long do_update_va_mapping_otherdomain(unsigned long va, u64 val64,
* Descriptor Tables
*/
-void destroy_gdt(struct vcpu *v)
+void pv_destroy_gdt(struct vcpu *v)
{
l1_pgentry_t *pl1e;
unsigned int i;
@@ -3877,9 +3877,7 @@ void destroy_gdt(struct vcpu *v)
}
-long set_gdt(struct vcpu *v,
- unsigned long *frames,
- unsigned int entries)
+long pv_set_gdt(struct vcpu *v, unsigned long *frames, unsigned int entries)
{
struct domain *d = v->domain;
l1_pgentry_t *pl1e;
@@ -3906,7 +3904,7 @@ long set_gdt(struct vcpu *v,
}
/* Tear down the old GDT. */
- destroy_gdt(v);
+ pv_destroy_gdt(v);
/* Install the new GDT. */
v->arch.pv_vcpu.gdt_ents = entries;
@@ -3945,7 +3943,7 @@ long do_set_gdt(XEN_GUEST_HANDLE_PARAM(xen_ulong_t) frame_list,
domain_lock(curr->domain);
- if ( (ret = set_gdt(curr, frames, entries)) == 0 )
+ if ( (ret = pv_set_gdt(curr, frames, entries)) == 0 )
flush_tlb_local();
domain_unlock(curr->domain);
@@ -6,6 +6,8 @@
#include <asm/mem_paging.h>
#include <asm/mem_sharing.h>
+#include <asm/pv/mm.h>
+
int compat_set_gdt(XEN_GUEST_HANDLE_PARAM(uint) frame_list, unsigned int entries)
{
unsigned int i, nr_pages = (entries + 511) / 512;
@@ -31,7 +33,7 @@ int compat_set_gdt(XEN_GUEST_HANDLE_PARAM(uint) frame_list, unsigned int entries
domain_lock(current->domain);
- if ( (ret = set_gdt(current, frames, entries)) == 0 )
+ if ( (ret = pv_set_gdt(current, frames, entries)) == 0 )
flush_tlb_local();
domain_unlock(current->domain);
@@ -467,11 +467,6 @@ extern void init_int80_direct_trap(struct vcpu *v);
extern void write_ptbase(struct vcpu *v);
-void destroy_gdt(struct vcpu *d);
-long set_gdt(struct vcpu *d,
- unsigned long *frames,
- unsigned int entries);
-
/* REP NOP (PAUSE) is a good thing to insert into busy-wait loops. */
static always_inline void rep_nop(void)
{
@@ -25,14 +25,24 @@
int pv_ro_page_fault(unsigned long addr, struct cpu_user_regs *regs);
+long pv_set_gdt(struct vcpu *d, unsigned long *frames, unsigned int entries);
+void pv_destroy_gdt(struct vcpu *d);
+
#else
+#include <xen/errno.h>
+
static inline int pv_ro_page_fault(unsigned long addr,
struct cpu_user_regs *regs)
{
return 0;
}
+static inline long pv_set_gdt(struct vcpu *d, unsigned long *frames,
+ unsigned int entries)
+{ return -EINVAL; }
+static inline void pv_destroy_gdt(struct vcpu *d) {}
+
#endif
#endif /* __X86_PV_MM_H__ */
Unfortunately they can't stay local to PV code because domain.c still needs them. Change their names and fix up call sites. The code will be moved later together with other descriptor table manipulation code. Also move the declarations to pv/mm.h and provide stubs. Signed-off-by: Wei Liu <wei.liu2@citrix.com> --- xen/arch/x86/domain.c | 11 ++++++----- xen/arch/x86/mm.c | 10 ++++------ xen/arch/x86/x86_64/compat/mm.c | 4 +++- xen/include/asm-x86/processor.h | 5 ----- xen/include/asm-x86/pv/mm.h | 10 ++++++++++ 5 files changed, 23 insertions(+), 17 deletions(-)