diff options
-rw-r--r-- | arch/powerpc/kernel/entry_64.S | 8 |
1 files changed, 7 insertions, 1 deletions
diff --git a/arch/powerpc/kernel/entry_64.S b/arch/powerpc/kernel/entry_64.S index e6d52845854f..e0bcf9354286 100644 --- a/arch/powerpc/kernel/entry_64.S +++ b/arch/powerpc/kernel/entry_64.S | |||
@@ -57,12 +57,18 @@ system_call_common: | |||
57 | beq- 1f | 57 | beq- 1f |
58 | ld r1,PACAKSAVE(r13) | 58 | ld r1,PACAKSAVE(r13) |
59 | 1: std r10,0(r1) | 59 | 1: std r10,0(r1) |
60 | crclr so | ||
61 | std r11,_NIP(r1) | 60 | std r11,_NIP(r1) |
62 | std r12,_MSR(r1) | 61 | std r12,_MSR(r1) |
63 | std r0,GPR0(r1) | 62 | std r0,GPR0(r1) |
64 | std r10,GPR1(r1) | 63 | std r10,GPR1(r1) |
65 | ACCOUNT_CPU_USER_ENTRY(r10, r11) | 64 | ACCOUNT_CPU_USER_ENTRY(r10, r11) |
65 | /* | ||
66 | * This "crclr so" clears CR0.SO, which is the error indication on | ||
67 | * return from this system call. There must be no cmp instruction | ||
68 | * between it and the "mfcr r9" below, otherwise if XER.SO is set, | ||
69 | * CR0.SO will get set, causing all system calls to appear to fail. | ||
70 | */ | ||
71 | crclr so | ||
66 | std r2,GPR2(r1) | 72 | std r2,GPR2(r1) |
67 | std r3,GPR3(r1) | 73 | std r3,GPR3(r1) |
68 | std r4,GPR4(r1) | 74 | std r4,GPR4(r1) |