diff --git a/xen/arch/x86/setup.c b/xen/arch/x86/setup.c index e9c2c51a54..1fd70ec81c 100644 --- a/xen/arch/x86/setup.c +++ b/xen/arch/x86/setup.c @@ -1438,7 +1438,7 @@ void arch_get_xen_caps(xen_capabilities_info_t *info) } } -int __init xen_in_range(unsigned long mfn) +int __hwdom_init xen_in_range(unsigned long mfn) { paddr_t start, end; int i; @@ -1446,7 +1446,7 @@ int __init xen_in_range(unsigned long mfn) enum { region_s3, region_text, region_bss, nr_regions }; static struct { paddr_t s, e; - } xen_regions[nr_regions] __initdata; + } xen_regions[nr_regions] __hwdom_initdata; /* initialize first time */ if ( !xen_regions[0].s ) diff --git a/xen/drivers/passthrough/amd/pci_amd_iommu.c b/xen/drivers/passthrough/amd/pci_amd_iommu.c index cf67494fa4..ff5f06e305 100644 --- a/xen/drivers/passthrough/amd/pci_amd_iommu.c +++ b/xen/drivers/passthrough/amd/pci_amd_iommu.c @@ -169,7 +169,8 @@ static void amd_iommu_setup_domain_device( } } -static int __init amd_iommu_setup_dom0_device(u8 devfn, struct pci_dev *pdev) +static int __hwdom_init amd_iommu_setup_dom0_device( + u8 devfn, struct pci_dev *pdev) { int bdf = PCI_BDF2(pdev->bus, pdev->devfn); struct amd_iommu *iommu = find_iommu_for_device(pdev->seg, bdf); @@ -280,7 +281,7 @@ static int amd_iommu_domain_init(struct domain *d) return 0; } -static void __init amd_iommu_dom0_init(struct domain *d) +static void __hwdom_init amd_iommu_dom0_init(struct domain *d) { unsigned long i; diff --git a/xen/drivers/passthrough/iommu.c b/xen/drivers/passthrough/iommu.c index 54d891fc79..3e5635cd61 100644 --- a/xen/drivers/passthrough/iommu.c +++ b/xen/drivers/passthrough/iommu.c @@ -45,7 +45,7 @@ custom_param("iommu", parse_iommu_param); bool_t __initdata iommu_enable = 1; bool_t __read_mostly iommu_enabled; bool_t __read_mostly force_iommu; -bool_t __initdata iommu_dom0_strict; +bool_t __hwdom_initdata iommu_dom0_strict; bool_t __read_mostly iommu_verbose; bool_t __read_mostly iommu_workaround_bios_bug; bool_t __read_mostly iommu_passthrough; @@ -130,7 +130,7 @@ int iommu_domain_init(struct domain *d) return hd->platform_ops->init(d); } -static __init void check_dom0_pvh_reqs(struct domain *d) +static void __hwdom_init check_dom0_pvh_reqs(struct domain *d) { if ( !iommu_enabled ) panic("Presently, iommu must be enabled for pvh dom0\n"); @@ -141,7 +141,7 @@ static __init void check_dom0_pvh_reqs(struct domain *d) iommu_dom0_strict = 1; } -void __init iommu_dom0_init(struct domain *d) +void __hwdom_init iommu_dom0_init(struct domain *d) { struct hvm_iommu *hd = domain_hvm_iommu(d); diff --git a/xen/drivers/passthrough/pci.c b/xen/drivers/passthrough/pci.c index ff78142db5..dfa195ac9e 100644 --- a/xen/drivers/passthrough/pci.c +++ b/xen/drivers/passthrough/pci.c @@ -893,7 +893,7 @@ static void setup_one_dom0_device(const struct setup_dom0 *ctxt, PCI_SLOT(devfn) == PCI_SLOT(pdev->devfn) ); } -static int __init _setup_dom0_pci_devices(struct pci_seg *pseg, void *arg) +static int __hwdom_init _setup_dom0_pci_devices(struct pci_seg *pseg, void *arg) { struct setup_dom0 *ctxt = arg; int bus, devfn; @@ -943,7 +943,7 @@ static int __init _setup_dom0_pci_devices(struct pci_seg *pseg, void *arg) return 0; } -void __init setup_dom0_pci_devices( +void __hwdom_init setup_dom0_pci_devices( struct domain *d, int (*handler)(u8 devfn, struct pci_dev *)) { struct setup_dom0 ctxt = { .d = d, .handler = handler }; diff --git a/xen/drivers/passthrough/vtd/iommu.c b/xen/drivers/passthrough/vtd/iommu.c index 9c8e4a34ff..d22d51850f 100644 --- a/xen/drivers/passthrough/vtd/iommu.c +++ b/xen/drivers/passthrough/vtd/iommu.c @@ -1242,7 +1242,7 @@ static int intel_iommu_domain_init(struct domain *d) return 0; } -static void __init intel_iommu_dom0_init(struct domain *d) +static void __hwdom_init intel_iommu_dom0_init(struct domain *d) { struct acpi_drhd_unit *drhd; @@ -1992,7 +1992,7 @@ static int intel_iommu_remove_device(u8 devfn, struct pci_dev *pdev) return domain_context_unmap(pdev->domain, devfn, pdev); } -static int __init setup_dom0_device(u8 devfn, struct pci_dev *pdev) +static int __hwdom_init setup_dom0_device(u8 devfn, struct pci_dev *pdev) { int err; @@ -2140,7 +2140,7 @@ static int init_vtd_hw(void) return 0; } -static void __init setup_dom0_rmrr(struct domain *d) +static void __hwdom_init setup_dom0_rmrr(struct domain *d) { struct acpi_rmrr_unit *rmrr; u16 bdf; diff --git a/xen/drivers/passthrough/vtd/quirks.c b/xen/drivers/passthrough/vtd/quirks.c index 7f6c3a75c5..fbba23b234 100644 --- a/xen/drivers/passthrough/vtd/quirks.c +++ b/xen/drivers/passthrough/vtd/quirks.c @@ -384,7 +384,7 @@ void me_wifi_quirk(struct domain *domain, u8 bus, u8 devfn, int map) * - This can cause system failure upon non-fatal VT-d faults * - Potential security issue if malicious guest trigger VT-d faults */ -void __init pci_vtd_quirk(struct pci_dev *pdev) +void __hwdom_init pci_vtd_quirk(struct pci_dev *pdev) { int seg = pdev->seg; int bus = pdev->bus; diff --git a/xen/drivers/passthrough/vtd/x86/vtd.c b/xen/drivers/passthrough/vtd/x86/vtd.c index f271a42b28..00131b3ab7 100644 --- a/xen/drivers/passthrough/vtd/x86/vtd.c +++ b/xen/drivers/passthrough/vtd/x86/vtd.c @@ -36,7 +36,7 @@ * iommu_inclusive_mapping: when set, all memory below 4GB is included in dom0 * 1:1 iommu mappings except xen and unusable regions. */ -static bool_t __initdata iommu_inclusive_mapping = 1; +static bool_t __hwdom_initdata iommu_inclusive_mapping = 1; boolean_param("iommu_inclusive_mapping", iommu_inclusive_mapping); void *map_vtd_domain_page(u64 maddr) @@ -107,7 +107,7 @@ void hvm_dpci_isairq_eoi(struct domain *d, unsigned int isairq) spin_unlock(&d->event_lock); } -void __init iommu_set_dom0_mapping(struct domain *d) +void __hwdom_init iommu_set_dom0_mapping(struct domain *d) { unsigned long i, j, tmp, top; diff --git a/xen/include/asm-x86/config.h b/xen/include/asm-x86/config.h index 24f95a37ca..02ab1fc46b 100644 --- a/xen/include/asm-x86/config.h +++ b/xen/include/asm-x86/config.h @@ -54,6 +54,10 @@ #define CONFIG_MULTIBOOT 1 +#ifdef XSM_ENABLE +#define CONFIG_LATE_HWDOM 1 +#endif + #define HZ 100 #define OPT_CONSOLE_STR "vga" diff --git a/xen/include/xen/init.h b/xen/include/xen/init.h index 9d481b3fef..b3bced37ab 100644 --- a/xen/include/xen/init.h +++ b/xen/include/xen/init.h @@ -129,4 +129,12 @@ extern struct kernel_param __setup_start, __setup_end; #define __devexitdata __exitdata #endif +#ifdef CONFIG_LATE_HWDOM +#define __hwdom_init +#define __hwdom_initdata __read_mostly +#else +#define __hwdom_init __init +#define __hwdom_initdata __initdata +#endif + #endif /* _LINUX_INIT_H */