WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-ia64-devel

Re: [Xen-ia64-devel] Re: [patch 14/15] ia64: kexec: Only map PAL when ma

To: Simon Horman <horms@xxxxxxxxxxxx>
Subject: Re: [Xen-ia64-devel] Re: [patch 14/15] ia64: kexec: Only map PAL when making EFI, PAL or SAL calls
From: Isaku Yamahata <yamahata@xxxxxxxxxxxxx>
Date: Wed, 16 Jul 2008 11:37:41 +0900
Cc: Aron Griffis <aron@xxxxxx>, Alex Williamson <alex.williamson@xxxxxx>, xen-ia64-devel@xxxxxxxxxxxxxxxxxxx
Delivery-date: Tue, 15 Jul 2008 19:37:47 -0700
Envelope-to: www-data@xxxxxxxxxxxxxxxxxxx
In-reply-to: <20080716022051.GA5573@xxxxxxxxxxxx>
List-help: <mailto:xen-ia64-devel-request@lists.xensource.com?subject=help>
List-id: Discussion of the ia64 port of Xen <xen-ia64-devel.lists.xensource.com>
List-post: <mailto:xen-ia64-devel@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/mailman/listinfo/xen-ia64-devel>, <mailto:xen-ia64-devel-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-ia64-devel>, <mailto:xen-ia64-devel-request@lists.xensource.com?subject=unsubscribe>
References: <20080715003515.049071792@xxxxxxxxxxxx> <20080715004219.662154634@xxxxxxxxxxxx> <20080715024317.GB12668%yamahata@xxxxxxxxxxxxx> <20080715031517.GB22164@xxxxxxxxxxxx> <20080715062543.GA28759@xxxxxxxxxxxx> <20080716022051.GA5573@xxxxxxxxxxxx>
Sender: xen-ia64-devel-bounces@xxxxxxxxxxxxxxxxxxx
User-agent: Mutt/1.5.6i
On Wed, Jul 16, 2008 at 12:20:54PM +1000, Simon Horman wrote:
> Move PAL code from the Xen identity mapped region to the
> EFI identity mapped region, which overlaps with guest virtual space.
> 
> Make sure that PAL memory is only pinned into the TLB when making
> EFI, PAL or SAL calls.
> 
> This seems to be nice as it provides a symmetrical approach to
> mapping an unmapping pal code.
> 
> However it would be just as safe, and arguably simpler just to map
> the PAL code (once?) when the EFI RR is active - for instance very
> early on in boot, or when calling XEN_EFI_RR_ENTER. In other words,
> unpining is XEN_EFI_RR_LEAVE shouldn't be neccessary, as the EFI RR
> should protect the memory from unwanted accesses by guests (or
> the hypevisor for that matter).
> 
> This patch is mostly the work of Yamahata-san.
> 
> Cc: Isaku Yamahata <yamahata@xxxxxxxxxxxxx>
> Signed-off-by: Simon Horman <horms@xxxxxxxxxxxx>
> 
> Tue, 15 Jul 2008 13:06:42 +1000
> * Remove spurious change of ptr.i to ptr.d
>   just above .vpd_not_mapped in ia64_do_tlb_purge.
> 
> Wed, 16 Jul 2008 12:16:51 +1000
> * Unpin PAL in efi_map_pal_code() to ensure that it isn't present
>   when pinned. Thanks to Yamahata-san.
> 
> Index: xen-unstable.hg/xen/arch/ia64/linux-xen/efi.c
> ===================================================================
> --- xen-unstable.hg.orig/xen/arch/ia64/linux-xen/efi.c        2008-07-16 
> 11:53:25.000000000 +1000
> +++ xen-unstable.hg/xen/arch/ia64/linux-xen/efi.c     2008-07-16 
> 12:15:17.000000000 +1000
> @@ -424,7 +424,7 @@ efi_get_pal_addr (void)
>                       md->phys_addr + (md->num_pages << EFI_PAGE_SHIFT),
>                       vaddr & mask, (vaddr & mask) + IA64_GRANULE_SIZE);
>  #endif
> -             return __va(md->phys_addr);
> +             return __va_efi(md->phys_addr);
>       }
>       printk(KERN_WARNING "%s: no PAL-code memory-descriptor found\n",
>              __FUNCTION__);
> @@ -432,7 +432,7 @@ efi_get_pal_addr (void)
>  }
>  
>  #ifdef XEN
> -void *pal_vaddr = 0;
> +static void *pal_vaddr = 0;
>  
>  void *
>  efi_get_pal_addr(void)
> @@ -443,24 +443,53 @@ efi_get_pal_addr(void)
>  }
>  #endif
>  
> +#ifdef XEN
> +static void
> +__efi_unmap_pal_code (void *pal_vaddr)
> +{
> +     ia64_ptr(0x1, GRANULEROUNDDOWN((unsigned long)pal_vaddr),
> +              IA64_GRANULE_SHIFT);
> +}
> +
>  void
> -efi_map_pal_code (void)
> +efi_unmap_pal_code (void)
>  {
> -#ifdef XEN
> -     u64 psr;
> -     (void)efi_get_pal_addr();
> -#else
>       void *pal_vaddr = efi_get_pal_addr ();
>       u64 psr;
>  
>       if (!pal_vaddr)
>               return;
> +
> +     /*
> +      * Cannot write to CRx with PSR.ic=1
> +      */
> +     psr = ia64_clear_ic();
> +     __efi_unmap_pal_code(pal_vaddr);
> +     ia64_ptr(0x1, GRANULEROUNDDOWN((unsigned long)pal_vaddr),
> +              IA64_GRANULE_SHIFT);
> +     ia64_set_psr(psr);              /* restore psr */
> +     ia64_srlz_i();
> +}

Forgot to delete ia64_ptr()?

>  #endif
>  
> +void
> +efi_map_pal_code (void)
> +{
> +     void *pal_vaddr = efi_get_pal_addr ();
> +     u64 psr;
> +
> +     if (!pal_vaddr)
> +             return;
> +
>       /*
>        * Cannot write to CRx with PSR.ic=1
>        */
>       psr = ia64_clear_ic();
> +#ifdef XEN
> +     /* pal_vaddr must be unpinned before pinning
> +      * This is needed in the case of a nested EFI, PAL or SAL call */
> +     __efi_unmap_pal_code(pal_vaddr);
> +#endif
>       ia64_itr(0x1, IA64_TR_PALCODE, GRANULEROUNDDOWN((unsigned long) 
> pal_vaddr),
>                pte_val(pfn_pte(__pa(pal_vaddr) >> PAGE_SHIFT, PAGE_KERNEL)),
>                IA64_GRANULE_SHIFT);
> @@ -594,7 +623,9 @@ efi_init (void)
>       }
>  #endif
>  
> +#ifndef XEN
>       efi_map_pal_code();
> +#endif
>       efi_enter_virtual_mode();
>  }
>  
> Index: xen-unstable.hg/xen/arch/ia64/linux-xen/mca_asm.S
> ===================================================================
> --- xen-unstable.hg.orig/xen/arch/ia64/linux-xen/mca_asm.S    2008-07-16 
> 11:53:25.000000000 +1000
> +++ xen-unstable.hg/xen/arch/ia64/linux-xen/mca_asm.S 2008-07-16 
> 11:53:26.000000000 +1000
> @@ -473,6 +473,7 @@ ia64_reload_tr:
>       ;;
>       srlz.d
>       ;;
> +#ifndef XEN
>       // 3. Reload ITR for PAL code.
>       GET_THIS_PADDR(r2, ia64_mca_pal_pte)
>       ;;
> @@ -491,6 +492,8 @@ ia64_reload_tr:
>       ;;
>       srlz.i
>       ;;
> +#endif
> +
>       // 4. Reload DTR for stack.
>  #ifdef XEN
>       // Kernel registers are saved in a per_cpu cpu_kr_ia64_t
> Index: xen-unstable.hg/xen/arch/ia64/vmx/vmx_entry.S
> ===================================================================
> --- xen-unstable.hg.orig/xen/arch/ia64/vmx/vmx_entry.S        2008-07-16 
> 11:53:25.000000000 +1000
> +++ xen-unstable.hg/xen/arch/ia64/vmx/vmx_entry.S     2008-07-16 
> 11:53:26.000000000 +1000
> @@ -598,7 +598,7 @@ END(ia64_leave_hypercall)
>  /*
>   * in0: new rr7
>   * in1: virtual address of guest_vhpt
> - * in2: virtual address of pal code segment
> + * in2: virtual addres of guest shared_info
>   * r8: will contain old rid value
>   */
>  
> @@ -611,7 +611,7 @@ END(ia64_leave_hypercall)
>  GLOBAL_ENTRY(__vmx_switch_rr7)
>         // not sure this unwind statement is correct...
>         .prologue ASM_UNW_PRLG_RP|ASM_UNW_PRLG_PFS, ASM_UNW_PRLG_GRSAVE(1)
> -     alloc loc1 = ar.pfs, 4, 8, 0, 0
> +     alloc loc1 = ar.pfs, 4, 7, 0, 0
>  1:{
>       mov r28  = in0                  // copy procedure index
>       mov r8   = ip                   // save ip to compute branch
> @@ -623,13 +623,10 @@ GLOBAL_ENTRY(__vmx_switch_rr7)
>       tpa loc2 = loc2                 // get physical address of per cpu date
>       tpa r3 = r8                     // get physical address of ip
>       dep loc5 = 0,in1,60,4           // get physical address of guest_vhpt
> -     dep loc6 = 0,in2,60,4           // get physical address of pal code
> -     dep loc7 = 0,in3,60,4           // get physical address of privregs
> +     dep loc6 = 0,in2,60,4           // get physical address of privregs
>       ;;
>       dep loc6 = 0,loc6,0,IA64_GRANULE_SHIFT
>                                          // mask granule shift
> -     dep loc7 = 0,loc7,0,IA64_GRANULE_SHIFT
> -                                        // mask granule shift
>       mov loc4 = psr                  // save psr
>       ;;
>       mov loc3 = ar.rsc               // save RSE configuration
> @@ -725,46 +722,31 @@ GLOBAL_ENTRY(__vmx_switch_rr7)
>       ;;
>  .vhpt_overlaps:
>  
> -     // re-pin mappings for PAL code section
> -     mov r24=IA64_TR_PALCODE
> -     or loc6 = r25,loc6              // construct PA | page properties
> -     mov r23 = IA64_GRANULE_SHIFT<<2
> -     ;;
> -     ptr.i   in2,r23
> -     ;;
> -     mov cr.itir=r23
> -     mov cr.ifa=in2
> -     ;;
> -     itr.i itr[r24]=loc6             // wire in new mapping...
> -     ;;
> -
>       // r16, r19, r20 are used by
>       //  ia64_switch_mode_phys()/ia64_switch_mode_virt()
>       // re-pin mappings for privregs
>       // r21  = (current physical addr) & (IA64_GRANULE_SIZE - 1)
>       // r17  = (guest_vhpt physical addr) & (IA64_GRANULE_SIZE - 1)
> -     // loc6 = (((pal phys addr) & (IA64_GRANULE_SIZE - 1) << 2)) | 
> PAGE_KERNEL
> -     // loc7 = (privregs physical addr) & (IA64_GRANULE_SIZE - 1)
> -     cmp.ne.unc p7,p0=r21,loc7       // check overlap with current stack
> +     // loc6 = (privregs physical addr) & (IA64_GRANULE_SIZE - 1)
> +     cmp.ne.unc p7,p0=r21,loc6       // check overlap with current stack
>       ;;
> -(p7) cmp.ne.unc p8,p0=r17,loc7       // check overlap with guest_vhpt
> +(p7) cmp.ne.unc p8,p0=r17,loc6       // check overlap with guest_vhpt
>       ;;
> -     // loc7 = (((privregs phys) & (IA64_GRANULE_SIZE - 1)) << 2) | 
> PAGE_KERNEL
> -     or loc7 = r25,loc7          // construct PA | page properties
> +     // loc6 = (((privregs phys) & (IA64_GRANULE_SIZE - 1)) << 2) | 
> PAGE_KERNEL
> +     or loc6 = r25,loc6          // construct PA | page properties
>       ;;
> -     cmp.ne p9,p0=loc6,loc7
>       mov r22=IA64_TR_VPD
>       mov r24=IA64_TR_MAPPED_REGS
>       mov r23=IA64_GRANULE_SHIFT<<2
>       ;;
> -(p9) ptr.i   in3,r23 
> -(p8) ptr.d   in3,r23
> +     ptr.i   in2,r23
> +(p8) ptr.d   in2,r23
>       mov cr.itir=r23
> -     mov cr.ifa=in3
> +     mov cr.ifa=in2
>       ;;
> -(p9) itr.i itr[r22]=loc7         // wire in new mapping...
> +     itr.i itr[r22]=loc6         // wire in new mapping...
>       ;;
> -(p8) itr.d dtr[r24]=loc7         // wire in new mapping...
> +(p8) itr.d dtr[r24]=loc6         // wire in new mapping...
>       ;;
>  
>       // done, switch back to virtual and return
> Index: xen-unstable.hg/xen/arch/ia64/vmx/vmx_phy_mode.c
> ===================================================================
> --- xen-unstable.hg.orig/xen/arch/ia64/vmx/vmx_phy_mode.c     2008-07-16 
> 08:29:58.000000000 +1000
> +++ xen-unstable.hg/xen/arch/ia64/vmx/vmx_phy_mode.c  2008-07-16 
> 11:53:26.000000000 +1000
> @@ -133,8 +133,6 @@ vmx_init_all_rr(VCPU *vcpu)
>       VMX(vcpu, vrr[VRN7]) = 0x738;
>  }
>  
> -extern void * pal_vaddr;
> -
>  void
>  vmx_load_all_rr(VCPU *vcpu)
>  {
> @@ -173,7 +171,7 @@ vmx_load_all_rr(VCPU *vcpu)
>       ia64_dv_serialize_data();
>       vmx_switch_rr7(vrrtomrr(vcpu,VMX(vcpu, vrr[VRN7])),
>                        (void *)vcpu->arch.vhpt.hash,
> -                    pal_vaddr, vcpu->arch.privregs);
> +                    vcpu->arch.privregs);
>       ia64_set_pta(VMX(vcpu, mpta));
>       vmx_ia64_set_dcr(vcpu);
>  
> Index: xen-unstable.hg/xen/arch/ia64/vmx/vmx_vcpu.c
> ===================================================================
> --- xen-unstable.hg.orig/xen/arch/ia64/vmx/vmx_vcpu.c 2008-07-16 
> 11:53:25.000000000 +1000
> +++ xen-unstable.hg/xen/arch/ia64/vmx/vmx_vcpu.c      2008-07-16 
> 11:53:26.000000000 +1000
> @@ -197,12 +197,12 @@ void vmx_vcpu_set_rr_fast(VCPU *vcpu, u6
>  }
>  
>  void vmx_switch_rr7(unsigned long rid, void *guest_vhpt,
> -                    void *pal_vaddr, void *shared_arch_info)
> +                    void *shared_arch_info)
>  {
>      __get_cpu_var(inserted_vhpt) = (unsigned long)guest_vhpt;
>      __get_cpu_var(inserted_vpd) = (unsigned long)shared_arch_info;
>      __get_cpu_var(inserted_mapped_regs) = (unsigned long)shared_arch_info;
> -    __vmx_switch_rr7(rid, guest_vhpt, pal_vaddr, shared_arch_info);
> +    __vmx_switch_rr7(rid, guest_vhpt, shared_arch_info);
>  }
>  
>  IA64FAULT vmx_vcpu_set_rr(VCPU *vcpu, u64 reg, u64 val)
> @@ -219,7 +219,7 @@ IA64FAULT vmx_vcpu_set_rr(VCPU *vcpu, u6
>      case VRN7:
>          if (likely(vcpu == current))
>              vmx_switch_rr7(vrrtomrr(vcpu,val), (void *)vcpu->arch.vhpt.hash,
> -                           pal_vaddr, vcpu->arch.privregs);
> +                           vcpu->arch.privregs);
>         break;
>      case VRN4:
>          rrval = vrrtomrr(vcpu,val);
> Index: xen-unstable.hg/xen/arch/ia64/xen/xenasm.S
> ===================================================================
> --- xen-unstable.hg.orig/xen/arch/ia64/xen/xenasm.S   2008-07-16 
> 11:53:25.000000000 +1000
> +++ xen-unstable.hg/xen/arch/ia64/xen/xenasm.S        2008-07-16 
> 11:53:26.000000000 +1000
> @@ -34,12 +34,13 @@
>  //                         unsigned long va_vhpt)     /* in4 */
>  //Local usage:
>  //  loc0=rp, loc1=ar.pfs, loc2=percpu_paddr, loc3=psr, loc4=ar.rse
> -//  loc5=pal_vaddr, loc6=xen_paddr, loc7=shared_archinfo_paddr,
> +//  loc5=shared_archinfo_paddr, loc6=xen_paddr,
>  //  r16, r19, r20 are used by ia64_switch_mode_{phys, virt}()
> +// loc5 is unused.
>  GLOBAL_ENTRY(ia64_new_rr7)
>       // FIXME? not sure this unwind statement is correct...
>       .prologue ASM_UNW_PRLG_RP|ASM_UNW_PRLG_PFS, ASM_UNW_PRLG_GRSAVE(1)
> -     alloc loc1 = ar.pfs, 5, 8, 0, 0
> +     alloc loc1 = ar.pfs, 5, 7, 0, 0
>       movl loc2=PERCPU_ADDR
>  1:   {
>         mov loc3 = psr                // save psr     
> @@ -51,7 +52,7 @@ GLOBAL_ENTRY(ia64_new_rr7)
>       tpa in1=in1                     // grab shared_info BEFORE changing rr7
>       adds r8 = 1f-1b,r8              // calculate return address for call
>       ;;
> -     tpa loc7=in2                    // grab arch_vcpu_info BEFORE chg rr7
> +     tpa loc5=in2                    // grab arch_vcpu_info BEFORE chg rr7
>       movl r17=PSR_BITS_TO_SET
>       mov loc4=ar.rsc                 // save RSE configuration
>       movl r16=PSR_BITS_TO_CLEAR
> @@ -60,10 +61,7 @@ GLOBAL_ENTRY(ia64_new_rr7)
>       mov ar.rsc=0                    // put RSE in enforced lazy, LE mode
>       or loc3=loc3,r17                // add in psr the bits to set
>       ;;
> -     movl loc5=pal_vaddr             // get pal_vaddr
> -     ;;
> -     ld8 loc5=[loc5]                 // read pal_vaddr
> -     ;;
> +
>       andcm r16=loc3,r16              // removes bits to clear from psr
>       dep loc6=0,r8,0,KERNEL_TR_PAGE_SHIFT // Xen code paddr
>       br.call.sptk.many rp=ia64_switch_mode_phys
> @@ -163,25 +161,13 @@ GLOBAL_ENTRY(ia64_new_rr7)
>       add r22=r22,in3
>       ;;
>       ptr.d   r22,r24
> -     or r23=loc7,r25                 // construct PA | page properties
> +     or r23=loc5,r25                 // construct PA | page properties
>       mov cr.itir=r24
>       mov cr.ifa=r22
>       mov r21=IA64_TR_MAPPED_REGS
>       ;;
>       itr.d dtr[r21]=r23              // wire in new mapping...
>  
> -     // Purge/insert PAL TR
> -     mov r24=IA64_TR_PALCODE
> -     mov r23=IA64_GRANULE_SHIFT<<2
> -     dep r25=0,loc5,60,4             // convert pal vaddr to paddr
> -     ;;
> -     ptr.i   loc5,r23
> -     or r25=r25,r26                  // construct PA | page properties
> -     mov cr.itir=r23
> -     mov cr.ifa=loc5
> -     ;;
> -     itr.i itr[r24]=r25
> -
>       // done, switch back to virtual and return
>       mov r16=loc3                    // r16= original psr
>       br.call.sptk.many rp=ia64_switch_mode_virt // return to virtual mode
> @@ -216,7 +202,7 @@ END(ia64_new_rr7)
>  GLOBAL_ENTRY(ia64_new_rr7_efi)
>       // FIXME? not sure this unwind statement is correct...
>       .prologue ASM_UNW_PRLG_RP|ASM_UNW_PRLG_PFS, ASM_UNW_PRLG_GRSAVE(1)
> -     alloc loc1 = ar.pfs, 3, 8, 0, 0
> +     alloc loc1 = ar.pfs, 3, 7, 0, 0
>       movl loc2=PERCPU_ADDR
>  1:   {
>         mov loc3 = psr                // save psr
> @@ -235,17 +221,13 @@ GLOBAL_ENTRY(ia64_new_rr7_efi)
>       mov ar.rsc=0                    // put RSE in enforced lazy, LE mode
>       or loc3=loc3,r17                // add in psr the bits to set
>       ;;
> -        movl loc5=pal_vaddr             // get pal_vaddr
> -     ;;
> -     ld8 loc5=[loc5]                 // read pal_vaddr
> +     dep loc6 = 0,in2,60,4           // get physical address of VPD
>       ;;
> -     dep loc7 = 0,in2,60,4           // get physical address of VPD
> -     ;;
> -     dep loc7 = 0,loc7,0,IA64_GRANULE_SHIFT
> +     dep loc6 = 0,loc6,0,IA64_GRANULE_SHIFT
>                                       // mask granule shift
>       ;;
>       andcm r16=loc3,r16              // removes bits to clear from psr
> -     dep loc6=0,r8,0,KERNEL_TR_PAGE_SHIFT // Xen code paddr
> +     dep loc5=0,r8,0,KERNEL_TR_PAGE_SHIFT // Xen code paddr
>       br.call.sptk.many rp=ia64_switch_mode_phys
>  1:
>       movl    r26=PAGE_KERNEL
> @@ -271,7 +253,7 @@ GLOBAL_ENTRY(ia64_new_rr7_efi)
>       mov r16=IA64_TR_KERNEL
>       mov cr.itir=r24
>       mov cr.ifa=r17
> -     or r18=loc6,r26
> +     or r18=loc5,r26
>       ;;
>       itr.i itr[r16]=r18
>       ;;
> @@ -324,7 +306,7 @@ ia64_new_rr7_efi_percpu_not_mapped:
>       // VPD
>       cmp.eq p7,p0=r0,in2
>  (p7) br.cond.sptk ia64_new_rr7_efi_vpd_not_mapped
> -     or loc7 = r26,loc7              // construct PA | page properties
> +     or loc6 = r26,loc6              // construct PA | page properties
>       mov r22=IA64_TR_VPD
>       mov r24=IA64_TR_MAPPED_REGS
>       mov r23=IA64_GRANULE_SHIFT<<2
> @@ -340,9 +322,9 @@ ia64_new_rr7_efi_percpu_not_mapped:
>       mov cr.itir=r23
>       mov cr.ifa=in2
>       ;;
> -     itr.i itr[r22]=loc7
> +     itr.i itr[r22]=loc6
>       ;;
> -     itr.d dtr[r24]=loc7
> +     itr.d dtr[r24]=loc6
>       ;;
>       srlz.i
>       ;;
> @@ -350,18 +332,6 @@ ia64_new_rr7_efi_percpu_not_mapped:
>       ;;
>  ia64_new_rr7_efi_vpd_not_mapped:
>  
> -     // Purge/insert PAL TR
> -     mov r24=IA64_TR_PALCODE
> -     mov r23=IA64_GRANULE_SHIFT<<2
> -     dep r25=0,loc5,60,4             // convert pal vaddr to paddr
> -     ;;
> -     ptr.i   loc5,r23
> -     or r25=r25,r26                  // construct PA | page properties
> -     mov cr.itir=r23
> -     mov cr.ifa=loc5
> -     ;;
> -     itr.i itr[r24]=r25
> -
>       // done, switch back to virtual and return
>       mov r16=loc3                    // r16= original psr
>       br.call.sptk.many rp=ia64_switch_mode_virt // return to virtual mode
> Index: xen-unstable.hg/xen/include/asm-ia64/linux-xen/linux/efi.h
> ===================================================================
> --- xen-unstable.hg.orig/xen/include/asm-ia64/linux-xen/linux/efi.h   
> 2008-07-16 11:53:24.000000000 +1000
> +++ xen-unstable.hg/xen/include/asm-ia64/linux-xen/linux/efi.h        
> 2008-07-16 11:54:29.000000000 +1000
> @@ -24,10 +24,6 @@
>  #include <asm/page.h>
>  #include <asm/system.h>
>  
> -#ifdef XEN
> -extern void * pal_vaddr;
> -#endif
> -
>  #define EFI_SUCCESS          0
>  #define EFI_LOAD_ERROR          ( 1 | (1UL << (BITS_PER_LONG-1)))
>  #define EFI_INVALID_PARAMETER        ( 2 | (1UL << (BITS_PER_LONG-1)))
> @@ -302,6 +298,9 @@ efi_guid_unparse(efi_guid_t *guid, char 
>  extern void efi_init (void);
>  extern void *efi_get_pal_addr (void);
>  extern void efi_map_pal_code (void);
> +#ifdef XEN
> +extern void efi_unmap_pal_code (void);
> +#endif
>  extern void efi_map_memmap(void);
>  extern void efi_memmap_walk (efi_freemem_callback_t callback, void *arg);
>  extern void efi_gettimeofday (struct timespec *ts);
> @@ -471,9 +470,11 @@ struct efi_generic_dev_path {
>       rr7 = ia64_get_rr(7UL << 61);                   \
>       set_one_rr_efi(6UL << 61, XEN_EFI_RR);          \
>       set_one_rr_efi(7UL << 61, XEN_EFI_RR);          \
> +     efi_map_pal_code();                             \
>  } while (0)
>  
>  #define XEN_EFI_RR_LEAVE(rr6, rr7) do {                      \
> +     efi_unmap_pal_code();                           \
>       set_one_rr_efi(6UL << 61, rr6);                 \
>       set_one_rr_efi(7UL << 61, rr7);                 \
>  } while (0)
> Index: xen-unstable.hg/xen/include/asm-ia64/vmx_vcpu.h

I think XEN_EFI_RR_LEAVE() should call efi_unmap_pal_code()
conditionally with rr7 check because in nested firmware
calling case, itr[IA64_TR_PALCODE] should not be purged.
Otherwise it returns back to firmware, undesirable things would happen.


> ===================================================================
> --- xen-unstable.hg.orig/xen/include/asm-ia64/vmx_vcpu.h      2008-07-16 
> 11:53:25.000000000 +1000
> +++ xen-unstable.hg/xen/include/asm-ia64/vmx_vcpu.h   2008-07-16 
> 11:53:26.000000000 +1000
> @@ -104,9 +104,9 @@ extern uint64_t guest_read_vivr(VCPU * v
>  extern int vmx_vcpu_pend_interrupt(VCPU * vcpu, uint8_t vector);
>  extern void vcpu_load_kernel_regs(VCPU * vcpu);
>  extern void __vmx_switch_rr7(unsigned long rid, void *guest_vhpt,
> -                             void *pal_vaddr, void *shared_arch_info);
> +                             void *shared_arch_info);
>  extern void vmx_switch_rr7(unsigned long rid, void *guest_vhpt,
> -                           void *pal_vaddr, void *shared_arch_info);
> +                           void *shared_arch_info);
>  extern void vmx_ia64_set_dcr(VCPU * v);
>  extern void inject_guest_interruption(struct vcpu *vcpu, u64 vec);
>  extern void vmx_asm_bsw0(void);
> Index: xen-unstable.hg/xen/arch/ia64/linux-xen/smpboot.c
> ===================================================================
> --- xen-unstable.hg.orig/xen/arch/ia64/linux-xen/smpboot.c    2008-07-16 
> 08:29:58.000000000 +1000
> +++ xen-unstable.hg/xen/arch/ia64/linux-xen/smpboot.c 2008-07-16 
> 11:53:26.000000000 +1000
> @@ -438,7 +438,9 @@ start_secondary (void *unused)
>       /* Early console may use I/O ports */
>       ia64_set_kr(IA64_KR_IO_BASE, __pa(ia64_iobase));
>       Dprintk("start_secondary: starting CPU 0x%x\n", 
> hard_smp_processor_id());
> +#ifndef XEN
>       efi_map_pal_code();
> +#endif
>       cpu_init();
>       smp_callin();
>  
> 

-- 
yamahata

_______________________________________________
Xen-ia64-devel mailing list
Xen-ia64-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-ia64-devel

<Prev in Thread] Current Thread [Next in Thread>