[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-ia64-devel] [patch 10/12] ia64: kexec: Use a separate RID for EFI
Hi Simon-san. Just a minor nit. Could you move sal.h under xen/include/asm-ia64/linux-xen/asm/sal.h update README.origin because sal.h isn't same as Linux's any more. On Thu, Mar 20, 2008 at 05:52:58PM +1100, Simon Horman wrote: > This activates the use of the EFI RID. > > The basic idea is to switch to this RID, which is in the range reserved > for the hypervisor, before making EFI, PAL or SAL calls. The page fault > handler where the identity mapping checks for this RID, if present it > does the identity mapping, else it just follows the normal mapping > rules. In this way, VMX domains should not be able to access this > memory, and they should be able to use the virtual addresses that are > used by EFI for their own purposes. > > Subsequent patches move EFI memory such that faults to it will > be protected by the EFI RID. > > Cc: Tristan Gingold <tgingold@xxxxxxx> > Cc: Isaku Yamahata <yamahata@xxxxxxxxxxxxx> > Cc: Alex Williamson <alex.williamson@xxxxxx> > Cc: Aron Griffis <aron@xxxxxx> > Signed-off-by: Simon Horman <horms@xxxxxxxxxxxx> > > --- > Tue, 23 Oct 2007 15:47:27 +0900 > > * Don't use #ifndef XEN to denote changes to SAL, PAL and EFI macros, > as this means that the macros have to be duplicated which leads to > a very bulky patch. Instead, define the new functionality as > XEN_EFI_RR_SAVE and XEN_EFI_RR_RESTORE (previously EFI_RR_SAV and > EFI_RR_RESTOR) and put these macros straight into the existing macros - > this should be obvious enough for future up-porters. > > As suggested by Alex Williamson. > > * Break header changes out into a separate patch > > * Break macro definitions out into a separate patch and > put them in efi.h instead of pal.h. Documentation of how the > EFI RID is selected is included in this new patch. > > * Use a uniform defineition of XEN_EFI_RID in assembly and C code > > Mon, 29 Oct 2007 13:43:33 +0900 > > * Put assembly code into a separate patch > > * C code is no longer needed with the new assembly code > > Mon, 12 Nov 2007 12:02:59 +0900 > > * Trivial upport to ia64/xen-unstable.hg 16287:b235b68a0f4f > > Thu, 22 Nov 2007 00:19:38 -0700 > > * Make use of XEN_EFI_RR_DECLARE for consistency > - There were instances of rr6 and rr7 that were declared as int > instead of unsigned long which caused compiler warnings > > Fri, 07 Dec 2007 13:44:35 +0900 > * Remove stray use of ia64_set_rr > * Relplace stray declaration of rr6 and rr7 with XEN_EFI_RR_DECLARE > > Index: xen-unstable.hg/xen/include/asm-ia64/linux/asm/sal.h > =================================================================== > --- xen-unstable.hg.orig/xen/include/asm-ia64/linux/asm/sal.h 2008-02-05 > 16:18:41.000000000 +0900 > +++ xen-unstable.hg/xen/include/asm-ia64/linux/asm/sal.h 2008-02-05 > 16:18:53.000000000 +0900 > @@ -52,9 +52,12 @@ extern spinlock_t sal_lock; > # define SAL_CALL(result,args...) do { \ > unsigned long __ia64_sc_flags; \ > struct ia64_fpreg __ia64_sc_fr[6]; \ > + XEN_EFI_RR_DECLARE(rr6, rr7); \ > ia64_save_scratch_fpregs(__ia64_sc_fr); \ > spin_lock_irqsave(&sal_lock, __ia64_sc_flags); \ > + XEN_EFI_RR_SAVE(rr6, rr7); \ > __SAL_CALL(result, args); \ > + XEN_EFI_RR_RESTORE(rr6, rr7); \ > spin_unlock_irqrestore(&sal_lock, __ia64_sc_flags); \ > ia64_load_scratch_fpregs(__ia64_sc_fr); \ > } while (0) > @@ -62,18 +65,24 @@ extern spinlock_t sal_lock; > # define SAL_CALL_NOLOCK(result,args...) do { \ > unsigned long __ia64_scn_flags; \ > struct ia64_fpreg __ia64_scn_fr[6]; \ > + XEN_EFI_RR_DECLARE(rr6, rr7); \ > ia64_save_scratch_fpregs(__ia64_scn_fr); \ > local_irq_save(__ia64_scn_flags); \ > + XEN_EFI_RR_SAVE(rr6, rr7); \ > __SAL_CALL(result, args); \ > + XEN_EFI_RR_RESTORE(rr6, rr7); \ > local_irq_restore(__ia64_scn_flags); \ > ia64_load_scratch_fpregs(__ia64_scn_fr); \ > } while (0) > > # define SAL_CALL_REENTRANT(result,args...) do { \ > struct ia64_fpreg __ia64_scs_fr[6]; \ > + XEN_EFI_RR_DECLARE(rr6, rr7); \ > ia64_save_scratch_fpregs(__ia64_scs_fr); \ > preempt_disable(); \ > + XEN_EFI_RR_SAVE(rr6, rr7); \ > __SAL_CALL(result, args); \ > + XEN_EFI_RR_RESTORE(rr6, rr7); \ > preempt_enable(); \ > ia64_load_scratch_fpregs(__ia64_scs_fr); \ > } while (0) > Index: xen-unstable.hg/xen/arch/ia64/linux-xen/efi.c > =================================================================== > --- xen-unstable.hg.orig/xen/arch/ia64/linux-xen/efi.c 2008-02-05 > 16:18:41.000000000 +0900 > +++ xen-unstable.hg/xen/arch/ia64/linux-xen/efi.c 2008-02-05 > 16:18:53.000000000 +0900 > @@ -65,11 +65,14 @@ prefix##_get_time (efi_time_t *tm, efi_t > struct ia64_fpreg fr[6]; > \ > efi_time_cap_t *atc = NULL; > \ > efi_status_t ret; > \ > + XEN_EFI_RR_DECLARE(rr6, rr7); > \ > > \ > if (tc) > \ > atc = adjust_arg(tc); > \ > ia64_save_scratch_fpregs(fr); > \ > + XEN_EFI_RR_SAVE(rr6, rr7); > \ > ret = efi_call_##prefix((efi_get_time_t *) __va(runtime->get_time), > adjust_arg(tm), atc); \ > + XEN_EFI_RR_RESTORE(rr6, rr7); > \ > ia64_load_scratch_fpregs(fr); > \ > return ret; > \ > } > @@ -80,9 +83,12 @@ prefix##_set_time (efi_time_t *tm) > > { > \ > struct ia64_fpreg fr[6]; > \ > efi_status_t ret; > \ > + XEN_EFI_RR_DECLARE(rr6, rr7); > \ > > \ > ia64_save_scratch_fpregs(fr); > \ > + XEN_EFI_RR_SAVE(rr6, rr7); > \ > ret = efi_call_##prefix((efi_set_time_t *) __va(runtime->set_time), > adjust_arg(tm)); \ > + XEN_EFI_RR_RESTORE(rr6, rr7); > \ > ia64_load_scratch_fpregs(fr); > \ > return ret; > \ > } > @@ -93,10 +99,13 @@ prefix##_get_wakeup_time (efi_bool_t *en > { > \ > struct ia64_fpreg fr[6]; > \ > efi_status_t ret; > \ > + XEN_EFI_RR_DECLARE(rr6, rr7); > \ > > \ > ia64_save_scratch_fpregs(fr); > \ > + XEN_EFI_RR_SAVE(rr6, rr7); > \ > ret = efi_call_##prefix((efi_get_wakeup_time_t *) > __va(runtime->get_wakeup_time), \ > adjust_arg(enabled), adjust_arg(pending), > adjust_arg(tm)); \ > + XEN_EFI_RR_RESTORE(rr6, rr7); > \ > ia64_load_scratch_fpregs(fr); > \ > return ret; > \ > } > @@ -108,12 +117,15 @@ prefix##_set_wakeup_time (efi_bool_t ena > struct ia64_fpreg fr[6]; > \ > efi_time_t *atm = NULL; > \ > efi_status_t ret; > \ > + XEN_EFI_RR_DECLARE(rr6, rr7); > \ > > \ > if (tm) > \ > atm = adjust_arg(tm); > \ > ia64_save_scratch_fpregs(fr); > \ > + XEN_EFI_RR_SAVE(rr6, rr7); > \ > ret = efi_call_##prefix((efi_set_wakeup_time_t *) > __va(runtime->set_wakeup_time), \ > enabled, atm); > \ > + XEN_EFI_RR_RESTORE(rr6, rr7); > \ > ia64_load_scratch_fpregs(fr); > \ > return ret; > \ > } > @@ -126,13 +138,16 @@ prefix##_get_variable (efi_char16_t *nam > struct ia64_fpreg fr[6]; > \ > u32 *aattr = NULL; > \ > efi_status_t ret; > \ > + XEN_EFI_RR_DECLARE(rr6, rr7); > \ > > \ > if (attr) > \ > aattr = adjust_arg(attr); > \ > ia64_save_scratch_fpregs(fr); > \ > + XEN_EFI_RR_SAVE(rr6, rr7); > \ > ret = efi_call_##prefix((efi_get_variable_t *) > __va(runtime->get_variable), \ > adjust_arg(name), adjust_arg(vendor), aattr, > \ > adjust_arg(data_size), adjust_arg(data)); > \ > + XEN_EFI_RR_RESTORE(rr6, rr7); > \ > ia64_load_scratch_fpregs(fr); > \ > return ret; > \ > } > @@ -143,10 +158,13 @@ prefix##_get_next_variable (unsigned lon > { > \ > struct ia64_fpreg fr[6]; > \ > efi_status_t ret; > \ > + XEN_EFI_RR_DECLARE(rr6, rr7); > \ > > \ > ia64_save_scratch_fpregs(fr); > \ > + XEN_EFI_RR_SAVE(rr6, rr7); > \ > ret = efi_call_##prefix((efi_get_next_variable_t *) > __va(runtime->get_next_variable), \ > adjust_arg(name_size), adjust_arg(name), > adjust_arg(vendor)); \ > + XEN_EFI_RR_RESTORE(rr6, rr7); > \ > ia64_load_scratch_fpregs(fr); > \ > return ret; > \ > } > @@ -158,11 +176,14 @@ prefix##_set_variable (efi_char16_t *nam > { > \ > struct ia64_fpreg fr[6]; > \ > efi_status_t ret; > \ > + XEN_EFI_RR_DECLARE(rr6, rr7); > \ > > \ > ia64_save_scratch_fpregs(fr); > \ > + XEN_EFI_RR_SAVE(rr6, rr7); > \ > ret = efi_call_##prefix((efi_set_variable_t *) > __va(runtime->set_variable), \ > adjust_arg(name), adjust_arg(vendor), attr, > data_size, \ > adjust_arg(data)); > \ > + XEN_EFI_RR_RESTORE(rr6, rr7); > \ > ia64_load_scratch_fpregs(fr); > \ > return ret; > \ > } > @@ -173,10 +194,13 @@ prefix##_get_next_high_mono_count (u32 * > { > \ > struct ia64_fpreg fr[6]; > \ > efi_status_t ret; > \ > + XEN_EFI_RR_DECLARE(rr6, rr7); > \ > > \ > ia64_save_scratch_fpregs(fr); > \ > + XEN_EFI_RR_SAVE(rr6, rr7); > \ > ret = efi_call_##prefix((efi_get_next_high_mono_count_t *) > \ > __va(runtime->get_next_high_mono_count), > adjust_arg(count)); \ > + XEN_EFI_RR_RESTORE(rr6, rr7); > \ > ia64_load_scratch_fpregs(fr); > \ > return ret; > \ > } > @@ -188,14 +212,17 @@ prefix##_reset_system (int reset_type, e > { > \ > struct ia64_fpreg fr[6]; > \ > efi_char16_t *adata = NULL; > \ > + XEN_EFI_RR_DECLARE(rr6, rr7); > \ > > \ > if (data) > \ > adata = adjust_arg(data); > \ > > \ > ia64_save_scratch_fpregs(fr); > \ > + XEN_EFI_RR_SAVE(rr6, rr7); > \ > efi_call_##prefix((efi_reset_system_t *) __va(runtime->reset_system), > \ > reset_type, status, data_size, adata); > \ > /* should not return, but just in case... */ > \ > + XEN_EFI_RR_RESTORE(rr6, rr7); > \ > ia64_load_scratch_fpregs(fr); > \ > } > > Index: xen-unstable.hg/xen/include/asm-ia64/linux-xen/asm/pal.h > =================================================================== > --- xen-unstable.hg.orig/xen/include/asm-ia64/linux-xen/asm/pal.h > 2008-02-05 16:18:41.000000000 +0900 > +++ xen-unstable.hg/xen/include/asm-ia64/linux-xen/asm/pal.h 2008-02-05 > 16:18:53.000000000 +0900 > @@ -93,6 +93,9 @@ > > #include <linux/types.h> > #include <asm/fpu.h> > +#ifdef XEN > +#include <linux/efi.h> > +#endif > > /* > * Data types needed to pass information into PAL procedures and > @@ -791,29 +794,41 @@ extern void ia64_load_scratch_fpregs (st > > #define PAL_CALL(iprv,a0,a1,a2,a3) do { \ > struct ia64_fpreg fr[6]; \ > + XEN_EFI_RR_DECLARE(rr6, rr7); \ > ia64_save_scratch_fpregs(fr); \ > + XEN_EFI_RR_SAVE(rr6, rr7); \ > iprv = ia64_pal_call_static(a0, a1, a2, a3); \ > + XEN_EFI_RR_RESTORE(rr6, rr7); \ > ia64_load_scratch_fpregs(fr); \ > } while (0) > > #define PAL_CALL_STK(iprv,a0,a1,a2,a3) do { \ > struct ia64_fpreg fr[6]; \ > + XEN_EFI_RR_DECLARE(rr6, rr7); \ > ia64_save_scratch_fpregs(fr); \ > + XEN_EFI_RR_SAVE(rr6, rr7); \ > iprv = ia64_pal_call_stacked(a0, a1, a2, a3); \ > + XEN_EFI_RR_RESTORE(rr6, rr7); \ > ia64_load_scratch_fpregs(fr); \ > } while (0) > > #define PAL_CALL_PHYS(iprv,a0,a1,a2,a3) do { \ > struct ia64_fpreg fr[6]; \ > + XEN_EFI_RR_DECLARE(rr6, rr7); \ > ia64_save_scratch_fpregs(fr); \ > + XEN_EFI_RR_SAVE(rr6, rr7); \ > iprv = ia64_pal_call_phys_static(a0, a1, a2, a3); \ > + XEN_EFI_RR_RESTORE(rr6, rr7); \ > ia64_load_scratch_fpregs(fr); \ > } while (0) > > #define PAL_CALL_PHYS_STK(iprv,a0,a1,a2,a3) do { \ > struct ia64_fpreg fr[6]; \ > + XEN_EFI_RR_DECLARE(rr6, rr7); \ > ia64_save_scratch_fpregs(fr); \ > + XEN_EFI_RR_SAVE(rr6, rr7); \ > iprv = ia64_pal_call_phys_stacked(a0, a1, a2, a3); \ > + XEN_EFI_RR_RESTORE(rr6, rr7); \ > ia64_load_scratch_fpregs(fr); \ > } while (0) > > -- yamahata _______________________________________________ Xen-ia64-devel mailing list Xen-ia64-devel@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-ia64-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |