[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-ia64-devel] [patch 01/12] ia64: kexec: Define macros for EFI RID
Please ignore the version of the patch below. It renames XEN_EFI_RID to XEN_EFI_RR which causes several problems (including inconsistency within this patch). I'll post a working version shortly. On Mon, Apr 28, 2008 at 10:10:34AM +1000, Simon Horman wrote: > Macros to be called by PAL, SAL and EFI to switch into > and out of 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> > > --- > > Thu, 22 Nov 2007 00:20:54 -0700 > * Add XEN_EFI_RR_DECLARE to help consistent declarations > * Fix up vairous compile errors in the !XEN case > * Pass unsigned long as the second argement to to ia64_rid > to ensure that it is wide enough > > Mon, 03 Dec 2007 17:29:04 +0900 > * Shift VRN 61 bits to the left when calling ia64_get_rr() and > ia64_set_rr() > > > Thu, 24 Jan 2008 12:15:55 +0900 > * Use set_one_rr_efi() instead of set_rr() so > that TR (TLB) entries are repined as neccessary. > * Do not enable VHPT in EFI RID. > - There seems to be no good reason to enable it, > and the current code dies if it is enabled. > Perhaps the VHPT TR would need to be repined? > > Mon, 21 Apr 2008 11:40:32 +1000 > * Remove ia64_srlz_d from XEN_EFI_RR_RESTORE and XEN_EFI_RR_SAVE > as serialisation is done by set_one_rr_efi() > > Fri, 25 Apr 2008 13:39:24 +1000 > * Use __IA64_UL_CONST() to simplify the declaration of XEN_EFI_RID_NO > Thanks to Yamahata-san > > Fri, 25 Apr 2008 16:50:08 +1000 > * Tidy up comment describing RID selection > Thanks to Tristan Gingold > > 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-04-25 13:55:13.000000000 +1000 > +++ xen-unstable.hg/xen/include/asm-ia64/linux-xen/linux/efi.h > 2008-04-25 15:31:48.000000000 +1000 > @@ -1,6 +1,8 @@ > #ifndef _LINUX_EFI_H > #define _LINUX_EFI_H > > +#ifndef __ASSEMBLY__ > + > /* > * Extensible Firmware Interface > * Based on 'Extensible Firmware Interface Specification' version 0.9, April > 30, 1999 > @@ -419,4 +421,93 @@ struct efi_generic_dev_path { > u16 length; > } __attribute ((packed)); > > +#ifdef XEN > +/* > + * According to xen/arch/ia64/xen/regionreg.c the RID space is broken up > + * into large-blocks. Each block belongs to a domain, except 0th block, > + * which is broken up into small-blocks. The small-blocks are used for > + * metaphysical mappings, again one per domain, except for the 0th > + * small-block which is unused other than very early on in the > + * hypervisor boot. > + * > + * By default each large-block is 18 bits wide, which is also the minimum > + * allowed width for a block. Each small-block is by default 1/64 the width > + * of a large-block, which is the maximum division allowed. In other words > + * each small-block is at least 12 bits wide. > + * > + * The portion of the 0th small-block that is used early on during > + * the hypervisor boot relates to IA64_REGION_ID_KERNEL, which is > + * used to form an RID using the following scheme which seems to be > + * have been inherited from Linux: > + * > + * a: bits 0-2: Region Number (0-7) > + * b: 3-N: IA64_REGION_ID_KERNEL (0) > + * c: N-23: reserved (0) > + * > + * N is defined by the platform. > + * > + * For EFI we use the following RID: > + * > + * a: bits 0-2: Region Number (0-7) > + * e: bits 3-N: IA64_REGION_ID_KERNEL (1) > + * f: bits N-53: reserved (0) > + * > + * + Only 0 is used as we only need one RID. Its not really important > + * what this number is, so long as its between 0 and 7. > + * > + * The nice thing about this is that we are only using 4 bits of RID > + * space, so it shouldn't have any chance of running into an adjacent > + * small-block since small-blocks are at least 12 bits wide. > + * > + * It would actually be possible to just use a IA64_REGION_ID_KERNEL > + * based RID for EFI use. The important thing is that it is in the 0th > + * small block, and thus not available to domains. But as we have > + * lots of space, its seems to be nice and clean to just use a separate > + * RID for EFI. > + * > + * This can be trivially changed by updating the definition of XEN_EFI_RID. > + * > + * For reference, the RID is used to produce the value inserted > + * in to a region register in the following way: > + * > + * A: bit 0: VHPT (0 = off, 1 = on) > + * B: bit 1: reserved (0) > + * C: bits 2-7: log 2 page_size > + * D: bits 8-N: RID > + * E: bits N-53: reserved (0) > + */ > + > +#define XEN_EFI_RR_SAVE(rr6, rr7) do { \ > + rr6 = ia64_get_rr(6UL << 61); \ > + rr7 = ia64_get_rr(7UL << 61); \ > + set_one_rr_efi(6UL << 61, XEN_EFI_RID); \ > + set_one_rr_efi(7UL << 61, XEN_EFI_RID); \ > +} while (0) > + > +#define XEN_EFI_RR_RESTORE(rr6, rr7) do { \ > + set_one_rr_efi(6UL << 61, rr6); \ > + set_one_rr_efi(7UL << 61, rr7); \ > +} while (0) > + > +#else > +/* Just use rr6 and rr7 in a dummy fashion here to get > + * rid of compiler warnings - a better solution should > + * be found if this code is ever actually used */ > +#define XEN_EFI_RR_SAVE(rr6, rr7) do { rr6 = 0; rr7 = 0; } while (0) > +#define XEN_EFI_RR_RESTORE(rr6, rr7) do {} while (0) > +#endif /* XEN */ > + > +#define XEN_EFI_RR_DECLARE(rr6, rr7) unsigned long rr6, rr7; > + > +#endif /* !__ASSEMBLY__ */ > + > +#ifdef XEN > +#include <asm/mmu_context.h> /* For IA64_REGION_ID_EFI and ia64_rid() */ > +#include <asm/pgtable.h> /* IA64_GRANULE_SHIFT */ > +#define XEN_EFI_REGION_NO __IA64_UL_CONST(0) > +#define XEN_EFI_RR ((ia64_rid(XEN_IA64_REGION_ID_EFI, > \ > + XEN_EFI_REGION_NO) << 8) | \ > + (IA64_GRANULE_SHIFT << 2)) > +#endif /* XEN */ > + > #endif /* _LINUX_EFI_H */ > Index: xen-unstable.hg/xen/include/asm-ia64/mmu_context.h > =================================================================== > --- xen-unstable.hg.orig/xen/include/asm-ia64/mmu_context.h 2008-04-25 > 13:55:13.000000000 +1000 > +++ xen-unstable.hg/xen/include/asm-ia64/mmu_context.h 2008-04-25 > 14:43:00.000000000 +1000 > @@ -3,6 +3,7 @@ > //dummy file to resolve non-arch-indep include > #ifdef XEN > #define IA64_REGION_ID_KERNEL 0 > +#define XEN_IA64_REGION_ID_EFI 1 > #define ia64_rid(ctx,addr) (((ctx) << 3) | (addr >> 61)) > > #ifndef __ASSEMBLY__ > > _______________________________________________ > Xen-ia64-devel mailing list > Xen-ia64-devel@xxxxxxxxxxxxxxxxxxx > http://lists.xensource.com/xen-ia64-devel -- Horms _______________________________________________ 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 |