diff options
author | Helge Deller <deller@gmx.de> | 2016-04-08 18:32:52 +0200 |
---|---|---|
committer | Sasha Levin <sasha.levin@oracle.com> | 2016-04-20 01:08:54 -0400 |
commit | e213cce42b7107f64521eb1434e9dd5637ad777b (patch) | |
tree | 5fb187bd8755f013c8a77ce795e333aae9240336 /arch/parisc/lib/fixup.S | |
parent | 9ccccafe228ec2a71a6df4268ce95c27e3d3c8cf (diff) |
parisc: Unbreak handling exceptions from kernel modules
[ Upstream commit 2ef4dfd9d9f288943e249b78365a69e3ea3ec072 ]
Handling exceptions from modules never worked on parisc.
It was just masked by the fact that exceptions from modules
don't happen during normal use.
When a module triggers an exception in get_user() we need to load the
main kernel dp value before accessing the exception_data structure, and
afterwards restore the original dp value of the module on exit.
Noticed-by: Mikulas Patocka <mpatocka@redhat.com>
Signed-off-by: Helge Deller <deller@gmx.de>
Cc: stable@vger.kernel.org
Signed-off-by: Sasha Levin <sasha.levin@oracle.com>
Diffstat (limited to 'arch/parisc/lib/fixup.S')
-rw-r--r-- | arch/parisc/lib/fixup.S | 6 |
1 files changed, 6 insertions, 0 deletions
diff --git a/arch/parisc/lib/fixup.S b/arch/parisc/lib/fixup.S index 536ef66bb94b..1052b747e011 100644 --- a/arch/parisc/lib/fixup.S +++ b/arch/parisc/lib/fixup.S @@ -26,6 +26,7 @@ #ifdef CONFIG_SMP .macro get_fault_ip t1 t2 + loadgp addil LT%__per_cpu_offset,%r27 LDREG RT%__per_cpu_offset(%r1),\t1 /* t2 = smp_processor_id() */ @@ -40,14 +41,19 @@ LDREG RT%exception_data(%r1),\t1 /* t1 = this_cpu_ptr(&exception_data) */ add,l \t1,\t2,\t1 + /* %r27 = t1->fault_gp - restore gp */ + LDREG EXCDATA_GP(\t1), %r27 /* t1 = t1->fault_ip */ LDREG EXCDATA_IP(\t1), \t1 .endm #else .macro get_fault_ip t1 t2 + loadgp /* t1 = this_cpu_ptr(&exception_data) */ addil LT%exception_data,%r27 LDREG RT%exception_data(%r1),\t2 + /* %r27 = t2->fault_gp - restore gp */ + LDREG EXCDATA_GP(\t2), %r27 /* t1 = t2->fault_ip */ LDREG EXCDATA_IP(\t2), \t1 .endm |