lkml.org 
[lkml]   [2008]   [Nov]   [13]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Subject[PATCH 22 of 38] xen dom0: Set up basic IO permissions for dom0
    Date
    From
    From: Juan Quintela <quintela@redhat.com>

    Add the direct mapping area for ISA bus access, and enable IO space
    access for the guest when running as dom0.

    Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
    Signed-off-by: Juan Quintela <quintela@redhat.com>
    ---
    arch/x86/xen/enlighten.c | 32 ++++++++++++++++++++++++++++++++
    arch/x86/xen/setup.c | 6 +++++-
    2 files changed, 37 insertions(+), 1 deletion(-)

    diff --git a/arch/x86/xen/enlighten.c b/arch/x86/xen/enlighten.c
    --- a/arch/x86/xen/enlighten.c
    +++ b/arch/x86/xen/enlighten.c
    @@ -1437,6 +1437,7 @@
    return __ka(m2p(maddr));
    }

    +/* Set the page permissions on an identity-mapped pages */
    static void set_page_prot(void *addr, pgprot_t prot)
    {
    unsigned long pfn = __pa(addr) >> PAGE_SHIFT;
    @@ -1492,6 +1493,29 @@
    set_page_prot(pmd, PAGE_KERNEL_RO);
    }

    +static __init void xen_ident_map_ISA(void)
    +{
    + unsigned long pa;
    +
    + /*
    + * If we're dom0, then linear map the ISA machine addresses into
    + * the kernel's address space.
    + */
    + if (!xen_initial_domain())
    + return;
    +
    + xen_raw_printk("Xen: setup ISA identity maps\n");
    +
    + for (pa = ISA_START_ADDRESS; pa < ISA_END_ADDRESS; pa += PAGE_SIZE) {
    + pte_t pte = mfn_pte(PFN_DOWN(pa), PAGE_KERNEL_IO);
    +
    + if (HYPERVISOR_update_va_mapping(PAGE_OFFSET + pa, pte, 0))
    + BUG();
    + }
    +
    + xen_flush_tlb();
    +}
    +
    #ifdef CONFIG_X86_64
    static void convert_pfn_mfn(void *v)
    {
    @@ -1674,6 +1698,7 @@

    xen_raw_console_write("mapping kernel into physical memory\n");
    pgd = xen_setup_kernel_pagetable(pgd, xen_start_info->nr_pages);
    + xen_ident_map_ISA();

    init_mm.pgd = pgd;

    @@ -1683,6 +1708,13 @@
    if (xen_feature(XENFEAT_supervisor_mode_kernel))
    pv_info.kernel_rpl = 0;

    + if (xen_initial_domain()) {
    + struct physdev_set_iopl set_iopl;
    + set_iopl.iopl = 1;
    + if (HYPERVISOR_physdev_op(PHYSDEVOP_set_iopl, &set_iopl) == -1)
    + BUG();
    + }
    +
    /* set the limit of our address space */
    xen_reserve_top();

    diff --git a/arch/x86/xen/setup.c b/arch/x86/xen/setup.c
    --- a/arch/x86/xen/setup.c
    +++ b/arch/x86/xen/setup.c
    @@ -51,6 +51,9 @@
    * Even though this is normal, usable memory under Xen, reserve
    * ISA memory anyway because too many things think they can poke
    * about in there.
    + *
    + * In a dom0 kernel, this region is identity mapped with the
    + * hardware ISA area, so it really is out of bounds.
    */
    e820_add_region(ISA_START_ADDRESS, ISA_END_ADDRESS - ISA_START_ADDRESS,
    E820_RESERVED);
    @@ -188,7 +191,8 @@

    pm_idle = xen_idle;

    - paravirt_disable_iospace();
    + if (!xen_initial_domain())
    + paravirt_disable_iospace();

    fiddle_vdso();
    }



    \
     
     \ /
      Last update: 2008-11-13 20:45    [W:4.034 / U:0.068 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site