mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 02:01:24 +01:00
iommu: Move dom0 setup code to __hwdom_init
When the hardware domain is split from domain 0, the initialization code for the hardware domain cannot be in the __init section, since the actual domain creation happens after these sections have been discarded. Create a __hwdom_init section designator to annotate these functions, and control it using the XSM configuration option for now (since XSM is required to take advantage of the security benefits of disaggregation). Signed-off-by: Daniel De Graaf <dgdegra@tycho.nsa.gov> Reviewed-by: Jan Beulich <jbeulich@suse.com> Acked-by: Keir Fraser <keir@xen.org>
This commit is contained in:
1 parent
97587d01b3
commit
0a1c4db248
9 files changed
+28
-15
No files matched your search
@@ -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 )
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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 };
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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 */
|
||||