diff options
Diffstat (limited to 'arch/powerpc')
| -rw-r--r-- | arch/powerpc/include/uapi/asm/tm.h | 2 | ||||
| -rw-r--r-- | arch/powerpc/kernel/entry_64.S | 19 |
2 files changed, 20 insertions, 1 deletions
diff --git a/arch/powerpc/include/uapi/asm/tm.h b/arch/powerpc/include/uapi/asm/tm.h index 5d836b7c1176..5047659815a5 100644 --- a/arch/powerpc/include/uapi/asm/tm.h +++ b/arch/powerpc/include/uapi/asm/tm.h | |||
| @@ -11,7 +11,7 @@ | |||
| 11 | #define TM_CAUSE_RESCHED 0xde | 11 | #define TM_CAUSE_RESCHED 0xde |
| 12 | #define TM_CAUSE_TLBI 0xdc | 12 | #define TM_CAUSE_TLBI 0xdc |
| 13 | #define TM_CAUSE_FAC_UNAV 0xda | 13 | #define TM_CAUSE_FAC_UNAV 0xda |
| 14 | #define TM_CAUSE_SYSCALL 0xd8 /* future use */ | 14 | #define TM_CAUSE_SYSCALL 0xd8 |
| 15 | #define TM_CAUSE_MISC 0xd6 /* future use */ | 15 | #define TM_CAUSE_MISC 0xd6 /* future use */ |
| 16 | #define TM_CAUSE_SIGNAL 0xd4 | 16 | #define TM_CAUSE_SIGNAL 0xd4 |
| 17 | #define TM_CAUSE_ALIGNMENT 0xd2 | 17 | #define TM_CAUSE_ALIGNMENT 0xd2 |
diff --git a/arch/powerpc/kernel/entry_64.S b/arch/powerpc/kernel/entry_64.S index afbc20019c2e..8ca9434c40e6 100644 --- a/arch/powerpc/kernel/entry_64.S +++ b/arch/powerpc/kernel/entry_64.S | |||
| @@ -34,6 +34,7 @@ | |||
| 34 | #include <asm/ftrace.h> | 34 | #include <asm/ftrace.h> |
| 35 | #include <asm/hw_irq.h> | 35 | #include <asm/hw_irq.h> |
| 36 | #include <asm/context_tracking.h> | 36 | #include <asm/context_tracking.h> |
| 37 | #include <asm/tm.h> | ||
| 37 | 38 | ||
| 38 | /* | 39 | /* |
| 39 | * System calls. | 40 | * System calls. |
| @@ -145,6 +146,24 @@ END_FW_FTR_SECTION_IFSET(FW_FEATURE_SPLPAR) | |||
| 145 | andi. r11,r10,_TIF_SYSCALL_DOTRACE | 146 | andi. r11,r10,_TIF_SYSCALL_DOTRACE |
| 146 | bne syscall_dotrace | 147 | bne syscall_dotrace |
| 147 | .Lsyscall_dotrace_cont: | 148 | .Lsyscall_dotrace_cont: |
| 149 | #ifdef CONFIG_PPC_TRANSACTIONAL_MEM | ||
| 150 | BEGIN_FTR_SECTION | ||
| 151 | b 1f | ||
| 152 | END_FTR_SECTION_IFCLR(CPU_FTR_TM) | ||
| 153 | extrdi. r11, r12, 1, (63-MSR_TS_T_LG) /* transaction active? */ | ||
| 154 | beq+ 1f | ||
| 155 | |||
| 156 | /* Doom the transaction and don't perform the syscall: */ | ||
| 157 | mfmsr r11 | ||
| 158 | li r12, 1 | ||
| 159 | rldimi r11, r12, MSR_TM_LG, 63-MSR_TM_LG | ||
| 160 | mtmsrd r11, 0 | ||
| 161 | li r11, (TM_CAUSE_SYSCALL|TM_CAUSE_PERSISTENT) | ||
| 162 | TABORT(R11) | ||
| 163 | |||
| 164 | b .Lsyscall_exit | ||
| 165 | 1: | ||
| 166 | #endif | ||
| 148 | cmpldi 0,r0,NR_syscalls | 167 | cmpldi 0,r0,NR_syscalls |
| 149 | bge- syscall_enosys | 168 | bge- syscall_enosys |
| 150 | 169 | ||
