# HG changeset patch # User yamahata@xxxxxxxxxxxxx # Date 1185766635 -32400 # Node ID 179c1791ce821355dc0c9593ce3d58a5188f215a # Parent 4512b3ccff7de305e21a2ee29ea5a54453f40d04 introduce ia64_set_rr0_to_rr4() and paravirtualize it to eliminate hyperprivop overhead. PATCHNAME: ia64_set_rr0_to_rr4 Signed-off-by: Isaku Yamahata diff -r 4512b3ccff7d -r 179c1791ce82 include/asm-ia64/intrinsics.h --- a/include/asm-ia64/intrinsics.h Mon Jul 30 12:32:04 2007 +0900 +++ b/include/asm-ia64/intrinsics.h Mon Jul 30 12:37:15 2007 +0900 @@ -17,6 +17,15 @@ #else # include #endif + +#define __ia64_set_rr0_to_rr4(val0, val1, val2, val3, val4) \ +do { \ + __ia64_set_rr(0x0000000000000000UL, (val0)); \ + __ia64_set_rr(0x2000000000000000UL, (val1)); \ + __ia64_set_rr(0x4000000000000000UL, (val2)); \ + __ia64_set_rr(0x6000000000000000UL, (val3)); \ + __ia64_set_rr(0x8000000000000000UL, (val4)); \ +} while (0) /* * Force an unresolved reference if someone tries to use diff -r 4512b3ccff7d -r 179c1791ce82 include/asm-ia64/mmu_context.h --- a/include/asm-ia64/mmu_context.h Mon Jul 30 12:32:04 2007 +0900 +++ b/include/asm-ia64/mmu_context.h Mon Jul 30 12:37:15 2007 +0900 @@ -151,11 +151,7 @@ reload_context (nv_mm_context_t context) # endif #endif - ia64_set_rr(0x0000000000000000UL, rr0); - ia64_set_rr(0x2000000000000000UL, rr1); - ia64_set_rr(0x4000000000000000UL, rr2); - ia64_set_rr(0x6000000000000000UL, rr3); - ia64_set_rr(0x8000000000000000UL, rr4); + ia64_set_rr0_to_rr4(rr0, rr1, rr2, rr3, rr4); ia64_srlz_i(); /* srlz.i implies srlz.d */ } diff -r 4512b3ccff7d -r 179c1791ce82 include/asm-ia64/privop.h --- a/include/asm-ia64/privop.h Mon Jul 30 12:32:04 2007 +0900 +++ b/include/asm-ia64/privop.h Mon Jul 30 12:37:15 2007 +0900 @@ -54,6 +54,7 @@ #define ia64_ret_from_clone __ia64_ret_from_clone #define ia64_switch_to __ia64_switch_to #define ia64_pal_call_static __ia64_pal_call_static +#define ia64_set_rr0_to_rr4 __ia64_set_rr0_to_rr4 #endif /* !IA64_PARAVIRTUALIZED */ diff -r 4512b3ccff7d -r 179c1791ce82 include/asm-ia64/xen/privop.h --- a/include/asm-ia64/xen/privop.h Mon Jul 30 12:32:04 2007 +0900 +++ b/include/asm-ia64/xen/privop.h Mon Jul 30 12:37:15 2007 +0900 @@ -375,6 +375,21 @@ xen_set_rr(unsigned long index, unsigned } static inline void +xen_set_rr0_to_rr4(unsigned long val0, unsigned long val1, + unsigned long val2, unsigned long val3, unsigned long val4) +{ + register __u64 __val0 asm ("r8") = val0; + register __u64 __val1 asm ("r9") = val1; + register __u64 __val2 asm ("r10") = val2; + register __u64 __val3 asm ("r11") = val3; + register __u64 __val4 asm ("r14") = val4; + asm volatile ("break %0" :: + "i"(HYPERPRIVOP_SET_RR0_TO_RR4), + "r"(__val0), "r"(__val1), + "r"(__val2), "r"(__val3), "r"(__val4)); +} + +static inline void xen_set_kr(unsigned long index, unsigned long val) { register __u64 __index asm ("r8") = index; @@ -479,6 +494,16 @@ do { \ ia64_intri_res = __ia64_get_rr((index)); \ ia64_intri_res; \ }) + +#define ia64_set_rr0_to_rr4(val0, val1, val2, val3, val4) \ +do { \ + if (is_running_on_xen()) \ + xen_set_rr0_to_rr4((val0), (val1), (val2), \ + (val3), (val4)); \ + else \ + __ia64_set_rr0_to_rr4((val0), (val1), (val2), \ + (val3), (val4)); \ +} while (0) #define ia64_getreg xen_ia64_getreg #define ia64_setreg xen_ia64_setreg diff -r 4512b3ccff7d -r 179c1791ce82 include/xen/interface/arch-ia64.h --- a/include/xen/interface/arch-ia64.h Mon Jul 30 12:32:04 2007 +0900 +++ b/include/xen/interface/arch-ia64.h Mon Jul 30 12:37:15 2007 +0900 @@ -544,7 +544,8 @@ struct xen_ia64_boot_param { #define HYPERPRIVOP_SET_EFLAG (HYPERPRIVOP_START + 0x16) #define HYPERPRIVOP_RSM_BE (HYPERPRIVOP_START + 0x17) #define HYPERPRIVOP_GET_PSR (HYPERPRIVOP_START + 0x18) -#define HYPERPRIVOP_MAX (0x19) +#define HYPERPRIVOP_SET_RR0_TO_RR4 (HYPERPRIVOP_START + 0x19) +#define HYPERPRIVOP_MAX (0x1a) /* Fast and light hypercalls. */ #define __HYPERVISOR_ia64_fast_eoi __HYPERVISOR_arch_1