WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-ia64-devel

[Xen-ia64-devel] pv_ops: hypercall.S cleanup

To: <xen-ia64-devel@xxxxxxxxxxxxxxxxxxx>
Subject: [Xen-ia64-devel] pv_ops: hypercall.S cleanup
From: "Dong, Eddie" <eddie.dong@xxxxxxxxx>
Date: Thu, 27 Mar 2008 13:18:09 +0800
Delivery-date: Wed, 26 Mar 2008 22:18:51 -0700
Envelope-to: www-data@xxxxxxxxxxxxxxxxxx
List-help: <mailto:xen-ia64-devel-request@lists.xensource.com?subject=help>
List-id: Discussion of the ia64 port of Xen <xen-ia64-devel.lists.xensource.com>
List-post: <mailto:xen-ia64-devel@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-ia64-devel>, <mailto:xen-ia64-devel-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-ia64-devel>, <mailto:xen-ia64-devel-request@lists.xensource.com?subject=unsubscribe>
Sender: xen-ia64-devel-bounces@xxxxxxxxxxxxxxxxxxx
Thread-index: AciPyfJT1NcLfSjfSyuVAkEhsVRmgg==
Thread-topic: pv_ops: hypercall.S cleanup
Most hypercall are identical in source code, using a common
MACRO to define 0/1/2 parameter(s) hypercall is much simple.

 arch/ia64/xen/hypercall.S     |  154
+++++++++++++-----------------------------
 include/asm-ia64/xen/privop.h |   26 -------
 2 files changed, 51 insertions(+), 129 deletions(-)

Signed-off-by: Yaozu (Eddie) Dong <eddie.dong@xxxxxxxxx>

diff --git a/arch/ia64/xen/hypercall.S b/arch/ia64/xen/hypercall.S
index 615dad9..ce7b015 100644
--- a/arch/ia64/xen/hypercall.S
+++ b/arch/ia64/xen/hypercall.S
@@ -2,79 +2,64 @@
  * Support routines for Xen hypercalls
  *
  * Copyright (C) 2005 Dan Magenheimer <dan.magenheimer@xxxxxx>
+ * Copyright (C) 2008 Yaozu (Eddie) Dong <eddie.dong@xxxxxxxxx>
  */
 
 #include <asm/asmmacro.h>
 #include <asm/intrinsics.h>
 
-GLOBAL_ENTRY(xen_get_psr)
-       XEN_HYPER_GET_PSR
-       br.ret.sptk.many rp
-       ;;
-END(xen_get_psr)
-
-GLOBAL_ENTRY(xen_get_ivr)
-       XEN_HYPER_GET_IVR
-       br.ret.sptk.many rp
-       ;;
-END(xen_get_ivr)
-
-GLOBAL_ENTRY(xen_get_tpr)
-       XEN_HYPER_GET_TPR
-       br.ret.sptk.many rp
-       ;;
-END(xen_get_tpr)
-
-GLOBAL_ENTRY(xen_set_tpr)
-       mov r8=r32
-       XEN_HYPER_SET_TPR
-       br.ret.sptk.many rp
-       ;;
-END(xen_set_tpr)
-
-GLOBAL_ENTRY(xen_eoi)
-       mov r8=r32
-       XEN_HYPER_EOI
-       br.ret.sptk.many rp
-       ;;
-END(xen_eoi)
-
-GLOBAL_ENTRY(xen_thash)
-       mov r8=r32
-       XEN_HYPER_THASH
-       br.ret.sptk.many rp
-       ;;
-END(xen_thash)
-
-GLOBAL_ENTRY(xen_set_itm)
-       mov r8=r32
-       XEN_HYPER_SET_ITM
-       br.ret.sptk.many rp
-       ;;
-END(xen_set_itm)
+/*
+ * Hypercalls without parameter.
+ */
+#define __HCALL0(name,hcall)           \
+       GLOBAL_ENTRY(name);             \
+       break   hcall;                  \
+       br.ret.sptk.many rp;            \
+       END(name)
 
-GLOBAL_ENTRY(xen_ptcga)
-       mov r8=r32
-       mov r9=r33
-       XEN_HYPER_PTC_GA
-       br.ret.sptk.many rp
-       ;;
-END(xen_ptcga)
+/*
+ * Hypercalls with 1 parameter.
+ */
+#define __HCALL1(name,hcall)           \
+       GLOBAL_ENTRY(name);             \
+       mov r8=r32;                     \
+       break   hcall;                  \
+       br.ret.sptk.many rp;            \
+       END(name)
 
-GLOBAL_ENTRY(xen_get_rr)
-       mov r8=r32
-       XEN_HYPER_GET_RR
-       br.ret.sptk.many rp
-       ;;
-END(xen_get_rr)
+/*
+ * Hypercalls with 2 parameters.
+ */
+#define __HCALL2(name,hcall)           \
+       GLOBAL_ENTRY(name);             \
+       mov r8=r32;                     \
+       mov r9=r33;                     \
+       break   hcall;                  \
+       br.ret.sptk.many rp;            \
+       END(name)
+
+__HCALL0(xen_get_psr, HYPERPRIVOP_GET_PSR)
+__HCALL0(xen_get_ivr, HYPERPRIVOP_GET_IVR)
+__HCALL0(xen_get_tpr, HYPERPRIVOP_GET_TPR)
+__HCALL0(xen_hyper_ssm_i, HYPERPRIVOP_SSM_I)
+
+__HCALL1(xen_set_tpr, HYPERPRIVOP_SET_TPR)
+__HCALL1(xen_eoi, HYPERPRIVOP_EOI)
+__HCALL1(xen_thash, HYPERPRIVOP_THASH)
+__HCALL1(xen_set_itm, HYPERPRIVOP_SET_ITM)
+__HCALL1(xen_get_rr, HYPERPRIVOP_GET_RR)
+__HCALL1(xen_fc, HYPERPRIVOP_FC)
+__HCALL1(xen_get_cpuid, HYPERPRIVOP_GET_CPUID)
+__HCALL1(xen_get_pmd, HYPERPRIVOP_GET_PMD)
+
+__HCALL2(xen_ptcga, HYPERPRIVOP_PTC_GA)
+__HCALL2(xen_set_rr, HYPERPRIVOP_SET_RR)
+__HCALL2(xen_set_kr, HYPERPRIVOP_SET_KR)
 
-GLOBAL_ENTRY(xen_set_rr)
-       mov r8=r32
-       mov r9=r33
-       XEN_HYPER_SET_RR
-       br.ret.sptk.many rp
-       ;;
-END(xen_set_rr)
+#ifdef CONFIG_IA32_SUPPORT
+__HCALL1(xen_get_eflag, HYPERPRIVOP_GET_EFLAG)
+__HCALL1(xen_set_eflag, HYPERPRIVOP_SET_EFLAG) // refer SDM vol1 3.1.8
+#endif /* CONFIG_IA32_SUPPORT */
 
 GLOBAL_ENTRY(xen_set_rr0_to_rr4)
        mov r8=r32
@@ -87,45 +72,6 @@ GLOBAL_ENTRY(xen_set_rr0_to_rr4)
        ;;
 END(xen_set_rr0_to_rr4)
 
-GLOBAL_ENTRY(xen_set_kr)
-       mov r8=r32
-       mov r9=r33
-       XEN_HYPER_SET_KR
-       br.ret.sptk.many rp
-END(xen_set_kr)
-
-GLOBAL_ENTRY(xen_fc)
-       mov r8=r32
-       XEN_HYPER_FC
-       br.ret.sptk.many rp
-END(xen_fc)
-
-GLOBAL_ENTRY(xen_get_cpuid)
-       mov r8=r32
-       XEN_HYPER_GET_CPUID
-       br.ret.sptk.many rp
-END(xen_get_cpuid)
-
-GLOBAL_ENTRY(xen_get_pmd)
-       mov r8=r32
-       XEN_HYPER_GET_PMD
-       br.ret.sptk.many rp
-END(xen_get_pmd)
-
-#ifdef CONFIG_IA32_SUPPORT
-GLOBAL_ENTRY(xen_get_eflag)
-       XEN_HYPER_GET_EFLAG
-       br.ret.sptk.many rp
-END(xen_get_eflag)
-
-// some bits aren't set if pl!=0, see SDM vol1 3.1.8
-GLOBAL_ENTRY(xen_set_eflag)
-       mov r8=r32
-       XEN_HYPER_SET_EFLAG
-       br.ret.sptk.many rp
-END(xen_set_eflag)
-#endif /* CONFIG_IA32_SUPPORT */
-
 GLOBAL_ENTRY(xen_send_ipi)
        mov r14=r32
        mov r15=r33
diff --git a/include/asm-ia64/xen/privop.h
b/include/asm-ia64/xen/privop.h
index 7657d37..e69380a 100644
--- a/include/asm-ia64/xen/privop.h
+++ b/include/asm-ia64/xen/privop.h
@@ -35,22 +35,8 @@
 #define XEN_HYPER_ITC_I                        break HYPERPRIVOP_ITC_I
 #define XEN_HYPER_SSM_I                        break HYPERPRIVOP_SSM_I
 #define XEN_HYPER_GET_IVR              break HYPERPRIVOP_GET_IVR
-#define XEN_HYPER_GET_TPR              break HYPERPRIVOP_GET_TPR
-#define XEN_HYPER_SET_TPR              break HYPERPRIVOP_SET_TPR
-#define XEN_HYPER_EOI                  break HYPERPRIVOP_EOI
-#define XEN_HYPER_SET_ITM              break HYPERPRIVOP_SET_ITM
 #define XEN_HYPER_THASH                        break HYPERPRIVOP_THASH
-#define XEN_HYPER_PTC_GA               break HYPERPRIVOP_PTC_GA
 #define XEN_HYPER_ITR_D                        break HYPERPRIVOP_ITR_D
-#define XEN_HYPER_GET_RR               break HYPERPRIVOP_GET_RR
-#define XEN_HYPER_SET_RR               break HYPERPRIVOP_SET_RR
-#define XEN_HYPER_SET_KR               break HYPERPRIVOP_SET_KR
-#define XEN_HYPER_FC                   break HYPERPRIVOP_FC
-#define XEN_HYPER_GET_CPUID            break HYPERPRIVOP_GET_CPUID
-#define XEN_HYPER_GET_PMD              break HYPERPRIVOP_GET_PMD
-#define XEN_HYPER_GET_EFLAG            break HYPERPRIVOP_GET_EFLAG
-#define XEN_HYPER_SET_EFLAG            break HYPERPRIVOP_SET_EFLAG
-#define XEN_HYPER_GET_PSR              break HYPERPRIVOP_GET_PSR
 #define XEN_HYPER_SET_RR0_TO_RR4       break HYPERPRIVOP_SET_RR0_TO_RR4
 
 #define XSI_IFS                                (XSI_BASE + XSI_IFS_OFS)
@@ -70,7 +56,6 @@
 #endif
 
 #ifndef __ASSEMBLY__
-#define        XEN_HYPER_SSM_I         asm("break %0" : : "i"
(HYPERPRIVOP_SSM_I))
 #define        XEN_HYPER_GET_IVR       asm("break %0" : : "i"
(HYPERPRIVOP_GET_IVR))
 
 /************************************************/
@@ -120,22 +105,13 @@ extern void xen_set_eflag(unsigned long); /* see
xen_ia64_setreg */
 #define xen_get_virtual_pend()         \
        (*(((uint8_t *)XEN_MAPPEDREGS->interrupt_mask_addr) - 1))
 
-/* Hyperprivops are "break" instructions with a well-defined API.
- * In particular, the virtual psr.ic bit must be off; in this way
- * it is guaranteed to never conflict with a linux break instruction.
- * Normally, this is done in a xen stub but this one is frequent enough
- * that we inline it */
-#define xen_hyper_ssm_i()
\
-({
\
-       XEN_HYPER_SSM_I;
\
-})
-
 /* Although all privileged operations can be left to trap and will
  * be properly handled by Xen, some are frequent enough that we use
  * hyperprivops for performance. */
 extern unsigned long xen_get_psr(void);
 extern unsigned long xen_get_ivr(void);
 extern unsigned long xen_get_tpr(void);
+extern void xen_hyper_ssm_i(void);
 extern void xen_set_itm(unsigned long);
 extern void xen_set_tpr(unsigned long);
 extern void xen_eoi(unsigned long);

Attachment: hypcall.patch
Description: hypcall.patch

_______________________________________________
Xen-ia64-devel mailing list
Xen-ia64-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-ia64-devel
<Prev in Thread] Current Thread [Next in Thread>
  • [Xen-ia64-devel] pv_ops: hypercall.S cleanup, Dong, Eddie <=