Applied with slight fix. Thanks, On Tue, Apr 08, 2008 at 01:09:44PM +0800, Dong, Eddie wrote: > > > > Use generic getreg/setreg pv_cpu_ops instead of > specific ones that may vary per hypervisor. > > Signed-off-by: Yaozu (Eddie) Dong <[EMAIL PROTECTED]> > diff --git a/arch/ia64/kernel/paravirt.c b/arch/ia64/kernel/paravirt.c > index 8e9fb96..072a1de 100644 > --- a/arch/ia64/kernel/paravirt.c > +++ b/arch/ia64/kernel/paravirt.c > @@ -83,27 +83,6 @@ struct pv_init_ops pv_init_ops; > return ia64_native_ ## name(arg); \ > } \ > > -#define DEFINE_SET_KR(N) \ > - static void \ > - ia64_native_set_kr ## N ## _func(unsigned long val) \ > - { \ > - ia64_native_setreg(_IA64_REG_AR_KR ## N, val); \ > - } \ > - > -#define DEFINE_GETREG(name, reg) \ > - static unsigned long \ > - ia64_native_get_ ## name ## _func(void) \ > - { \ > - return ia64_native_getreg(_IA64_REG_ ## reg); \ > - } > - > -#define DEFINE_SETREG(name, reg) \ > - static void \ > - ia64_native_set_ ## name ## _func(unsigned long val) \ > - { \ > - ia64_native_setreg(_IA64_REG_ ## reg, val); \ > - } > - > DEFINE_VOID_FUNC1(fc); > DEFINE_VOID_FUNC1(intrin_local_irq_restore); > > @@ -117,25 +96,6 @@ DEFINE_FUNC1(get_cpuid, int); > DEFINE_FUNC1(get_pmd, int); > DEFINE_FUNC1(get_rr, unsigned long); > > -DEFINE_SET_KR(0) > -DEFINE_SET_KR(1) > -DEFINE_SET_KR(2) > -DEFINE_SET_KR(3) > -DEFINE_SET_KR(4) > -DEFINE_SET_KR(5) > -DEFINE_SET_KR(6) > -DEFINE_SET_KR(7) > - > -DEFINE_GETREG(eflag, AR_EFLAG) > -DEFINE_GETREG(psr, PSR) > -DEFINE_GETREG(ivr, CR_IVR) > -DEFINE_GETREG(tpr, CR_TPR) > - > -DEFINE_SETREG(eflag, AR_EFLAG) > -DEFINE_SETREG(tpr, CR_TPR) > -DEFINE_SETREG(eoi, CR_EOI) > -DEFINE_SETREG(itm, CR_ITM) > - > static void > ia64_native_ssm_i_func(void) > { > @@ -156,32 +116,165 @@ ia64_native_set_rr0_to_rr4_func(unsigned long > val0, unsigned long val1, > ia64_native_set_rr0_to_rr4(val0, val1, val2, val3, val4); > } > > +#define CASE_REG(id) case id: res = ia64_native_getreg(id); break; > +#define CASE_AR(id) CASE_REG(id) > +#define CASE_CR(id) CASE_REG(id) > + > +unsigned long native_ia64_getreg (int regnum) > +{ > + unsigned long res = -1; > + switch (regnum) { > + CASE_REG(_IA64_REG_GP); > + CASE_REG(_IA64_REG_IP); > + CASE_REG(_IA64_REG_PSR); > + CASE_REG(_IA64_REG_TP); > + CASE_REG(_IA64_REG_SP); > + > + CASE_AR(_IA64_REG_AR_KR0); > + CASE_AR(_IA64_REG_AR_KR1); > + CASE_AR(_IA64_REG_AR_KR2); > + CASE_AR(_IA64_REG_AR_KR3); > + CASE_AR(_IA64_REG_AR_KR4); > + CASE_AR(_IA64_REG_AR_KR5); > + CASE_AR(_IA64_REG_AR_KR6); > + CASE_AR(_IA64_REG_AR_KR7); > + CASE_AR(_IA64_REG_AR_RSC); > + CASE_AR(_IA64_REG_AR_BSP); > + CASE_AR(_IA64_REG_AR_BSPSTORE); > + CASE_AR(_IA64_REG_AR_RNAT); > + CASE_AR(_IA64_REG_AR_FCR); > + CASE_AR(_IA64_REG_AR_EFLAG); > + CASE_AR(_IA64_REG_AR_CSD); > + CASE_AR(_IA64_REG_AR_SSD); > + CASE_AR(_IA64_REG_AR_CFLAG); > + CASE_AR(_IA64_REG_AR_FSR); > + CASE_AR(_IA64_REG_AR_FIR); > + CASE_AR(_IA64_REG_AR_FDR); > + CASE_AR(_IA64_REG_AR_CCV); > + CASE_AR(_IA64_REG_AR_UNAT); > + CASE_AR(_IA64_REG_AR_FPSR); > + CASE_AR(_IA64_REG_AR_ITC); > + CASE_AR(_IA64_REG_AR_PFS); > + CASE_AR(_IA64_REG_AR_LC); > + CASE_AR(_IA64_REG_AR_EC); > + > + CASE_CR(_IA64_REG_CR_DCR); > + CASE_CR(_IA64_REG_CR_ITM); > + CASE_CR(_IA64_REG_CR_IVA); > + CASE_CR(_IA64_REG_CR_PTA); > + CASE_CR(_IA64_REG_CR_IPSR); > + CASE_CR(_IA64_REG_CR_ISR); > + CASE_CR(_IA64_REG_CR_IIP); > + CASE_CR(_IA64_REG_CR_IFA); > + CASE_CR(_IA64_REG_CR_ITIR); > + CASE_CR(_IA64_REG_CR_IIPA); > + CASE_CR(_IA64_REG_CR_IFS); > + CASE_CR(_IA64_REG_CR_IIM); > + CASE_CR(_IA64_REG_CR_IHA); > + CASE_CR(_IA64_REG_CR_LID); > + CASE_CR(_IA64_REG_CR_IVR); > + CASE_CR(_IA64_REG_CR_TPR); > + CASE_CR(_IA64_REG_CR_EOI); > + CASE_CR(_IA64_REG_CR_IRR0); > + CASE_CR(_IA64_REG_CR_IRR1); > + CASE_CR(_IA64_REG_CR_IRR2); > + CASE_CR(_IA64_REG_CR_IRR3); > + CASE_CR(_IA64_REG_CR_ITV); > + CASE_CR(_IA64_REG_CR_PMV); > + CASE_CR(_IA64_REG_CR_CMCV); > + CASE_CR(_IA64_REG_CR_LRR0); > + CASE_CR(_IA64_REG_CR_LRR1); > + > + default: > + printk("wrong_getreg %d\n", regnum); > + break; > + } > + return res; > +} > + > +#define CASE_SET_REG(id) case id: ia64_native_setreg(id, val); > break; > +#define CASE_SET_AR(id) CASE_SET_REG(id) > +#define CASE_SET_CR(id) CASE_SET_REG(id) > + > +void native_ia64_setreg (int regnum, unsigned long val) > +{ > + switch (regnum) { > + CASE_SET_REG(_IA64_REG_PSR_L); > + CASE_SET_REG(_IA64_REG_SP); > + CASE_SET_REG(_IA64_REG_GP) > + > + CASE_SET_AR(_IA64_REG_AR_KR0); > + CASE_SET_AR(_IA64_REG_AR_KR1); > + CASE_SET_AR(_IA64_REG_AR_KR2); > + CASE_SET_AR(_IA64_REG_AR_KR3); > + CASE_SET_AR(_IA64_REG_AR_KR4); > + CASE_SET_AR(_IA64_REG_AR_KR5); > + CASE_SET_AR(_IA64_REG_AR_KR6); > + CASE_SET_AR(_IA64_REG_AR_KR7); > + CASE_SET_AR(_IA64_REG_AR_RSC); > + CASE_SET_AR(_IA64_REG_AR_BSP); > + CASE_SET_AR(_IA64_REG_AR_BSPSTORE); > + CASE_SET_AR(_IA64_REG_AR_RNAT); > + CASE_SET_AR(_IA64_REG_AR_FCR); > + CASE_SET_AR(_IA64_REG_AR_EFLAG); > + CASE_SET_AR(_IA64_REG_AR_CSD); > + CASE_SET_AR(_IA64_REG_AR_SSD); > + CASE_SET_AR(_IA64_REG_AR_CFLAG); > + CASE_SET_AR(_IA64_REG_AR_FSR); > + CASE_SET_AR(_IA64_REG_AR_FIR); > + CASE_SET_AR(_IA64_REG_AR_FDR); > + CASE_SET_AR(_IA64_REG_AR_CCV); > + CASE_SET_AR(_IA64_REG_AR_UNAT); > + CASE_SET_AR(_IA64_REG_AR_FPSR); > + CASE_SET_AR(_IA64_REG_AR_ITC); > + CASE_SET_AR(_IA64_REG_AR_PFS); > + CASE_SET_AR(_IA64_REG_AR_LC); > + CASE_SET_AR(_IA64_REG_AR_EC); > + > + CASE_SET_CR(_IA64_REG_CR_DCR); > + CASE_SET_CR(_IA64_REG_CR_ITM); > + CASE_SET_CR(_IA64_REG_CR_IVA); > + CASE_SET_CR(_IA64_REG_CR_PTA); > + CASE_SET_CR(_IA64_REG_CR_IPSR); > + CASE_SET_CR(_IA64_REG_CR_ISR); > + CASE_SET_CR(_IA64_REG_CR_IIP); > + CASE_SET_CR(_IA64_REG_CR_IFA); > + CASE_SET_CR(_IA64_REG_CR_ITIR); > + CASE_SET_CR(_IA64_REG_CR_IIPA); > + CASE_SET_CR(_IA64_REG_CR_IFS); > + CASE_SET_CR(_IA64_REG_CR_IIM); > + CASE_SET_CR(_IA64_REG_CR_IHA); > + CASE_SET_CR(_IA64_REG_CR_LID); > + CASE_SET_CR(_IA64_REG_CR_IVR); > + CASE_SET_CR(_IA64_REG_CR_TPR); > + CASE_SET_CR(_IA64_REG_CR_EOI); > + CASE_SET_CR(_IA64_REG_CR_IRR0); > + CASE_SET_CR(_IA64_REG_CR_IRR1); > + CASE_SET_CR(_IA64_REG_CR_IRR2); > + CASE_SET_CR(_IA64_REG_CR_IRR3); > + CASE_SET_CR(_IA64_REG_CR_ITV); > + CASE_SET_CR(_IA64_REG_CR_PMV); > + CASE_SET_CR(_IA64_REG_CR_CMCV); > + CASE_SET_CR(_IA64_REG_CR_LRR0); > + CASE_SET_CR(_IA64_REG_CR_LRR1); > + default: > + printk("wrong setreg %d\n", regnum); > + break; > + } > +} > + > struct pv_cpu_ops pv_cpu_ops = { > .fc = ia64_native_fc_func, > .thash = ia64_native_thash_func, > .get_cpuid = ia64_native_get_cpuid_func, > .get_pmd = ia64_native_get_pmd_func, > - .get_eflag = ia64_native_get_eflag_func, > - .set_eflag = ia64_native_set_eflag_func, > - .get_psr = ia64_native_get_psr_func, > - .get_ivr = ia64_native_get_ivr_func, > - .get_tpr = ia64_native_get_tpr_func, > - .set_tpr = ia64_native_set_tpr_func, > - .eoi = ia64_native_set_eoi_func, > - .set_itm = ia64_native_set_itm_func, > .ptcga = ia64_native_ptcga_func, > .get_rr = ia64_native_get_rr_func, > .set_rr = ia64_native_set_rr_func, > .set_rr0_to_rr4 = ia64_native_set_rr0_to_rr4_func, > - .set_kr0 = ia64_native_set_kr0_func, > - .set_kr1 = ia64_native_set_kr1_func, > - .set_kr2 = ia64_native_set_kr2_func, > - .set_kr3 = ia64_native_set_kr3_func, > - .set_kr4 = ia64_native_set_kr4_func, > - .set_kr5 = ia64_native_set_kr5_func, > - .set_kr6 = ia64_native_set_kr6_func, > - .set_kr7 = ia64_native_set_kr7_func, > .ssm_i = ia64_native_ssm_i_func, > + .getreg = native_ia64_getreg, > + .setreg = native_ia64_setreg, > .rsm_i = ia64_native_rsm_i_func, > .get_psr_i = ia64_native_get_psr_i_func, > .intrin_local_irq_restore > diff --git a/arch/ia64/xen/xen_pv_ops.c b/arch/ia64/xen/xen_pv_ops.c > index d78932b..25c8196 100644 > --- a/arch/ia64/xen/xen_pv_ops.c > +++ b/arch/ia64/xen/xen_pv_ops.c > @@ -168,21 +168,47 @@ static const struct pv_init_ops xen_init_ops > __initdata = { > * intrinsics hooks. > */ > > -#define DEFINE_XEN_SET_KR(N) > \ > - static void > \ > - xen_set_kr##N(unsigned long val) > \ > - { > \ > - xen_set_kr(_IA64_REG_AR_KR##N - _IA64_REG_AR_KR0, val); > \ > +static void xen_setreg(int regnum, unsigned long val) > +{ > + switch (regnum) { > + case _IA64_REG_AR_KR0 ... _IA64_REG_AR_KR7: > + xen_set_kr(regnum - _IA64_REG_AR_KR0, val); > + break; > + case _IA64_REG_CR_TPR: > + xen_set_tpr(val); > + break; > + case _IA64_REG_CR_ITM: > + xen_set_itm(val); > + break; > + case _IA64_REG_CR_EOI: > + xen_eoi(val); > + break; > + default: > + native_ia64_setreg(regnum, val); > + break; > } > +} > > -DEFINE_XEN_SET_KR(0) > -DEFINE_XEN_SET_KR(1) > -DEFINE_XEN_SET_KR(2) > -DEFINE_XEN_SET_KR(3) > -DEFINE_XEN_SET_KR(4) > -DEFINE_XEN_SET_KR(5) > -DEFINE_XEN_SET_KR(6) > -DEFINE_XEN_SET_KR(7) > +static unsigned long xen_getreg(int regnum) > +{ > + unsigned long res; > + > + switch (regnum) { > + case _IA64_REG_PSR: > + res = xen_get_psr(); > + break; > + case _IA64_REG_CR_IVR: > + res = xen_get_ivr(); > + break; > + case _IA64_REG_CR_TPR: > + res = xen_get_tpr(); > + break; > + default: > + res = native_ia64_getreg(regnum); > + break; > + } > + return res; > +} > > /* turning on interrupts is a bit more complicated.. write to the > * memory-mapped virtual psr.i bit first (to avoid race condition), > @@ -227,28 +253,12 @@ static const struct pv_cpu_ops xen_cpu_ops > __initdata = { > .thash = xen_thash, > .get_cpuid = xen_get_cpuid, > .get_pmd = xen_get_pmd, > -#ifdef CONFIG_IA32_SUPPORT > - .get_eflag = xen_get_eflag, > - .set_eflag = xen_set_eflag, > -#endif > - .get_psr = xen_get_psr, > - .get_ivr = xen_get_ivr, > - .get_tpr = xen_get_tpr, > - .set_tpr = xen_set_tpr, > - .eoi = xen_eoi, > - .set_itm = xen_set_itm, > + .getreg = xen_getreg, > + .setreg = xen_setreg, > .ptcga = xen_ptcga, > .get_rr = xen_get_rr, > .set_rr = xen_set_rr, > .set_rr0_to_rr4 = xen_set_rr0_to_rr4, > - .set_kr0 = xen_set_kr0, > - .set_kr1 = xen_set_kr1, > - .set_kr2 = xen_set_kr2, > - .set_kr3 = xen_set_kr3, > - .set_kr4 = xen_set_kr4, > - .set_kr5 = xen_set_kr5, > - .set_kr6 = xen_set_kr6, > - .set_kr7 = xen_set_kr7, > .ssm_i = xen_ssm_i, > .rsm_i = xen_rsm_i, > .get_psr_i = xen_get_psr_i, > diff --git a/include/asm-ia64/paravirt_privop.h > b/include/asm-ia64/paravirt_privop.h > index a5845cf..d6d3a37 100644 > --- a/include/asm-ia64/paravirt_privop.h > +++ b/include/asm-ia64/paravirt_privop.h > @@ -39,28 +39,14 @@ struct pv_cpu_ops { > unsigned long (*thash)(unsigned long addr); > unsigned long (*get_cpuid)(int index); > unsigned long (*get_pmd)(int index); > - unsigned long (*get_eflag)(void); > - void (*set_eflag)(unsigned long val); > - unsigned long (*get_psr)(void); > - unsigned long (*get_ivr)(void); > - unsigned long (*get_tpr)(void); > - void (*set_tpr)(unsigned long val); > - void (*eoi)(unsigned long val); > - void (*set_itm)(unsigned long val); > + unsigned long (*getreg)(int reg); > + void (*setreg)(int reg, unsigned long val); > void (*ptcga)(unsigned long addr, unsigned long size); > unsigned long (*get_rr)(unsigned long index); > void (*set_rr)(unsigned long index, unsigned long val); > void (*set_rr0_to_rr4)(unsigned long val0, unsigned long val1, > unsigned long val2, unsigned long val3, > unsigned long val4); > - void (*set_kr0)(unsigned long val); > - void (*set_kr1)(unsigned long val); > - void (*set_kr2)(unsigned long val); > - void (*set_kr3)(unsigned long val); > - void (*set_kr4)(unsigned long val); > - void (*set_kr5)(unsigned long val); > - void (*set_kr6)(unsigned long val); > - void (*set_kr7)(unsigned long val); > void (*ssm_i)(void); > void (*rsm_i)(void); > unsigned long (*get_psr_i)(void); > @@ -73,89 +59,8 @@ extern struct pv_cpu_ops pv_cpu_ops; > /* Instructions paravirtualized for performance */ > /************************************************/ > > -/* index must be constant. but static inline function sometimes fails > to be > - * optimized. */ > -#define paravirt_set_kr(index, val) \ > - do { \ > - switch (index) { \ > - case _IA64_REG_AR_KR0: \ > - pv_cpu_ops.set_kr0(val); \ > - break; \ > - case _IA64_REG_AR_KR1: \ > - pv_cpu_ops.set_kr1(val); \ > - break; \ > - case _IA64_REG_AR_KR2: \ > - pv_cpu_ops.set_kr2(val); \ > - break; \ > - case _IA64_REG_AR_KR3: \ > - pv_cpu_ops.set_kr3(val); \ > - break; \ > - case _IA64_REG_AR_KR4: \ > - pv_cpu_ops.set_kr4(val); \ > - break; \ > - case _IA64_REG_AR_KR5: \ > - pv_cpu_ops.set_kr5(val); \ > - break; \ > - case _IA64_REG_AR_KR6: \ > - pv_cpu_ops.set_kr6(val); \ > - break; \ > - case _IA64_REG_AR_KR7: \ > - pv_cpu_ops.set_kr7(val); \ > - break; \ > - default: \ > - ia64_setreg_unknown_kr(); \ > - } \ > - } while (0) > - > -/* regnum for ia64_native_getreg/setreg() must be constnat. ("i" > constraint) > - * static inline function doesn't satisfy it. */ > -#define paravirt_getreg(regnum) > \ > - ({ > \ > - __u64 ia64_intri_res; > \ > - > \ > - switch (regnum) { > \ > - case _IA64_REG_PSR: > \ > - ia64_intri_res = pv_cpu_ops.get_psr(); > \ > - break; > \ > - case _IA64_REG_CR_IVR: > \ > - ia64_intri_res = pv_cpu_ops.get_ivr(); > \ > - break; > \ > - case _IA64_REG_CR_TPR: > \ > - ia64_intri_res = pv_cpu_ops.get_tpr(); > \ > - break; > \ > - case _IA64_REG_AR_EFLAG: > \ > - ia64_intri_res = pv_cpu_ops.get_eflag(); > \ > - break; > \ > - default: > \ > - ia64_intri_res = ia64_native_getreg(regnum); > \ > - break; > \ > - } > \ > - ia64_intri_res; > \ > - }) > - > -#define paravirt_setreg(regnum, val) \ > - do { \ > - switch (regnum) { \ > - case _IA64_REG_AR_KR0 ... _IA64_REG_AR_KR7: \ > - paravirt_set_kr((regnum), (val)); \ > - break; \ > - case _IA64_REG_CR_ITM: \ > - pv_cpu_ops.set_itm(val); \ > - break; \ > - case _IA64_REG_CR_TPR: \ > - pv_cpu_ops.set_tpr(val); \ > - break; \ > - case _IA64_REG_CR_EOI: \ > - pv_cpu_ops.eoi(val); \ > - break; \ > - case _IA64_REG_AR_EFLAG: \ > - pv_cpu_ops.set_eflag(val); \ > - break; \ > - default: \ > - ia64_native_setreg((regnum), (val)); \ > - break; \ > - } \ > - } while (0) > +#define paravirt_getreg(regnum) > pv_cpu_ops.getreg(regnum) > +#define paravirt_setreg(regnum, val) pv_cpu_ops.setreg(regnum, val) > > /* mask for ia64_native_ssm/rsm() must be constant.("i" constraing). > * static inline function doesn't satisfy it. */ > diff --git a/include/asm-ia64/xen/privop.h > b/include/asm-ia64/xen/privop.h > index 71ec754..7b145f0 100644 > --- a/include/asm-ia64/xen/privop.h > +++ b/include/asm-ia64/xen/privop.h > @@ -80,9 +80,6 @@ extern unsigned long xen_thash(unsigned long addr); > extern unsigned long xen_get_cpuid(int index); > extern unsigned long xen_get_pmd(int index); > > -extern unsigned long xen_get_eflag(void); /* see xen_ia64_getreg > */ > -extern void xen_set_eflag(unsigned long); /* see xen_ia64_setreg > */ > - > /************************************************/ > /* Instructions paravirtualized for performance */ > /************************************************/ > @@ -123,6 +120,8 @@ extern void xen_set_rr0_to_rr4(unsigned long val0, > unsigned long val1, > unsigned long val4); > extern void xen_set_kr(unsigned long index, unsigned long val); > extern void xen_ptcga(unsigned long addr, unsigned long size); > +extern void native_ia64_setreg(int regnum, unsigned long val); > +extern unsigned long native_ia64_getreg(int regnum); > > #endif /* !__ASSEMBLY__ */ >
> _______________________________________________ > Xen-ia64-devel mailing list > Xen-ia64-devel@lists.xensource.com > http://lists.xensource.com/xen-ia64-devel -- yamahata _______________________________________________ Xen-ia64-devel mailing list Xen-ia64-devel@lists.xensource.com http://lists.xensource.com/xen-ia64-devel