[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH RFC 02/12] xen/x86: split the setup of Dom0 permissions to a function
So that it can also be used by the PVH-specific domain builder. This is just code motion, it should not introduce any functional change. Signed-off-by: Roger Pau Monné <roger.pau@xxxxxxxxxx> --- Cc: Jan Beulich <jbeulich@xxxxxxxx> Cc: Andrew Cooper <andrew.cooper3@xxxxxxxxxx> --- xen/arch/x86/domain_build.c | 164 +++++++++++++++++++++++--------------------- 1 file changed, 86 insertions(+), 78 deletions(-) diff --git a/xen/arch/x86/domain_build.c b/xen/arch/x86/domain_build.c index d7d4afc..09d79be 100644 --- a/xen/arch/x86/domain_build.c +++ b/xen/arch/x86/domain_build.c @@ -869,6 +869,89 @@ static __init void setup_pv_physmap(struct domain *d, unsigned long pgtbl_pfn, unmap_domain_page(l4start); } +static int __init setup_permissions(struct domain *d) +{ + unsigned long mfn; + int i, rc = 0; + + /* The hardware domain is initially permitted full I/O capabilities. */ + rc |= ioports_permit_access(d, 0, 0xFFFF); + rc |= iomem_permit_access(d, 0UL, (1UL << (paddr_bits - PAGE_SHIFT)) - 1); + rc |= irqs_permit_access(d, 1, nr_irqs_gsi - 1); + + /* + * Modify I/O port access permissions. + */ + /* Master Interrupt Controller (PIC). */ + rc |= ioports_deny_access(d, 0x20, 0x21); + /* Slave Interrupt Controller (PIC). */ + rc |= ioports_deny_access(d, 0xA0, 0xA1); + /* Interval Timer (PIT). */ + rc |= ioports_deny_access(d, 0x40, 0x43); + /* PIT Channel 2 / PC Speaker Control. */ + rc |= ioports_deny_access(d, 0x61, 0x61); + /* ACPI PM Timer. */ + if ( pmtmr_ioport ) + rc |= ioports_deny_access(d, pmtmr_ioport, pmtmr_ioport + 3); + /* PCI configuration space (NB. 0xcf8 has special treatment). */ + rc |= ioports_deny_access(d, 0xcfc, 0xcff); + /* Command-line I/O ranges. */ + process_dom0_ioports_disable(d); + + /* + * Modify I/O memory access permissions. + */ + /* Local APIC. */ + if ( mp_lapic_addr != 0 ) + { + mfn = paddr_to_pfn(mp_lapic_addr); + rc |= iomem_deny_access(d, mfn, mfn); + } + /* I/O APICs. */ + for ( i = 0; i < nr_ioapics; i++ ) + { + mfn = paddr_to_pfn(mp_ioapics[i].mpc_apicaddr); + if ( !rangeset_contains_singleton(mmio_ro_ranges, mfn) ) + rc |= iomem_deny_access(d, mfn, mfn); + } + /* MSI range. */ + rc |= iomem_deny_access(d, paddr_to_pfn(MSI_ADDR_BASE_LO), + paddr_to_pfn(MSI_ADDR_BASE_LO + + MSI_ADDR_DEST_ID_MASK)); + /* HyperTransport range. */ + if ( boot_cpu_data.x86_vendor == X86_VENDOR_AMD ) + rc |= iomem_deny_access(d, paddr_to_pfn(0xfdULL << 32), + paddr_to_pfn((1ULL << 40) - 1)); + + /* Remove access to E820_UNUSABLE I/O regions above 1MB. */ + for ( i = 0; i < e820.nr_map; i++ ) + { + unsigned long sfn, efn; + sfn = max_t(unsigned long, paddr_to_pfn(e820.map[i].addr), 0x100ul); + efn = paddr_to_pfn(e820.map[i].addr + e820.map[i].size - 1); + if ( (e820.map[i].type == E820_UNUSABLE) && + (e820.map[i].size != 0) && + (sfn <= efn) ) + rc |= iomem_deny_access(d, sfn, efn); + } + + /* Prevent access to HPET */ + if ( hpet_address ) + { + u8 prot_flags = hpet_flags & ACPI_HPET_PAGE_PROTECT_MASK; + + mfn = paddr_to_pfn(hpet_address); + if ( prot_flags == ACPI_HPET_PAGE_PROTECT4 ) + rc |= iomem_deny_access(d, mfn, mfn); + else if ( prot_flags == ACPI_HPET_PAGE_PROTECT64 ) + rc |= iomem_deny_access(d, mfn, mfn + 15); + else if ( ro_hpet ) + rc |= rangeset_add_singleton(mmio_ro_ranges, mfn); + } + + return rc; +} + int __init construct_dom0( struct domain *d, const module_t *image, unsigned long image_headroom, @@ -1529,84 +1612,9 @@ int __init construct_dom0( if ( test_bit(XENFEAT_supervisor_mode_kernel, parms.f_required) ) panic("Dom0 requires supervisor-mode execution"); - rc = 0; - - /* The hardware domain is initially permitted full I/O capabilities. */ - rc |= ioports_permit_access(d, 0, 0xFFFF); - rc |= iomem_permit_access(d, 0UL, (1UL << (paddr_bits - PAGE_SHIFT)) - 1); - rc |= irqs_permit_access(d, 1, nr_irqs_gsi - 1); - - /* - * Modify I/O port access permissions. - */ - /* Master Interrupt Controller (PIC). */ - rc |= ioports_deny_access(d, 0x20, 0x21); - /* Slave Interrupt Controller (PIC). */ - rc |= ioports_deny_access(d, 0xA0, 0xA1); - /* Interval Timer (PIT). */ - rc |= ioports_deny_access(d, 0x40, 0x43); - /* PIT Channel 2 / PC Speaker Control. */ - rc |= ioports_deny_access(d, 0x61, 0x61); - /* ACPI PM Timer. */ - if ( pmtmr_ioport ) - rc |= ioports_deny_access(d, pmtmr_ioport, pmtmr_ioport + 3); - /* PCI configuration space (NB. 0xcf8 has special treatment). */ - rc |= ioports_deny_access(d, 0xcfc, 0xcff); - /* Command-line I/O ranges. */ - process_dom0_ioports_disable(d); - - /* - * Modify I/O memory access permissions. - */ - /* Local APIC. */ - if ( mp_lapic_addr != 0 ) - { - mfn = paddr_to_pfn(mp_lapic_addr); - rc |= iomem_deny_access(d, mfn, mfn); - } - /* I/O APICs. */ - for ( i = 0; i < nr_ioapics; i++ ) - { - mfn = paddr_to_pfn(mp_ioapics[i].mpc_apicaddr); - if ( !rangeset_contains_singleton(mmio_ro_ranges, mfn) ) - rc |= iomem_deny_access(d, mfn, mfn); - } - /* MSI range. */ - rc |= iomem_deny_access(d, paddr_to_pfn(MSI_ADDR_BASE_LO), - paddr_to_pfn(MSI_ADDR_BASE_LO + - MSI_ADDR_DEST_ID_MASK)); - /* HyperTransport range. */ - if ( boot_cpu_data.x86_vendor == X86_VENDOR_AMD ) - rc |= iomem_deny_access(d, paddr_to_pfn(0xfdULL << 32), - paddr_to_pfn((1ULL << 40) - 1)); - - /* Remove access to E820_UNUSABLE I/O regions above 1MB. */ - for ( i = 0; i < e820.nr_map; i++ ) - { - unsigned long sfn, efn; - sfn = max_t(unsigned long, paddr_to_pfn(e820.map[i].addr), 0x100ul); - efn = paddr_to_pfn(e820.map[i].addr + e820.map[i].size - 1); - if ( (e820.map[i].type == E820_UNUSABLE) && - (e820.map[i].size != 0) && - (sfn <= efn) ) - rc |= iomem_deny_access(d, sfn, efn); - } - - /* Prevent access to HPET */ - if ( hpet_address ) - { - u8 prot_flags = hpet_flags & ACPI_HPET_PAGE_PROTECT_MASK; - - mfn = paddr_to_pfn(hpet_address); - if ( prot_flags == ACPI_HPET_PAGE_PROTECT4 ) - rc |= iomem_deny_access(d, mfn, mfn); - else if ( prot_flags == ACPI_HPET_PAGE_PROTECT64 ) - rc |= iomem_deny_access(d, mfn, mfn + 15); - else if ( ro_hpet ) - rc |= rangeset_add_singleton(mmio_ro_ranges, mfn); - } - - BUG_ON(rc != 0); + rc = setup_permissions(d); + if ( rc != 0 ) + panic("Failed to setup Dom0 permissions"); if ( elf_check_broken(&elf) ) printk(" Xen warning: dom0 kernel broken ELF: %s\n", -- 2.7.4 (Apple Git-66) _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx https://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |