diff options
| -rw-r--r-- | include/asm-ia64/sal.h | 15 |
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 @@ | |||
| 46 | extern spinlock_t sal_lock; | 46 | extern 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) |
