# HG changeset patch # User yamahata@xxxxxxxxxxxxx # Date 1183613063 -32400 # Node ID 8fc1e4759e8710d671728e4a9c55e1bba162ba3e # Parent e215072b79e6d1f969aa4c641c5ac69470d65f6e some of definitions of xen hyperprivops aren't transparent. This patch fixes them. While this is done in assembler code long before, But I chose the easy C version because binary patching woule eliminate the overhead. PATCHNAME: transparent_hyperprivops Signed-off-by: Isaku Yamahata diff -r e215072b79e6 -r 8fc1e4759e87 include/asm-ia64/xen/privop.h --- a/include/asm-ia64/xen/privop.h Wed Jun 20 15:06:13 2007 +0900 +++ b/include/asm-ia64/xen/privop.h Thu Jul 05 14:24:23 2007 +0900 @@ -101,8 +101,24 @@ extern unsigned long xen_thash(unsigned extern unsigned long xen_thash(unsigned long addr); #endif -#define ia64_fc(addr) xen_fc((unsigned long)(addr)) -#define ia64_thash(addr) xen_thash((unsigned long)(addr)) +#define ia64_fc(addr) \ +do { \ + if (is_running_on_xen()) \ + xen_fc((unsigned long)(addr)); \ + else \ + __ia64_fc(addr); \ +} while (0) + +#define ia64_thash(addr) \ +({ \ + unsigned long ia64_intri_res; \ + if (is_running_on_xen()) \ + ia64_intri_res = \ + xen_thash((unsigned long)(addr)); \ + else \ + ia64_intri_res = __ia64_thash(addr); \ + ia64_intri_res; \ +}) /* Note that "ttag" and "cover" are also privilege-sensitive; "ttag" * is not currently used (though it may be in a long-format VHPT system!) @@ -138,9 +154,25 @@ extern unsigned long xen_get_pmd(int ind extern unsigned long xen_get_pmd(int index); #endif -#define ia64_get_cpuid(i) xen_get_cpuid(i) -#define ia64_get_pmd(i) xen_get_pmd(i) - +#define ia64_get_cpuid(i) \ +({ \ + unsigned long ia64_intri_res; \ + if (is_running_on_xen()) \ + ia64_intri_res = xen_get_cpuid(i); \ + else \ + ia64_intri_res = __ia64_get_cpuid(i); \ + ia64_intri_res; \ +}) + +#define ia64_get_pmd(i) \ +({ \ + unsigned long ia64_intri_res; \ + if (is_running_on_xen()) \ + ia64_intri_res = xen_get_pmd(i); \ + else \ + ia64_intri_res = __ia64_get_pmd(i); \ + ia64_intri_res; \ +}) #ifdef ASM_SUPPORTED static inline unsigned long @@ -424,14 +456,37 @@ xen_set_kr(unsigned long index, unsigned } \ }) +#define ia64_ptcga(addr, size) \ +do { \ + if (is_running_on_xen()) \ + xen_ptcga((addr), (size)); \ + else \ + __ia64_ptcga((addr), (size)); \ +} while (0) + +#define ia64_set_rr(index, val) \ +do { \ + if (is_running_on_xen()) \ + xen_set_rr((index), (val)); \ + else \ + __ia64_set_rr((index), (val)); \ +} while (0) + +#define ia64_get_rr(index) \ +({ \ + __u64 ia64_intri_res; \ + if (is_running_on_xen()) \ + ia64_intri_res = xen_get_rr((index)); \ + else \ + ia64_intri_res = __ia64_get_rr((index)); \ + ia64_intri_res; \ +}) + +#define ia64_getreg xen_ia64_getreg +#define ia64_setreg xen_ia64_setreg #define ia64_ssm xen_ia64_ssm #define ia64_rsm xen_ia64_rsm #define ia64_intrin_local_irq_restore xen_ia64_intrin_local_irq_restore -#define ia64_ptcga xen_ptcga -#define ia64_set_rr(index,val) xen_set_rr(index,val) -#define ia64_get_rr(index) xen_get_rr(index) -#define ia64_getreg xen_ia64_getreg -#define ia64_setreg xen_ia64_setreg #define ia64_get_psr_i xen_get_psr_i /* the remainder of these are not performance-sensitive so its