--- arch/x86/include/asm/xen/interface.h | 8 +++++++- arch/x86/include/asm/xen/page.h | 3 +++ arch/x86/xen/irq.c | 5 ++++- arch/x86/xen/p2m.c | 2 +- drivers/xen/cpu_hotplug.c | 4 +++- drivers/xen/events.c | 12 ++++++++---- drivers/xen/xenbus/xenbus_client.c | 2 +- drivers/xen/xenbus/xenbus_probe.c | 6 +++++- include/xen/interface/memory.h | 27 +++++++++++++++++++++++++++ include/xen/interface/physdev.h | 10 ++++++++++ 10 files changed, 69 insertions(+), 10 deletions(-) diff --git a/arch/x86/include/asm/xen/interface.h b/arch/x86/include/asm/xen/interface.h index cbf0c9d..1d22131 100644 --- a/arch/x86/include/asm/xen/interface.h +++ b/arch/x86/include/asm/xen/interface.h @@ -136,7 +136,13 @@ struct vcpu_guest_context { struct cpu_user_regs user_regs; /* User-level CPU registers */ struct trap_info trap_ctxt[256]; /* Virtual IDT */ unsigned long ldt_base, ldt_ents; /* LDT (linear address, # ents) */ - unsigned long gdt_frames[16], gdt_ents; /* GDT (machine frames, # ents) */ + union { + struct { + /* PV: GDT (machine frames, # ents).*/ + unsigned long gdt_frames[16], gdt_ents; + }; + unsigned long gdtaddr, gdtsz; /* PVH: GDTR addr and size */ + }; unsigned long kernel_ss, kernel_sp; /* Virtual TSS (only SS1/SP1) */ /* NB. User pagetable on x86/64 is placed in ctrlreg[1]. */ unsigned long ctrlreg[8]; /* CR0-CR7 (control registers) */ diff --git a/arch/x86/include/asm/xen/page.h b/arch/x86/include/asm/xen/page.h index 93971e8..d1cfb96 100644 --- a/arch/x86/include/asm/xen/page.h +++ b/arch/x86/include/asm/xen/page.h @@ -158,6 +158,9 @@ static inline xpaddr_t machine_to_phys(xmaddr_t machine) static inline unsigned long mfn_to_local_pfn(unsigned long mfn) { unsigned long pfn = mfn_to_pfn(mfn); + + if (xen_feature(XENFEAT_auto_translated_physmap)) + return mfn; if (get_phys_to_machine(pfn) != mfn) return -1; /* force !pfn_valid() */ return pfn; diff --git a/arch/x86/xen/irq.c b/arch/x86/xen/irq.c index 1573376..31959a7 100644 --- a/arch/x86/xen/irq.c +++ b/arch/x86/xen/irq.c @@ -5,6 +5,7 @@ #include <xen/interface/xen.h> #include <xen/interface/sched.h> #include <xen/interface/vcpu.h> +#include <xen/features.h> #include <asm/xen/hypercall.h> #include <asm/xen/hypervisor.h> @@ -128,6 +129,8 @@ static const struct pv_irq_ops xen_irq_ops __initconst = { void __init xen_init_irq_ops(void) { - pv_irq_ops = xen_irq_ops; + /* For PVH we use default pv_irq_ops settings */ + if (!xen_feature(XENFEAT_hvm_callback_vector)) + pv_irq_ops = xen_irq_ops; x86_init.irqs.intr_init = xen_init_IRQ; } diff --git a/arch/x86/xen/p2m.c b/arch/x86/xen/p2m.c index 64effdc..a954f83 100644 --- a/arch/x86/xen/p2m.c +++ b/arch/x86/xen/p2m.c @@ -626,7 +626,7 @@ bool __set_phys_to_machine(unsigned long pfn, unsigned long mfn) { unsigned topidx, mididx, idx; - if (unlikely(xen_feature(XENFEAT_auto_translated_physmap))) { + if (xen_feature(XENFEAT_auto_translated_physmap)) { BUG_ON(pfn != mfn && mfn != INVALID_P2M_ENTRY); return true; } diff --git a/drivers/xen/cpu_hotplug.c b/drivers/xen/cpu_hotplug.c index 4dcfced..de6bcf9 100644 --- a/drivers/xen/cpu_hotplug.c +++ b/drivers/xen/cpu_hotplug.c @@ -2,6 +2,7 @@ #include <xen/xen.h> #include <xen/xenbus.h> +#include <xen/features.h> #include <asm/xen/hypervisor.h> #include <asm/cpu.h> @@ -100,7 +101,8 @@ static int __init setup_vcpu_hotplug_event(void) static struct notifier_block xsn_cpu = { .notifier_call = setup_cpu_watcher }; - if (!xen_pv_domain()) + /* PVH TBD/FIXME: future work */ + if (!xen_pv_domain() || xen_feature(XENFEAT_auto_translated_physmap)) return -ENODEV; register_xenstore_notifier(&xsn_cpu); diff --git a/drivers/xen/events.c b/drivers/xen/events.c index 7595581..f656791 100644 --- a/drivers/xen/events.c +++ b/drivers/xen/events.c @@ -1755,7 +1755,7 @@ int xen_set_callback_via(uint64_t via) } EXPORT_SYMBOL_GPL(xen_set_callback_via); -#ifdef CONFIG_XEN_PVHVM + /* Vector callbacks are better than PCI interrupts to receive event * channel notifications because we can receive vector callbacks on any * vcpu and we don''t need PCI support or APIC interactions. */ @@ -1779,9 +1779,6 @@ void xen_callback_vector(void) alloc_intr_gate(XEN_HVM_EVTCHN_CALLBACK, xen_hvm_callback_vector); } } -#else -void xen_callback_vector(void) {} -#endif void __init xen_init_IRQ(void) { @@ -1814,6 +1811,13 @@ void __init xen_init_IRQ(void) if (xen_initial_domain()) pci_xen_initial_domain(); + if (xen_feature(XENFEAT_hvm_callback_vector)) { + xen_callback_vector(); + return; + } + + /* PVH: TBD/FIXME: debug and fix eio map to work with pvh */ + pirq_eoi_map = (void *)__get_free_page(GFP_KERNEL|__GFP_ZERO); eoi_gmfn.gmfn = virt_to_mfn(pirq_eoi_map); rc = HYPERVISOR_physdev_op(PHYSDEVOP_pirq_eoi_gmfn_v2, &eoi_gmfn); diff --git a/drivers/xen/xenbus/xenbus_client.c b/drivers/xen/xenbus/xenbus_client.c index b3e146e..a81e66b 100644 --- a/drivers/xen/xenbus/xenbus_client.c +++ b/drivers/xen/xenbus/xenbus_client.c @@ -743,7 +743,7 @@ static const struct xenbus_ring_ops ring_ops_hvm = { void __init xenbus_ring_ops_init(void) { - if (xen_pv_domain()) + if (xen_pv_domain() && !xen_feature(XENFEAT_auto_translated_physmap)) ring_ops = &ring_ops_pv; else ring_ops = &ring_ops_hvm; diff --git a/drivers/xen/xenbus/xenbus_probe.c b/drivers/xen/xenbus/xenbus_probe.c index b793723..481dc72 100644 --- a/drivers/xen/xenbus/xenbus_probe.c +++ b/drivers/xen/xenbus/xenbus_probe.c @@ -749,7 +749,11 @@ static int __init xenbus_init(void) if (err) goto out_error; } - xen_store_interface = mfn_to_virt(xen_store_mfn); + if (xen_feature(XENFEAT_auto_translated_physmap)) + /* mfn is actually a pfn */ + xen_store_interface = __va(xen_store_mfn<<PAGE_SHIFT); + else + xen_store_interface = mfn_to_virt(xen_store_mfn); } /* Initialize the interface to xenstore. */ diff --git a/include/xen/interface/memory.h b/include/xen/interface/memory.h index eac3ce1..f150fa1c 100644 --- a/include/xen/interface/memory.h +++ b/include/xen/interface/memory.h @@ -163,11 +163,22 @@ struct xen_add_to_physmap { /* Which domain to change the mapping for. */ domid_t domid; + union { + /* Number of pages to go through for gmfn_range */ + uint16_t size; + /* IFF XENMAPSPACE_gmfn_foreign */ + domid_t foreign_domid; + } u; /* Source mapping space. */ #define XENMAPSPACE_shared_info 0 /* shared info page */ #define XENMAPSPACE_grant_table 1 /* grant table page */ +#define XENMAPSPACE_gmfn 2 /* GMFN */ +#define XENMAPSPACE_gmfn_range 3 /* GMFN range */ +#define XENMAPSPACE_gmfn_foreign 4 /* GMFN from another guest */ unsigned int space; +#define XENMAPIDX_grant_table_status 0x80000000 + /* Index into source mapping space. */ unsigned long idx; @@ -234,4 +245,20 @@ DEFINE_GUEST_HANDLE_STRUCT(xen_memory_map); * during a driver critical region. */ extern spinlock_t xen_reservation_lock; + +/* + * Unmaps the page appearing at a particular GPFN from the specified guest''s + * pseudophysical address space. + * arg == addr of xen_remove_from_physmap_t. + */ +#define XENMEM_remove_from_physmap 15 +struct xen_remove_from_physmap { + /* Which domain to change the mapping for. */ + domid_t domid; + + /* GPFN of the current mapping of the page. */ + unsigned long gpfn; +}; +DEFINE_GUEST_HANDLE_STRUCT(xen_remove_from_physmap); + #endif /* __XEN_PUBLIC_MEMORY_H__ */ diff --git a/include/xen/interface/physdev.h b/include/xen/interface/physdev.h index 9ce788d..80f792e 100644 --- a/include/xen/interface/physdev.h +++ b/include/xen/interface/physdev.h @@ -258,6 +258,16 @@ struct physdev_pci_device { uint8_t devfn; }; +#define PHYSDEVOP_pvh_map_iomem 29 +struct physdev_map_iomem { + /* IN */ + uint64_t first_gfn; + uint64_t first_mfn; + uint32_t nr_mfns; + uint32_t add_mapping; /* 1 == add mapping; 0 == unmap */ + +}; + /* * Notify that some PIRQ-bound event channels have been unmasked. * ** This command is obsolete since interface version 0x00030202 and is ** -- 1.7.2.3
Stefano Stabellini
2012-Sep-24 11:26 UTC
Re: [PATCH v1 1/8]: PVH basic and hader file changes
On Fri, 21 Sep 2012, Mukesh Rathor wrote:> --- > arch/x86/include/asm/xen/interface.h | 8 +++++++- > arch/x86/include/asm/xen/page.h | 3 +++ > arch/x86/xen/irq.c | 5 ++++- > arch/x86/xen/p2m.c | 2 +- > drivers/xen/cpu_hotplug.c | 4 +++- > drivers/xen/events.c | 12 ++++++++---- > drivers/xen/xenbus/xenbus_client.c | 2 +- > drivers/xen/xenbus/xenbus_probe.c | 6 +++++- > include/xen/interface/memory.h | 27 +++++++++++++++++++++++++++ > include/xen/interface/physdev.h | 10 ++++++++++ > 10 files changed, 69 insertions(+), 10 deletions(-) > > diff --git a/arch/x86/include/asm/xen/interface.h b/arch/x86/include/asm/xen/interface.h > index cbf0c9d..1d22131 100644 > --- a/arch/x86/include/asm/xen/interface.h > +++ b/arch/x86/include/asm/xen/interface.h > @@ -136,7 +136,13 @@ struct vcpu_guest_context { > struct cpu_user_regs user_regs; /* User-level CPU registers */ > struct trap_info trap_ctxt[256]; /* Virtual IDT */ > unsigned long ldt_base, ldt_ents; /* LDT (linear address, # ents) */ > - unsigned long gdt_frames[16], gdt_ents; /* GDT (machine frames, # ents) */ > + union { > + struct { > + /* PV: GDT (machine frames, # ents).*/ > + unsigned long gdt_frames[16], gdt_ents; > + }; > + unsigned long gdtaddr, gdtsz; /* PVH: GDTR addr and size */ > + }; > unsigned long kernel_ss, kernel_sp; /* Virtual TSS (only SS1/SP1) */ > /* NB. User pagetable on x86/64 is placed in ctrlreg[1]. */ > unsigned long ctrlreg[8]; /* CR0-CR7 (control registers) */I think I''ll be fully able to understand what these are for only after I read the Xen side patches...> diff --git a/arch/x86/include/asm/xen/page.h b/arch/x86/include/asm/xen/page.h > index 93971e8..d1cfb96 100644 > --- a/arch/x86/include/asm/xen/page.h > +++ b/arch/x86/include/asm/xen/page.h > @@ -158,6 +158,9 @@ static inline xpaddr_t machine_to_phys(xmaddr_t machine) > static inline unsigned long mfn_to_local_pfn(unsigned long mfn) > { > unsigned long pfn = mfn_to_pfn(mfn); > + > + if (xen_feature(XENFEAT_auto_translated_physmap)) > + return mfn; > if (get_phys_to_machine(pfn) != mfn) > return -1; /* force !pfn_valid() */ > return pfn; > diff --git a/arch/x86/xen/irq.c b/arch/x86/xen/irq.c > index 1573376..31959a7 100644 > --- a/arch/x86/xen/irq.c > +++ b/arch/x86/xen/irq.c > @@ -5,6 +5,7 @@ > #include <xen/interface/xen.h> > #include <xen/interface/sched.h> > #include <xen/interface/vcpu.h> > +#include <xen/features.h> > > #include <asm/xen/hypercall.h> > #include <asm/xen/hypervisor.h> > @@ -128,6 +129,8 @@ static const struct pv_irq_ops xen_irq_ops __initconst = { > > void __init xen_init_irq_ops(void) > { > - pv_irq_ops = xen_irq_ops; > + /* For PVH we use default pv_irq_ops settings */ > + if (!xen_feature(XENFEAT_hvm_callback_vector)) > + pv_irq_ops = xen_irq_ops; > x86_init.irqs.intr_init = xen_init_IRQ; > } > diff --git a/arch/x86/xen/p2m.c b/arch/x86/xen/p2m.c > index 64effdc..a954f83 100644 > --- a/arch/x86/xen/p2m.c > +++ b/arch/x86/xen/p2m.c > @@ -626,7 +626,7 @@ bool __set_phys_to_machine(unsigned long pfn, unsigned long mfn) > { > unsigned topidx, mididx, idx; > > - if (unlikely(xen_feature(XENFEAT_auto_translated_physmap))) { > + if (xen_feature(XENFEAT_auto_translated_physmap)) { > BUG_ON(pfn != mfn && mfn != INVALID_P2M_ENTRY); > return true; > } > diff --git a/drivers/xen/cpu_hotplug.c b/drivers/xen/cpu_hotplug.c > index 4dcfced..de6bcf9 100644 > --- a/drivers/xen/cpu_hotplug.c > +++ b/drivers/xen/cpu_hotplug.c > @@ -2,6 +2,7 @@ > > #include <xen/xen.h> > #include <xen/xenbus.h> > +#include <xen/features.h> > > #include <asm/xen/hypervisor.h> > #include <asm/cpu.h> > @@ -100,7 +101,8 @@ static int __init setup_vcpu_hotplug_event(void) > static struct notifier_block xsn_cpu = { > .notifier_call = setup_cpu_watcher }; > > - if (!xen_pv_domain()) > + /* PVH TBD/FIXME: future work */ > + if (!xen_pv_domain() || xen_feature(XENFEAT_auto_translated_physmap)) > return -ENODEV;Didn''t we say that a PVH domain is actually a pv guest? In that case shouldn''t the test if (!xen_pv_domain()) be sufficient?> register_xenstore_notifier(&xsn_cpu); > diff --git a/drivers/xen/events.c b/drivers/xen/events.c > index 7595581..f656791 100644 > --- a/drivers/xen/events.c > +++ b/drivers/xen/events.c > @@ -1755,7 +1755,7 @@ int xen_set_callback_via(uint64_t via) > } > EXPORT_SYMBOL_GPL(xen_set_callback_via); > > -#ifdef CONFIG_XEN_PVHVM > + > /* Vector callbacks are better than PCI interrupts to receive event > * channel notifications because we can receive vector callbacks on any > * vcpu and we don''t need PCI support or APIC interactions. */ > @@ -1779,9 +1779,6 @@ void xen_callback_vector(void) > alloc_intr_gate(XEN_HVM_EVTCHN_CALLBACK, xen_hvm_callback_vector); > } > } > -#else > -void xen_callback_vector(void) {} > -#endif > > void __init xen_init_IRQ(void) > { > @@ -1814,6 +1811,13 @@ void __init xen_init_IRQ(void) > if (xen_initial_domain()) > pci_xen_initial_domain(); > > + if (xen_feature(XENFEAT_hvm_callback_vector)) { > + xen_callback_vector(); > + return; > + } > + > + /* PVH: TBD/FIXME: debug and fix eio map to work with pvh */ > + > pirq_eoi_map = (void *)__get_free_page(GFP_KERNEL|__GFP_ZERO); > eoi_gmfn.gmfn = virt_to_mfn(pirq_eoi_map); > rc = HYPERVISOR_physdev_op(PHYSDEVOP_pirq_eoi_gmfn_v2, &eoi_gmfn); > diff --git a/drivers/xen/xenbus/xenbus_client.c b/drivers/xen/xenbus/xenbus_client.c > index b3e146e..a81e66b 100644 > --- a/drivers/xen/xenbus/xenbus_client.c > +++ b/drivers/xen/xenbus/xenbus_client.c > @@ -743,7 +743,7 @@ static const struct xenbus_ring_ops ring_ops_hvm = { > > void __init xenbus_ring_ops_init(void) > { > - if (xen_pv_domain()) > + if (xen_pv_domain() && !xen_feature(XENFEAT_auto_translated_physmap)) > ring_ops = &ring_ops_pv; > else > ring_ops = &ring_ops_hvm; > diff --git a/drivers/xen/xenbus/xenbus_probe.c b/drivers/xen/xenbus/xenbus_probe.c > index b793723..481dc72 100644 > --- a/drivers/xen/xenbus/xenbus_probe.c > +++ b/drivers/xen/xenbus/xenbus_probe.c > @@ -749,7 +749,11 @@ static int __init xenbus_init(void) > if (err) > goto out_error; > } > - xen_store_interface = mfn_to_virt(xen_store_mfn); > + if (xen_feature(XENFEAT_auto_translated_physmap))small code style issue here> + /* mfn is actually a pfn */ > + xen_store_interface = __va(xen_store_mfn<<PAGE_SHIFT); > + else > + xen_store_interface = mfn_to_virt(xen_store_mfn); > }I think that mfn_to_virt should work for PVH too: mfn_to_virt is: (__va(mfn_to_pfn(m) << PAGE_SHIFT)) and mfn_to_pfn just return mfn when XENFEAT_auto_translated_physmap is set
On Mon, 2012-09-24 at 12:26 +0100, Stefano Stabellini wrote:> > diff --git a/arch/x86/include/asm/xen/interface.h b/arch/x86/include/asm/xen/interface.h > > index cbf0c9d..1d22131 100644 > > --- a/arch/x86/include/asm/xen/interface.h > > +++ b/arch/x86/include/asm/xen/interface.h > > @@ -136,7 +136,13 @@ struct vcpu_guest_context { > > struct cpu_user_regs user_regs; /* User-level CPU registers */ > > struct trap_info trap_ctxt[256]; /* Virtual IDT */ > > unsigned long ldt_base, ldt_ents; /* LDT (linear address, # ents) */ > > - unsigned long gdt_frames[16], gdt_ents; /* GDT (machine frames, # ents) */ > > + union { > > + struct { > > + /* PV: GDT (machine frames, # ents).*/ > > + unsigned long gdt_frames[16], gdt_ents; > > + }; > > + unsigned long gdtaddr, gdtsz; /* PVH: GDTR addr and size */ > > + }; > > unsigned long kernel_ss, kernel_sp; /* Virtual TSS (only SS1/SP1) */ > > /* NB. User pagetable on x86/64 is placed in ctrlreg[1]. */ > > unsigned long ctrlreg[8]; /* CR0-CR7 (control registers) */ > > I think I''ll be fully able to understand what these are for only after I > read the Xen side patches...Also won''t this cause gdtaddr and gdtsz to share the same storage, since they are immediately inside a union -- I suspect that isn''t what was wanted!
On Mon, 24 Sep 2012 12:26:57 +0100 Stefano Stabellini <stefano.stabellini@eu.citrix.com> wrote:> On Fri, 21 Sep 2012, Mukesh Rathor wrote: > > --- > > arch/x86/include/asm/xen/interface.h | 8 +++++++- > > arch/x86/include/asm/xen/page.h | 3 +++ > > arch/x86/xen/irq.c | 5 ++++- > > arch/x86/xen/p2m.c | 2 +- > > drivers/xen/cpu_hotplug.c | 4 +++- > > drivers/xen/events.c | 12 ++++++++---- > > drivers/xen/xenbus/xenbus_client.c | 2 +- > > drivers/xen/xenbus/xenbus_probe.c | 6 +++++- > > include/xen/interface/memory.h | 27 > > +++++++++++++++++++++++++++ include/xen/interface/physdev.h > > | 10 ++++++++++ 10 files changed, 69 insertions(+), 10 > > deletions(-) > > > > diff --git a/arch/x86/include/asm/xen/interface.h > > b/arch/x86/include/asm/xen/interface.h index cbf0c9d..1d22131 100644 > > --- a/arch/x86/include/asm/xen/interface.h > > +++ b/arch/x86/include/asm/xen/interface.h > > @@ -136,7 +136,13 @@ struct vcpu_guest_context { > > struct cpu_user_regs user_regs; /* User-level CPU > > registers */ struct trap_info trap_ctxt[256]; /* Virtual > > IDT */ unsigned long ldt_base, ldt_ents; /* > > LDT (linear address, # ents) */ > > - unsigned long gdt_frames[16], gdt_ents; /* GDT (machine > > frames, # ents) */ > > + union { > > + struct { > > + /* PV: GDT (machine frames, # ents).*/ > > + unsigned long gdt_frames[16], gdt_ents; > > + }; > > + unsigned long gdtaddr, gdtsz; /* PVH: GDTR addr > > and size */ > > + }; > > unsigned long kernel_ss, kernel_sp; /* Virtual TSS (only > > SS1/SP1) */ /* NB. User pagetable on x86/64 is placed in > > ctrlreg[1]. */ unsigned long ctrlreg[8]; /* CR0-CR7 > > (control registers) */ > > I think I''ll be fully able to understand what these are for only > after I read the Xen side patches...When we are bringup up smp vcpu, we just need to send down gdtaddr and gdt size for vcpu context. You had suggested doing it during the code review, remember :). I had originally in xen. Anyways, earlier I was just using gdt_frames[0] for addr and gdt_ents for size. But Ian suggested I change it to union.> > > > #include <xen/xenbus.h> > > +#include <xen/features.h> > > > > #include <asm/xen/hypervisor.h> > > #include <asm/cpu.h> > > @@ -100,7 +101,8 @@ static int __init setup_vcpu_hotplug_event(void) > > static struct notifier_block xsn_cpu = { > > .notifier_call = setup_cpu_watcher }; > > > > - if (!xen_pv_domain()) > > + /* PVH TBD/FIXME: future work */ > > + if (!xen_pv_domain() || > > xen_feature(XENFEAT_auto_translated_physmap)) return -ENODEV; > > Didn''t we say that a PVH domain is actually a pv guest? > In that case shouldn''t the test > > if (!xen_pv_domain()) > > be sufficient?No, for HVM and PVH, we want to return -ENODEV.> > > register_xenstore_notifier(&xsn_cpu); > > diff --git a/drivers/xen/events.c b/drivers/xen/events.c > > index 7595581..f656791 100644 > > --- a/drivers/xen/events.c > > +++ b/drivers/xen/events.c > > @@ -1755,7 +1755,7 @@ int xen_set_callback_via(uint64_t via) > > } > > EXPORT_SYMBOL_GPL(xen_set_callback_via); > > > > -#ifdef CONFIG_XEN_PVHVM > > + > > /* Vector callbacks are better than PCI interrupts to receive event > > * channel notifications because we can receive vector callbacks > > on any > > * vcpu and we don''t need PCI support or APIC interactions. */ > > @@ -1779,9 +1779,6 @@ void xen_callback_vector(void) > > alloc_intr_gate(XEN_HVM_EVTCHN_CALLBACK, > > xen_hvm_callback_vector); } > > } > > -#else > > -void xen_callback_vector(void) {} > > -#endif > > > > void __init xen_init_IRQ(void) > > { > > @@ -1814,6 +1811,13 @@ void __init xen_init_IRQ(void) > > if (xen_initial_domain()) > > pci_xen_initial_domain(); > > > > + if (xen_feature(XENFEAT_hvm_callback_vector)) { > > + xen_callback_vector(); > > + return; > > + } > > + > > + /* PVH: TBD/FIXME: debug and fix eio map to work > > with pvh */ + > > pirq_eoi_map = (void > > __va(xen_store_mfn<<PAGE_SHIFT); > > + else > > + xen_store_interface > > mfn_to_virt(xen_store_mfn); } > > I think that mfn_to_virt should work for PVH too: mfn_to_virt is: > > (__va(mfn_to_pfn(m) << PAGE_SHIFT)) > > and mfn_to_pfn just return mfn when XENFEAT_auto_translated_physmap is > setYou are right. Testing it out.
NB typo in the subject line. On Fri, 2012-09-21 at 20:15 +0100, Mukesh Rathor wrote:> drivers/xen/xenbus/xenbus_client.c | 2 +-I needed this fixup to build on ARM after this patch: 8<---------------------------------------------- From f4d7d3ea58d1cb673632d8e65fc40a4c84a1d213 Mon Sep 17 00:00:00 2001 From: Ian Campbell <ian.campbell@citrix.com> Date: Wed, 26 Sep 2012 14:35:39 +0100 Subject: [PATCH] xenbus: include features header. Fixes: drivers/xen/xenbus/xenbus_probe.c: In function ''xenbus_init'': drivers/xen/xenbus/xenbus_probe.c:760:3: error: implicit declaration of function ''xen_feature'' [-Werror=implicit-function-declaration] drivers/xen/xenbus/xenbus_probe.c:760:19: error: ''XENFEAT_auto_translated_physmap'' undeclared (first use in this function) drivers/xen/xenbus/xenbus_probe.c:760:19: note: each undeclared identifier is reported only once for each function it appears in cc1: some warnings being treated as errors Signed-off-by: Ian Campbell <ian.campbell@citrix.com> --- drivers/xen/xenbus/xenbus_probe.c | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) diff --git a/drivers/xen/xenbus/xenbus_probe.c b/drivers/xen/xenbus/xenbus_probe.c index b92c024..974bea0 100644 --- a/drivers/xen/xenbus/xenbus_probe.c +++ b/drivers/xen/xenbus/xenbus_probe.c @@ -56,6 +56,7 @@ #include <xen/xenbus.h> #include <xen/events.h> #include <xen/page.h> +#include <xen/features.h> #include <xen/hvm.h> -- 1.7.2.5
On Fri, 2012-09-21 at 20:15 +0100, Mukesh Rathor wrote:> diff --git a/drivers/xen/events.c b/drivers/xen/events.c > index 7595581..f656791 100644 > --- a/drivers/xen/events.c > +++ b/drivers/xen/events.c > @@ -1755,7 +1755,7 @@ int xen_set_callback_via(uint64_t via) > } > EXPORT_SYMBOL_GPL(xen_set_callback_via); > > -#ifdef CONFIG_XEN_PVHVM > + > /* Vector callbacks are better than PCI interrupts to receive event > * channel notifications because we can receive vector callbacks on > any > * vcpu and we don''t need PCI support or APIC interactions. */ > @@ -1779,9 +1779,6 @@ void xen_callback_vector(void) > alloc_intr_gate(XEN_HVM_EVTCHN_CALLBACK, > xen_hvm_callback_vector); > } > } > -#else > -void xen_callback_vector(void) {} > -#endif > > void __init xen_init_IRQ(void) > {This breaks on ARM because this like XEN_HVM_EVTCHN_CALLBACK, which are inside this ifdef, are actually X86 specific. I suspect that xen_callback_vector needs to be moved in to an arch specific file so that we can supply a suitably different implementation on ARM -- Stefano what do you think? Ian.
Konrad Rzeszutek Wilk
2012-Sep-26 14:33 UTC
Re: [PATCH v1 1/8]: PVH basic and hader file changes
> diff --git a/include/xen/interface/memory.h b/include/xen/interface/memory.h > index eac3ce1..f150fa1c 100644 > --- a/include/xen/interface/memory.h > +++ b/include/xen/interface/memory.h > @@ -163,11 +163,22 @@ struct xen_add_to_physmap { > /* Which domain to change the mapping for. */ > domid_t domid; > > + union { > + /* Number of pages to go through for gmfn_range */ > + uint16_t size; > + /* IFF XENMAPSPACE_gmfn_foreign */ > + domid_t foreign_domid; > + } u; > /* Source mapping space. */So found out why it crashed on PVHVM. If you rebase your patch on top of b58aaa4b0b3506c094308342d746f600468c63d9 Author: Stefano Stabellini <stefano.stabellini@eu.citrix.com> Date: Mon Aug 6 15:27:24 2012 +0100 xen: update xen_add_to_physmap interface Update struct xen_add_to_physmap to be in sync with Xen''s version of the structure. The size field was introduced by: changeset: 24164:707d27fe03e7 user: Jean Guyader <jean.guyader@eu.citrix.com> date: Fri Nov 18 13:42:08 2011 +0000 summary: mm: New XENMEM space, XENMAPSPACE_gmfn_range According to the comment: "This new field .size is located in the 16 bits padding between .domid and .space in struct xen_add_to_physmap to stay compatible with older versions." Changes in v2: - remove erroneous comment in the commit message. Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com> Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com> the merge ends up looking like this: @ -166,11 +166,22 @@ struct xen_add_to_physmap { /* Number of pages to go through for gmfn_range */ uint16_t size; + union { + /* Number of pages to go through for gmfn_range */ + uint16_t size; + /* IFF XENMAPSPACE_gmfn_foreign */ + domid_t foreign_domid; + } u; Grrrr..
Stefano Stabellini
2012-Oct-02 10:48 UTC
Re: [PATCH v1 1/8]: PVH basic and hader file changes
On Fri, 21 Sep 2012, Mukesh Rathor wrote:> --- > arch/x86/include/asm/xen/interface.h | 8 +++++++- > arch/x86/include/asm/xen/page.h | 3 +++ > arch/x86/xen/irq.c | 5 ++++- > arch/x86/xen/p2m.c | 2 +- > drivers/xen/cpu_hotplug.c | 4 +++- > drivers/xen/events.c | 12 ++++++++---- > drivers/xen/xenbus/xenbus_client.c | 2 +- > drivers/xen/xenbus/xenbus_probe.c | 6 +++++- > include/xen/interface/memory.h | 27 +++++++++++++++++++++++++++ > include/xen/interface/physdev.h | 10 ++++++++++ > 10 files changed, 69 insertions(+), 10 deletions(-) > > diff --git a/arch/x86/include/asm/xen/interface.h b/arch/x86/include/asm/xen/interface.h > index cbf0c9d..1d22131 100644 > --- a/arch/x86/include/asm/xen/interface.h > +++ b/arch/x86/include/asm/xen/interface.h > @@ -136,7 +136,13 @@ struct vcpu_guest_context { > struct cpu_user_regs user_regs; /* User-level CPU registers */ > struct trap_info trap_ctxt[256]; /* Virtual IDT */ > unsigned long ldt_base, ldt_ents; /* LDT (linear address, # ents) */ > - unsigned long gdt_frames[16], gdt_ents; /* GDT (machine frames, # ents) */ > + union { > + struct { > + /* PV: GDT (machine frames, # ents).*/ > + unsigned long gdt_frames[16], gdt_ents; > + }; > + unsigned long gdtaddr, gdtsz; /* PVH: GDTR addr and size */ > + }; > unsigned long kernel_ss, kernel_sp; /* Virtual TSS (only SS1/SP1) */ > /* NB. User pagetable on x86/64 is placed in ctrlreg[1]. */ > unsigned long ctrlreg[8]; /* CR0-CR7 (control registers) */ > diff --git a/arch/x86/include/asm/xen/page.h b/arch/x86/include/asm/xen/page.h > index 93971e8..d1cfb96 100644 > --- a/arch/x86/include/asm/xen/page.h > +++ b/arch/x86/include/asm/xen/page.h > @@ -158,6 +158,9 @@ static inline xpaddr_t machine_to_phys(xmaddr_t machine) > static inline unsigned long mfn_to_local_pfn(unsigned long mfn) > { > unsigned long pfn = mfn_to_pfn(mfn); > + > + if (xen_feature(XENFEAT_auto_translated_physmap)) > + return mfn; > if (get_phys_to_machine(pfn) != mfn) > return -1; /* force !pfn_valid() */ > return pfn; > diff --git a/arch/x86/xen/irq.c b/arch/x86/xen/irq.c > index 1573376..31959a7 100644 > --- a/arch/x86/xen/irq.c > +++ b/arch/x86/xen/irq.c > @@ -5,6 +5,7 @@ > #include <xen/interface/xen.h> > #include <xen/interface/sched.h> > #include <xen/interface/vcpu.h> > +#include <xen/features.h> > > #include <asm/xen/hypercall.h> > #include <asm/xen/hypervisor.h> > @@ -128,6 +129,8 @@ static const struct pv_irq_ops xen_irq_ops __initconst = { > > void __init xen_init_irq_ops(void) > { > - pv_irq_ops = xen_irq_ops; > + /* For PVH we use default pv_irq_ops settings */ > + if (!xen_feature(XENFEAT_hvm_callback_vector)) > + pv_irq_ops = xen_irq_ops; > x86_init.irqs.intr_init = xen_init_IRQ; > } > diff --git a/arch/x86/xen/p2m.c b/arch/x86/xen/p2m.c > index 64effdc..a954f83 100644 > --- a/arch/x86/xen/p2m.c > +++ b/arch/x86/xen/p2m.c > @@ -626,7 +626,7 @@ bool __set_phys_to_machine(unsigned long pfn, unsigned long mfn) > { > unsigned topidx, mididx, idx; > > - if (unlikely(xen_feature(XENFEAT_auto_translated_physmap))) { > + if (xen_feature(XENFEAT_auto_translated_physmap)) { > BUG_ON(pfn != mfn && mfn != INVALID_P2M_ENTRY); > return true; > } > diff --git a/drivers/xen/cpu_hotplug.c b/drivers/xen/cpu_hotplug.c > index 4dcfced..de6bcf9 100644 > --- a/drivers/xen/cpu_hotplug.c > +++ b/drivers/xen/cpu_hotplug.c > @@ -2,6 +2,7 @@ > > #include <xen/xen.h> > #include <xen/xenbus.h> > +#include <xen/features.h> > > #include <asm/xen/hypervisor.h> > #include <asm/cpu.h> > @@ -100,7 +101,8 @@ static int __init setup_vcpu_hotplug_event(void) > static struct notifier_block xsn_cpu = { > .notifier_call = setup_cpu_watcher }; > > - if (!xen_pv_domain()) > + /* PVH TBD/FIXME: future work */ > + if (!xen_pv_domain() || xen_feature(XENFEAT_auto_translated_physmap)) > return -ENODEV; > > register_xenstore_notifier(&xsn_cpu); > diff --git a/drivers/xen/events.c b/drivers/xen/events.c > index 7595581..f656791 100644 > --- a/drivers/xen/events.c > +++ b/drivers/xen/events.c > @@ -1755,7 +1755,7 @@ int xen_set_callback_via(uint64_t via) > } > EXPORT_SYMBOL_GPL(xen_set_callback_via); > > -#ifdef CONFIG_XEN_PVHVM > + > /* Vector callbacks are better than PCI interrupts to receive event > * channel notifications because we can receive vector callbacks on any > * vcpu and we don''t need PCI support or APIC interactions. */ > @@ -1779,9 +1779,6 @@ void xen_callback_vector(void) > alloc_intr_gate(XEN_HVM_EVTCHN_CALLBACK, xen_hvm_callback_vector); > } > } > -#else > -void xen_callback_vector(void) {} > -#endif > > void __init xen_init_IRQ(void) > { > @@ -1814,6 +1811,13 @@ void __init xen_init_IRQ(void) > if (xen_initial_domain()) > pci_xen_initial_domain(); > > + if (xen_feature(XENFEAT_hvm_callback_vector)) { > + xen_callback_vector(); > + return; > + } > + > + /* PVH: TBD/FIXME: debug and fix eio map to work with pvh */ > + > pirq_eoi_map = (void *)__get_free_page(GFP_KERNEL|__GFP_ZERO); > eoi_gmfn.gmfn = virt_to_mfn(pirq_eoi_map); > rc = HYPERVISOR_physdev_op(PHYSDEVOP_pirq_eoi_gmfn_v2, &eoi_gmfn); > diff --git a/drivers/xen/xenbus/xenbus_client.c b/drivers/xen/xenbus/xenbus_client.c > index b3e146e..a81e66b 100644 > --- a/drivers/xen/xenbus/xenbus_client.c > +++ b/drivers/xen/xenbus/xenbus_client.c > @@ -743,7 +743,7 @@ static const struct xenbus_ring_ops ring_ops_hvm = { > > void __init xenbus_ring_ops_init(void) > { > - if (xen_pv_domain()) > + if (xen_pv_domain() && !xen_feature(XENFEAT_auto_translated_physmap)) > ring_ops = &ring_ops_pv; > else > ring_ops = &ring_ops_hvm; > diff --git a/drivers/xen/xenbus/xenbus_probe.c b/drivers/xen/xenbus/xenbus_probe.c > index b793723..481dc72 100644 > --- a/drivers/xen/xenbus/xenbus_probe.c > +++ b/drivers/xen/xenbus/xenbus_probe.c > @@ -749,7 +749,11 @@ static int __init xenbus_init(void) > if (err) > goto out_error; > } > - xen_store_interface = mfn_to_virt(xen_store_mfn); > + if (xen_feature(XENFEAT_auto_translated_physmap))code style: spaces vs tabs> + /* mfn is actually a pfn */ > + xen_store_interface = __va(xen_store_mfn<<PAGE_SHIFT); > + else > + xen_store_interface = mfn_to_virt(xen_store_mfn); > } > > /* Initialize the interface to xenstore. */ > diff --git a/include/xen/interface/memory.h b/include/xen/interface/memory.h > index eac3ce1..f150fa1c 100644 > --- a/include/xen/interface/memory.h > +++ b/include/xen/interface/memory.h > @@ -163,11 +163,22 @@ struct xen_add_to_physmap { > /* Which domain to change the mapping for. */ > domid_t domid; > > + union { > + /* Number of pages to go through for gmfn_range */ > + uint16_t size; > + /* IFF XENMAPSPACE_gmfn_foreign */ > + domid_t foreign_domid; > + } u;code style: mixed spaces and tabs> /* Source mapping space. */ > #define XENMAPSPACE_shared_info 0 /* shared info page */ > #define XENMAPSPACE_grant_table 1 /* grant table page */ > +#define XENMAPSPACE_gmfn 2 /* GMFN */ > +#define XENMAPSPACE_gmfn_range 3 /* GMFN range */ > +#define XENMAPSPACE_gmfn_foreign 4 /* GMFN from another guest */ > unsigned int space; > > +#define XENMAPIDX_grant_table_status 0x80000000 > + > /* Index into source mapping space. */ > unsigned long idx; > > @@ -234,4 +245,20 @@ DEFINE_GUEST_HANDLE_STRUCT(xen_memory_map); > * during a driver critical region. > */ > extern spinlock_t xen_reservation_lock; > + > +/* > + * Unmaps the page appearing at a particular GPFN from the specified guest''s > + * pseudophysical address space. > + * arg == addr of xen_remove_from_physmap_t. > + */ > +#define XENMEM_remove_from_physmap 15 > +struct xen_remove_from_physmap { > + /* Which domain to change the mapping for. */ > + domid_t domid; > + > + /* GPFN of the current mapping of the page. */ > + unsigned long gpfn; > +}; > +DEFINE_GUEST_HANDLE_STRUCT(xen_remove_from_physmap); > + > #endif /* __XEN_PUBLIC_MEMORY_H__ */ > diff --git a/include/xen/interface/physdev.h b/include/xen/interface/physdev.h > index 9ce788d..80f792e 100644 > --- a/include/xen/interface/physdev.h > +++ b/include/xen/interface/physdev.h > @@ -258,6 +258,16 @@ struct physdev_pci_device { > uint8_t devfn; > }; > > +#define PHYSDEVOP_pvh_map_iomem 29 > +struct physdev_map_iomem { > + /* IN */ > + uint64_t first_gfn; > + uint64_t first_mfn; > + uint32_t nr_mfns; > + uint32_t add_mapping; /* 1 == add mapping; 0 == unmap */ > + > +}; > + > /* > * Notify that some PIRQ-bound event channels have been unmasked. > * ** This command is obsolete since interface version 0x00030202 and is ** > -- > 1.7.2.3 >
Konrad Rzeszutek Wilk
2012-Oct-02 13:04 UTC
Re: [PATCH v1 1/8]: PVH basic and hader file changes
The title says '' hader'' - it should say ''header''. Also there is a missing description of what it does, and how this works. For an example check out: f4cec35b0d4b90d96e3770a3d1e68ea882e7a7c8 (which added the 1-1 P2M notion), or: 357a3cfb147ee8e97c6f9cdc51e9a33aa56f7d99 (for the > 128gb support). It needs to be verbose with lots of details. On Tue, Oct 02, 2012 at 11:48:13AM +0100, Stefano Stabellini wrote:> On Fri, 21 Sep 2012, Mukesh Rathor wrote: > > --- > > arch/x86/include/asm/xen/interface.h | 8 +++++++- > > arch/x86/include/asm/xen/page.h | 3 +++ > > arch/x86/xen/irq.c | 5 ++++- > > arch/x86/xen/p2m.c | 2 +- > > drivers/xen/cpu_hotplug.c | 4 +++- > > drivers/xen/events.c | 12 ++++++++---- > > drivers/xen/xenbus/xenbus_client.c | 2 +- > > drivers/xen/xenbus/xenbus_probe.c | 6 +++++- > > include/xen/interface/memory.h | 27 +++++++++++++++++++++++++++ > > include/xen/interface/physdev.h | 10 ++++++++++ > > 10 files changed, 69 insertions(+), 10 deletions(-)
On Fri, 2012-09-21 at 20:15 +0100, Mukesh Rathor wrote:> @@ -234,4 +245,20 @@ DEFINE_GUEST_HANDLE_STRUCT(xen_memory_map); > * during a driver critical region. > */ > extern spinlock_t xen_reservation_lock; > + > +/* > + * Unmaps the page appearing at a particular GPFN from the specified > guest''s > + * pseudophysical address space. > + * arg == addr of xen_remove_from_physmap_t. > + */ > +#define XENMEM_remove_from_physmap 15 > +struct xen_remove_from_physmap { > + /* Which domain to change the mapping for. */ > + domid_t domid; > + > + /* GPFN of the current mapping of the page. */ > + unsigned long gpfn; > +}; > +DEFINE_GUEST_HANDLE_STRUCT(xen_remove_from_physmap);I needed this fixup in a tree with both the ARM and PVH stuff: 8<------------------------------------ From d56a302734180171855e0ee07571ac0cee69b3e5 Mon Sep 17 00:00:00 2001 From: Ian Campbell <ian.campbell@citrix.com> Date: Thu, 4 Oct 2012 10:45:52 +0100 Subject: [PATCH] xen: use xen_pft_t in struct xen_remove_from_physmap 4a6c2b4 "PVH basic and hader file changes" and bd3f79b "xen: Introduce xen_pfn_t for pfn and mfn types" passed like ships in the night. Signed-off-by: Ian Campbell <ian.campbell@citrix.com> --- include/xen/interface/memory.h | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/include/xen/interface/memory.h b/include/xen/interface/memory.h index 6d74c47..d38bdc1 100644 --- a/include/xen/interface/memory.h +++ b/include/xen/interface/memory.h @@ -258,7 +258,7 @@ struct xen_remove_from_physmap { domid_t domid; /* GPFN of the current mapping of the page. */ - unsigned long gpfn; + xen_pfn_t gpfn; }; DEFINE_GUEST_HANDLE_STRUCT(xen_remove_from_physmap); -- 1.7.2.5
Konrad Rzeszutek Wilk
2012-Oct-04 12:44 UTC
Re: [PATCH v1 1/8]: PVH basic and hader file changes
On Thu, Oct 4, 2012 at 6:00 AM, Ian Campbell <Ian.Campbell@citrix.com> wrote:> On Fri, 2012-09-21 at 20:15 +0100, Mukesh Rathor wrote: >> @@ -234,4 +245,20 @@ DEFINE_GUEST_HANDLE_STRUCT(xen_memory_map); >> * during a driver critical region. >> */ >> extern spinlock_t xen_reservation_lock; >> + >> +/* >> + * Unmaps the page appearing at a particular GPFN from the specified >> guest''s >> + * pseudophysical address space. >> + * arg == addr of xen_remove_from_physmap_t. >> + */ >> +#define XENMEM_remove_from_physmap 15 >> +struct xen_remove_from_physmap { >> + /* Which domain to change the mapping for. */ >> + domid_t domid; >> + >> + /* GPFN of the current mapping of the page. */ >> + unsigned long gpfn; >> +}; >> +DEFINE_GUEST_HANDLE_STRUCT(xen_remove_from_physmap); > > I needed this fixup in a tree with both the ARM and PVH stuff: > > 8<------------------------------------ > > >From d56a302734180171855e0ee07571ac0cee69b3e5 Mon Sep 17 00:00:00 2001 > From: Ian Campbell <ian.campbell@citrix.com> > Date: Thu, 4 Oct 2012 10:45:52 +0100 > Subject: [PATCH] xen: use xen_pft_t in struct xen_remove_from_physmap > > 4a6c2b4 "PVH basic and hader file changes" and bd3f79b "xen: Introduce > xen_pfn_t for pfn and mfn types" passed like ships in the night... and at least they did not collide with each other :-)> > Signed-off-by: Ian Campbell <ian.campbell@citrix.com> > --- > include/xen/interface/memory.h | 2 +- > 1 files changed, 1 insertions(+), 1 deletions(-) > > diff --git a/include/xen/interface/memory.h b/include/xen/interface/memory.h > index 6d74c47..d38bdc1 100644 > --- a/include/xen/interface/memory.h > +++ b/include/xen/interface/memory.h > @@ -258,7 +258,7 @@ struct xen_remove_from_physmap { > domid_t domid; > > /* GPFN of the current mapping of the page. */ > - unsigned long gpfn; > + xen_pfn_t gpfn; > }; > DEFINE_GUEST_HANDLE_STRUCT(xen_remove_from_physmap); > > -- > 1.7.2.5 > > > > > > _______________________________________________ > Xen-devel mailing list > Xen-devel@lists.xen.org > http://lists.xen.org/xen-devel >