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
|