Skip to content

Commit cae7d81

Browse files
jbeulichjgross1
authored andcommitted
xen/x86: allow PVH Dom0 without XEN_PV=y
Decouple XEN_DOM0 from XEN_PV, converting some existing uses of XEN_DOM0 to a new XEN_PV_DOM0. (I'm not convinced all are really / should really be PV-specific, but for starters I've tried to be conservative.) For PVH Dom0 the hypervisor populates MADT with only x2APIC entries, so without x2APIC support enabled in the kernel things aren't going to work very well. (As opposed, DomU-s would only ever see LAPIC entries in MADT as of now.) Note that this then requires PVH Dom0 to be 64-bit, as X86_X2APIC depends on X86_64. In the course of this xen_running_on_version_or_later() needs to be available more broadly. Move it from a PV-specific to a generic file, considering that what it does isn't really PV-specific at all anyway. Note that xen/interface/version.h cannot be included on its own; in enlighten.c, which uses SCHEDOP_* anyway, include xen/interface/sched.h first to resolve the apparently sole missing type (xen_ulong_t). Signed-off-by: Jan Beulich <[email protected]> Reviewed-by: Juergen Gross <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Juergen Gross <[email protected]>
1 parent 9172b5c commit cae7d81

File tree

8 files changed

+49
-37
lines changed

8 files changed

+49
-37
lines changed

arch/x86/include/asm/xen/pci.h

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,16 +14,19 @@ static inline int pci_xen_hvm_init(void)
1414
return -1;
1515
}
1616
#endif
17-
#if defined(CONFIG_XEN_DOM0)
17+
#ifdef CONFIG_XEN_PV_DOM0
1818
int __init pci_xen_initial_domain(void);
19-
int xen_find_device_domain_owner(struct pci_dev *dev);
20-
int xen_register_device_domain_owner(struct pci_dev *dev, uint16_t domain);
21-
int xen_unregister_device_domain_owner(struct pci_dev *dev);
2219
#else
2320
static inline int __init pci_xen_initial_domain(void)
2421
{
2522
return -1;
2623
}
24+
#endif
25+
#ifdef CONFIG_XEN_DOM0
26+
int xen_find_device_domain_owner(struct pci_dev *dev);
27+
int xen_register_device_domain_owner(struct pci_dev *dev, uint16_t domain);
28+
int xen_unregister_device_domain_owner(struct pci_dev *dev);
29+
#else
2730
static inline int xen_find_device_domain_owner(struct pci_dev *dev)
2831
{
2932
return -1;

arch/x86/pci/xen.c

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@ static int acpi_register_gsi_xen_hvm(struct device *dev, u32 gsi,
113113
false /* no mapping of GSI to PIRQ */);
114114
}
115115

116-
#ifdef CONFIG_XEN_DOM0
116+
#ifdef CONFIG_XEN_PV_DOM0
117117
static int xen_register_gsi(u32 gsi, int triggering, int polarity)
118118
{
119119
int rc, irq;
@@ -261,7 +261,7 @@ static int xen_hvm_setup_msi_irqs(struct pci_dev *dev, int nvec, int type)
261261
return irq;
262262
}
263263

264-
#ifdef CONFIG_XEN_DOM0
264+
#ifdef CONFIG_XEN_PV_DOM0
265265
static bool __read_mostly pci_seg_supported = true;
266266

267267
static int xen_initdom_setup_msi_irqs(struct pci_dev *dev, int nvec, int type)
@@ -375,10 +375,10 @@ static void xen_initdom_restore_msi_irqs(struct pci_dev *dev)
375375
WARN(ret && ret != -ENOSYS, "restore_msi -> %d\n", ret);
376376
}
377377
}
378-
#else /* CONFIG_XEN_DOM0 */
378+
#else /* CONFIG_XEN_PV_DOM0 */
379379
#define xen_initdom_setup_msi_irqs NULL
380380
#define xen_initdom_restore_msi_irqs NULL
381-
#endif /* !CONFIG_XEN_DOM0 */
381+
#endif /* !CONFIG_XEN_PV_DOM0 */
382382

383383
static void xen_teardown_msi_irqs(struct pci_dev *dev)
384384
{
@@ -555,7 +555,7 @@ int __init pci_xen_hvm_init(void)
555555
return 0;
556556
}
557557

558-
#ifdef CONFIG_XEN_DOM0
558+
#ifdef CONFIG_XEN_PV_DOM0
559559
int __init pci_xen_initial_domain(void)
560560
{
561561
int irq;
@@ -583,6 +583,9 @@ int __init pci_xen_initial_domain(void)
583583
}
584584
return 0;
585585
}
586+
#endif
587+
588+
#ifdef CONFIG_XEN_DOM0
586589

587590
struct xen_device_domain_owner {
588591
domid_t domain;
@@ -656,4 +659,4 @@ int xen_unregister_device_domain_owner(struct pci_dev *dev)
656659
return 0;
657660
}
658661
EXPORT_SYMBOL_GPL(xen_unregister_device_domain_owner);
659-
#endif
662+
#endif /* CONFIG_XEN_DOM0 */

arch/x86/xen/Kconfig

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -43,13 +43,9 @@ config XEN_PV_SMP
4343
def_bool y
4444
depends on XEN_PV && SMP
4545

46-
config XEN_DOM0
47-
bool "Xen PV Dom0 support"
48-
default y
49-
depends on XEN_PV && PCI_XEN && SWIOTLB_XEN
50-
depends on X86_IO_APIC && ACPI && PCI
51-
help
52-
Support running as a Xen PV Dom0 guest.
46+
config XEN_PV_DOM0
47+
def_bool y
48+
depends on XEN_PV && XEN_DOM0
5349

5450
config XEN_PVHVM
5551
def_bool y
@@ -86,3 +82,12 @@ config XEN_PVH
8682
def_bool n
8783
help
8884
Support for running as a Xen PVH guest.
85+
86+
config XEN_DOM0
87+
bool "Xen Dom0 support"
88+
default XEN_PV
89+
depends on (XEN_PV && SWIOTLB_XEN) || (XEN_PVH && X86_64)
90+
depends on X86_IO_APIC && ACPI && PCI
91+
select X86_X2APIC if XEN_PVH && X86_64
92+
help
93+
Support running as a Xen Dom0 guest.

arch/x86/xen/Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ obj-$(CONFIG_PARAVIRT_SPINLOCKS)+= spinlock.o
4545

4646
obj-$(CONFIG_XEN_DEBUG_FS) += debugfs.o
4747

48-
obj-$(CONFIG_XEN_DOM0) += vga.o
48+
obj-$(CONFIG_XEN_PV_DOM0) += vga.o
4949

5050
obj-$(CONFIG_SWIOTLB_XEN) += pci-swiotlb-xen.o
5151

arch/x86/xen/enlighten.c

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010

1111
#include <xen/xen.h>
1212
#include <xen/features.h>
13+
#include <xen/interface/sched.h>
14+
#include <xen/interface/version.h>
1315
#include <xen/page.h>
1416

1517
#include <asm/xen/hypercall.h>
@@ -257,6 +259,21 @@ int xen_vcpu_setup(int cpu)
257259
return ((per_cpu(xen_vcpu, cpu) == NULL) ? -ENODEV : 0);
258260
}
259261

262+
/* Check if running on Xen version (major, minor) or later */
263+
bool xen_running_on_version_or_later(unsigned int major, unsigned int minor)
264+
{
265+
unsigned int version;
266+
267+
if (!xen_domain())
268+
return false;
269+
270+
version = HYPERVISOR_xen_version(XENVER_version, NULL);
271+
if ((((version >> 16) == major) && ((version & 0xffff) >= minor)) ||
272+
((version >> 16) > major))
273+
return true;
274+
return false;
275+
}
276+
260277
void xen_reboot(int reason)
261278
{
262279
struct sched_shutdown r = { .reason = reason };

arch/x86/xen/enlighten_pv.c

Lines changed: 0 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -142,22 +142,6 @@ static void __init xen_pv_guest_late_init(void)
142142
#endif
143143
}
144144

145-
/* Check if running on Xen version (major, minor) or later */
146-
bool
147-
xen_running_on_version_or_later(unsigned int major, unsigned int minor)
148-
{
149-
unsigned int version;
150-
151-
if (!xen_domain())
152-
return false;
153-
154-
version = HYPERVISOR_xen_version(XENVER_version, NULL);
155-
if ((((version >> 16) == major) && ((version & 0xffff) >= minor)) ||
156-
((version >> 16) > major))
157-
return true;
158-
return false;
159-
}
160-
161145
static __read_mostly unsigned int cpuid_leaf5_ecx_val;
162146
static __read_mostly unsigned int cpuid_leaf5_edx_val;
163147

arch/x86/xen/xen-ops.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ static inline void xen_uninit_lock_cpu(int cpu)
109109

110110
struct dom0_vga_console_info;
111111

112-
#ifdef CONFIG_XEN_DOM0
112+
#ifdef CONFIG_XEN_PV_DOM0
113113
void __init xen_init_vga(const struct dom0_vga_console_info *, size_t size);
114114
#else
115115
static inline void __init xen_init_vga(const struct dom0_vga_console_info *info,

drivers/xen/Kconfig

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -241,7 +241,7 @@ config XEN_PRIVCMD
241241

242242
config XEN_ACPI_PROCESSOR
243243
tristate "Xen ACPI processor"
244-
depends on XEN && XEN_DOM0 && X86 && ACPI_PROCESSOR && CPU_FREQ
244+
depends on XEN && XEN_PV_DOM0 && X86 && ACPI_PROCESSOR && CPU_FREQ
245245
default m
246246
help
247247
This ACPI processor uploads Power Management information to the Xen
@@ -259,7 +259,7 @@ config XEN_ACPI_PROCESSOR
259259

260260
config XEN_MCE_LOG
261261
bool "Xen platform mcelog"
262-
depends on XEN_DOM0 && X86_MCE
262+
depends on XEN_PV_DOM0 && X86_MCE
263263
help
264264
Allow kernel fetching MCE error from Xen platform and
265265
converting it into Linux mcelog format for mcelog tools

0 commit comments

Comments
 (0)