aboutsummaryrefslogtreecommitdiffstats
path: root/include/asm-ia64/sal.h
diff options
context:
space:
mode:
authorBjorn Helgaas <bjorn.helgaas@hp.com>2007-09-20 16:21:11 -0400
committerTony Luck <tony.luck@intel.com>2007-10-12 18:11:22 -0400
commitedbe7075d144b35e8232ca32f373c1e0c26ff085 (patch)
tree071018351041af71e3e5dc141b5f2a336d893573 /include/asm-ia64/sal.h
parent8e75ad8908bd653191b19347ecccb4078cb17b74 (diff)
[IA64] abstract SAL_CALL wrapper to allow other firmware entry points
SAL_CALL() always calls through the ia64_sal function pointer. I am adding new functionality that needs the same conventions as SAL_CALL (FP regs saved/restored, sal_lock acquired, etc), but doesn't use the ia64_sal function pointer. This patch pulls the body of SAL_CALL out into a new "IA64_FW_CALL" that takes care of these calling conventions, but allows the caller to specify either ia64_sal or some other firmware entry point. Signed-off-by: Bjorn Helgaas <bjorn.helgaas@hp.com> Signed-off-by: Len Brown <len.brown@intel.com> Signed-off-by: Tony Luck <tony.luck@intel.com>
Diffstat (limited to 'include/asm-ia64/sal.h')
-rw-r--r--include/asm-ia64/sal.h15
1 files changed, 9 insertions, 6 deletions
diff --git a/include/asm-ia64/sal.h b/include/asm-ia64/sal.h
index 46cadf5aaac5..1f5412d6f9bb 100644
--- a/include/asm-ia64/sal.h
+++ b/include/asm-ia64/sal.h
@@ -46,25 +46,28 @@
46extern spinlock_t sal_lock; 46extern spinlock_t sal_lock;
47 47
48/* SAL spec _requires_ eight args for each call. */ 48/* SAL spec _requires_ eight args for each call. */
49#define __SAL_CALL(result,a0,a1,a2,a3,a4,a5,a6,a7) \ 49#define __IA64_FW_CALL(entry,result,a0,a1,a2,a3,a4,a5,a6,a7) \
50 result = (*ia64_sal)(a0,a1,a2,a3,a4,a5,a6,a7) 50 result = (*entry)(a0,a1,a2,a3,a4,a5,a6,a7)
51 51
52# define SAL_CALL(result,args...) do { \ 52# define IA64_FW_CALL(entry,result,args...) do { \
53 unsigned long __ia64_sc_flags; \ 53 unsigned long __ia64_sc_flags; \
54 struct ia64_fpreg __ia64_sc_fr[6]; \ 54 struct ia64_fpreg __ia64_sc_fr[6]; \
55 ia64_save_scratch_fpregs(__ia64_sc_fr); \ 55 ia64_save_scratch_fpregs(__ia64_sc_fr); \
56 spin_lock_irqsave(&sal_lock, __ia64_sc_flags); \ 56 spin_lock_irqsave(&sal_lock, __ia64_sc_flags); \
57 __SAL_CALL(result, args); \ 57 __IA64_FW_CALL(entry, result, args); \
58 spin_unlock_irqrestore(&sal_lock, __ia64_sc_flags); \ 58 spin_unlock_irqrestore(&sal_lock, __ia64_sc_flags); \
59 ia64_load_scratch_fpregs(__ia64_sc_fr); \ 59 ia64_load_scratch_fpregs(__ia64_sc_fr); \
60} while (0) 60} while (0)
61 61
62# define SAL_CALL(result,args...) \
63 IA64_FW_CALL(ia64_sal, result, args);
64
62# define SAL_CALL_NOLOCK(result,args...) do { \ 65# define SAL_CALL_NOLOCK(result,args...) do { \
63 unsigned long __ia64_scn_flags; \ 66 unsigned long __ia64_scn_flags; \
64 struct ia64_fpreg __ia64_scn_fr[6]; \ 67 struct ia64_fpreg __ia64_scn_fr[6]; \
65 ia64_save_scratch_fpregs(__ia64_scn_fr); \ 68 ia64_save_scratch_fpregs(__ia64_scn_fr); \
66 local_irq_save(__ia64_scn_flags); \ 69 local_irq_save(__ia64_scn_flags); \
67 __SAL_CALL(result, args); \ 70 __IA64_FW_CALL(ia64_sal, result, args); \
68 local_irq_restore(__ia64_scn_flags); \ 71 local_irq_restore(__ia64_scn_flags); \
69 ia64_load_scratch_fpregs(__ia64_scn_fr); \ 72 ia64_load_scratch_fpregs(__ia64_scn_fr); \
70} while (0) 73} while (0)
@@ -73,7 +76,7 @@ extern spinlock_t sal_lock;
73 struct ia64_fpreg __ia64_scs_fr[6]; \ 76 struct ia64_fpreg __ia64_scs_fr[6]; \
74 ia64_save_scratch_fpregs(__ia64_scs_fr); \ 77 ia64_save_scratch_fpregs(__ia64_scs_fr); \
75 preempt_disable(); \ 78 preempt_disable(); \
76 __SAL_CALL(result, args); \ 79 __IA64_FW_CALL(ia64_sal, result, args); \
77 preempt_enable(); \ 80 preempt_enable(); \
78 ia64_load_scratch_fpregs(__ia64_scs_fr); \ 81 ia64_load_scratch_fpregs(__ia64_scs_fr); \
79} while (0) 82} while (0)