Commit edbe7075 authored by Bjorn Helgaas's avatar Bjorn Helgaas Committed by Tony Luck

[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: default avatarBjorn Helgaas <bjorn.helgaas@hp.com>
Signed-off-by: default avatarLen Brown <len.brown@intel.com>
Signed-off-by: default avatarTony Luck <tony.luck@intel.com>
parent 8e75ad89
...@@ -46,25 +46,28 @@ ...@@ -46,25 +46,28 @@
extern spinlock_t sal_lock; extern spinlock_t sal_lock;
/* SAL spec _requires_ eight args for each call. */ /* SAL spec _requires_ eight args for each call. */
#define __SAL_CALL(result,a0,a1,a2,a3,a4,a5,a6,a7) \ #define __IA64_FW_CALL(entry,result,a0,a1,a2,a3,a4,a5,a6,a7) \
result = (*ia64_sal)(a0,a1,a2,a3,a4,a5,a6,a7) result = (*entry)(a0,a1,a2,a3,a4,a5,a6,a7)
# define SAL_CALL(result,args...) do { \ # define IA64_FW_CALL(entry,result,args...) do { \
unsigned long __ia64_sc_flags; \ unsigned long __ia64_sc_flags; \
struct ia64_fpreg __ia64_sc_fr[6]; \ struct ia64_fpreg __ia64_sc_fr[6]; \
ia64_save_scratch_fpregs(__ia64_sc_fr); \ ia64_save_scratch_fpregs(__ia64_sc_fr); \
spin_lock_irqsave(&sal_lock, __ia64_sc_flags); \ spin_lock_irqsave(&sal_lock, __ia64_sc_flags); \
__SAL_CALL(result, args); \ __IA64_FW_CALL(entry, result, args); \
spin_unlock_irqrestore(&sal_lock, __ia64_sc_flags); \ spin_unlock_irqrestore(&sal_lock, __ia64_sc_flags); \
ia64_load_scratch_fpregs(__ia64_sc_fr); \ ia64_load_scratch_fpregs(__ia64_sc_fr); \
} while (0) } while (0)
# define SAL_CALL(result,args...) \
IA64_FW_CALL(ia64_sal, result, args);
# define SAL_CALL_NOLOCK(result,args...) do { \ # define SAL_CALL_NOLOCK(result,args...) do { \
unsigned long __ia64_scn_flags; \ unsigned long __ia64_scn_flags; \
struct ia64_fpreg __ia64_scn_fr[6]; \ struct ia64_fpreg __ia64_scn_fr[6]; \
ia64_save_scratch_fpregs(__ia64_scn_fr); \ ia64_save_scratch_fpregs(__ia64_scn_fr); \
local_irq_save(__ia64_scn_flags); \ local_irq_save(__ia64_scn_flags); \
__SAL_CALL(result, args); \ __IA64_FW_CALL(ia64_sal, result, args); \
local_irq_restore(__ia64_scn_flags); \ local_irq_restore(__ia64_scn_flags); \
ia64_load_scratch_fpregs(__ia64_scn_fr); \ ia64_load_scratch_fpregs(__ia64_scn_fr); \
} while (0) } while (0)
...@@ -73,7 +76,7 @@ extern spinlock_t sal_lock; ...@@ -73,7 +76,7 @@ extern spinlock_t sal_lock;
struct ia64_fpreg __ia64_scs_fr[6]; \ struct ia64_fpreg __ia64_scs_fr[6]; \
ia64_save_scratch_fpregs(__ia64_scs_fr); \ ia64_save_scratch_fpregs(__ia64_scs_fr); \
preempt_disable(); \ preempt_disable(); \
__SAL_CALL(result, args); \ __IA64_FW_CALL(ia64_sal, result, args); \
preempt_enable(); \ preempt_enable(); \
ia64_load_scratch_fpregs(__ia64_scs_fr); \ ia64_load_scratch_fpregs(__ia64_scs_fr); \
} while (0) } while (0)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment