[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-ia64-devel] pv_ops: move binary patching to later after CPU initialization
I guess you just followed x86 way, but delaying until check_bug() is too late for IA64 case because of at least ia64_get_cpuid(). At this moment I'm not sure how late binary patching can be delayed, though. Presumably it is necessary to revise boot protocol. Renaming xen_paravirt_patch() to xen_patch() seems reasonable, so I applied only the renaming part. thanks, On Wed, Mar 26, 2008 at 05:12:40PM +0800, Dong, Eddie wrote: > > arch/ia64/kernel/paravirt.c | 8 +++++++- > arch/ia64/kernel/paravirt_core.c | 17 ++--------------- > arch/ia64/kernel/paravirt_entry.c | 3 ++- > arch/ia64/kernel/setup.c | 3 +++ > arch/ia64/xen/paravirt_xen.c | 8 +------- > arch/ia64/xen/xen_pv_ops.c | 4 ++++ > arch/ia64/xen/xensetup.S | 10 ---------- > include/asm-ia64/paravirt.h | 1 + > 8 files changed, 20 insertions(+), 34 deletions(-) > > So far it is still NULL for both native & xen. > > Thanks, eddie > > > Defer binary patching from beginning to later after initialization > is done. > > Signed-off-by: Yaozu (Eddie) Dong <eddie.dong@xxxxxxxxx> > > diff --git a/arch/ia64/kernel/paravirt.c b/arch/ia64/kernel/paravirt.c > index 37bad82..b7340dd 100644 > --- a/arch/ia64/kernel/paravirt.c > +++ b/arch/ia64/kernel/paravirt.c > @@ -39,12 +39,18 @@ struct pv_info pv_info = { > .name = "bare hardware" > }; > > +static void native_patch(void) > +{ > +} > + > > /*********************************************************************** > **** > * pv_init_ops > * initialization hooks. > */ > > -struct pv_init_ops pv_init_ops; > +struct pv_init_ops pv_init_ops = { > + .patch = native_patch, > +}; > > > /*********************************************************************** > **** > * pv_cpu_ops > diff --git a/arch/ia64/kernel/paravirt_core.c > b/arch/ia64/kernel/paravirt_core.c > index 6b7c70f..003ce1f 100644 > --- a/arch/ia64/kernel/paravirt_core.c > +++ b/arch/ia64/kernel/paravirt_core.c > @@ -21,20 +21,7 @@ > */ > > #include <asm/paravirt_core.h> > - > -/* > - * flush_icache_range() can't be used here. > - * we are here before cpu_init() which initializes > - * ia64_i_cache_stride_shift. flush_icache_range() uses it. > - */ > -void __init_or_module > -paravirt_flush_i_cache_range(const void *instr, unsigned long size) > -{ > - unsigned long i; > - > - for (i = 0; i < size; i += sizeof(bundle_t)) > - asm volatile ("fc.i %0":: "r"(instr + i): "memory"); > -} > +#include <asm/pgtable.h> > > bundle_t* __init_or_module > paravirt_get_bundle(unsigned long tag) > @@ -162,7 +149,7 @@ paravirt_write_inst(unsigned long tag, cmp_inst_t > inst) > default: > BUG(); > } > - paravirt_flush_i_cache_range(bundle, sizeof(*bundle)); > + flush_icache_range((unsigned long)bundle, (unsigned > long)(bundle+1)); > } > > /* for debug */ > diff --git a/arch/ia64/kernel/paravirt_entry.c > b/arch/ia64/kernel/paravirt_entry.c > index 708287a..857d2a1 100644 > --- a/arch/ia64/kernel/paravirt_entry.c > +++ b/arch/ia64/kernel/paravirt_entry.c > @@ -20,6 +20,7 @@ > > #include <asm/paravirt_core.h> > #include <asm/paravirt_entry.h> > +#include <asm/pgtable.h> > > /* br.cond.sptk.many <target25> B1 */ > typedef union inst_b1 { > @@ -56,7 +57,7 @@ __paravirt_entry_apply(unsigned long tag, const void > *target) > inst.l = inst_b1.l; > > paravirt_write_inst(tag, inst); > - paravirt_flush_i_cache_range(bundle, sizeof(*bundle)); > + flush_icache_range((unsigned long)bundle, (unsigned > long)(bundle+1)); > } > > static void __init > diff --git a/arch/ia64/kernel/setup.c b/arch/ia64/kernel/setup.c > index 24561d3..6634ba7 100644 > --- a/arch/ia64/kernel/setup.c > +++ b/arch/ia64/kernel/setup.c > @@ -987,6 +987,9 @@ cpu_init (void) > void __init > check_bugs (void) > { > +#ifdef CONFIG_PARAVIRT_GUEST > + pv_init_ops.patch(); > +#endif > ia64_patch_mckinley_e9((unsigned long) > __start___mckinley_e9_bundles, > (unsigned long) > __end___mckinley_e9_bundles); > } > diff --git a/arch/ia64/xen/paravirt_xen.c b/arch/ia64/xen/paravirt_xen.c > index aa12cb5..969478e 100644 > --- a/arch/ia64/xen/paravirt_xen.c > +++ b/arch/ia64/xen/paravirt_xen.c > @@ -28,7 +28,7 @@ const static struct paravirt_entry xen_entries[] > __initdata = { > }; > > void __init > -xen_entry_patch(void) > +xen_patch(void) > { > extern const struct paravirt_entry_patch > __start_paravirt_entry[]; > extern const struct paravirt_entry_patch > __stop_paravirt_entry[]; > @@ -39,12 +39,6 @@ xen_entry_patch(void) > > sizeof(xen_entries)/sizeof(xen_entries[0])); > } > > -void __init > -xen_paravirt_patch(void) > -{ > - xen_entry_patch(); > -} > - > /* > * Local variables: > * mode: C > diff --git a/arch/ia64/xen/xen_pv_ops.c b/arch/ia64/xen/xen_pv_ops.c > index 3601b79..a2da7b2 100644 > --- a/arch/ia64/xen/xen_pv_ops.c > +++ b/arch/ia64/xen/xen_pv_ops.c > @@ -38,6 +38,9 @@ > #include "irq_xen.h" > #include "time.h" > > +/* TODO: move xen_patch to this file */ > +extern void xen_patch(void); > + > > /*********************************************************************** > **** > * general info > */ > @@ -157,6 +160,7 @@ xen_post_smp_prepare_boot_cpu(void) > > static const struct pv_init_ops xen_init_ops __initdata = { > .banner = xen_banner, > + .patch = xen_patch, > > .reserve_memory = xen_reserve_memory, > > diff --git a/arch/ia64/xen/xensetup.S b/arch/ia64/xen/xensetup.S > index cb3432b..0df93d8 100644 > --- a/arch/ia64/xen/xensetup.S > +++ b/arch/ia64/xen/xensetup.S > @@ -45,16 +45,6 @@ GLOBAL_ENTRY(early_xen_setup) > ;; > #endif > > -#ifdef CONFIG_PARAVIRT > - /* patch privops */ > -(isBP) mov r4=rp > - ;; > -(isBP) br.call.sptk.many rp=xen_paravirt_patch > - ;; > -(isBP) mov rp=r4 > - ;; > -#endif > - > br.ret.sptk.many rp > ;; > END(early_xen_setup) > diff --git a/include/asm-ia64/paravirt.h b/include/asm-ia64/paravirt.h > index 285f7ff..949ffd7 100644 > --- a/include/asm-ia64/paravirt.h > +++ b/include/asm-ia64/paravirt.h > @@ -59,6 +59,7 @@ struct rsvd_region; > > struct pv_init_ops { > void (*banner)(void); > + void (*patch)(void); > > int (*reserve_memory)(struct rsvd_region *region); > > _______________________________________________ > Xen-ia64-devel mailing list > Xen-ia64-devel@xxxxxxxxxxxxxxxxxxx > http://lists.xensource.com/xen-ia64-devel -- 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 |