diff options
Diffstat (limited to 'arch/parisc')
-rw-r--r-- | arch/parisc/include/asm/uaccess.h | 1 | ||||
-rw-r--r-- | arch/parisc/kernel/asm-offsets.c | 1 | ||||
-rw-r--r-- | arch/parisc/lib/fixup.S | 6 | ||||
-rw-r--r-- | arch/parisc/mm/fault.c | 1 |
4 files changed, 9 insertions, 0 deletions
diff --git a/arch/parisc/include/asm/uaccess.h b/arch/parisc/include/asm/uaccess.h index d4dd6e58682c..6f893d29f1b2 100644 --- a/arch/parisc/include/asm/uaccess.h +++ b/arch/parisc/include/asm/uaccess.h | |||
@@ -77,6 +77,7 @@ struct exception_table_entry { | |||
77 | */ | 77 | */ |
78 | struct exception_data { | 78 | struct exception_data { |
79 | unsigned long fault_ip; | 79 | unsigned long fault_ip; |
80 | unsigned long fault_gp; | ||
80 | unsigned long fault_space; | 81 | unsigned long fault_space; |
81 | unsigned long fault_addr; | 82 | unsigned long fault_addr; |
82 | }; | 83 | }; |
diff --git a/arch/parisc/kernel/asm-offsets.c b/arch/parisc/kernel/asm-offsets.c index d2f62570a7b1..78d30d2ea2d8 100644 --- a/arch/parisc/kernel/asm-offsets.c +++ b/arch/parisc/kernel/asm-offsets.c | |||
@@ -299,6 +299,7 @@ int main(void) | |||
299 | #endif | 299 | #endif |
300 | BLANK(); | 300 | BLANK(); |
301 | DEFINE(EXCDATA_IP, offsetof(struct exception_data, fault_ip)); | 301 | DEFINE(EXCDATA_IP, offsetof(struct exception_data, fault_ip)); |
302 | DEFINE(EXCDATA_GP, offsetof(struct exception_data, fault_gp)); | ||
302 | DEFINE(EXCDATA_SPACE, offsetof(struct exception_data, fault_space)); | 303 | DEFINE(EXCDATA_SPACE, offsetof(struct exception_data, fault_space)); |
303 | DEFINE(EXCDATA_ADDR, offsetof(struct exception_data, fault_addr)); | 304 | DEFINE(EXCDATA_ADDR, offsetof(struct exception_data, fault_addr)); |
304 | BLANK(); | 305 | BLANK(); |
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 @@ | |||
26 | 26 | ||
27 | #ifdef CONFIG_SMP | 27 | #ifdef CONFIG_SMP |
28 | .macro get_fault_ip t1 t2 | 28 | .macro get_fault_ip t1 t2 |
29 | loadgp | ||
29 | addil LT%__per_cpu_offset,%r27 | 30 | addil LT%__per_cpu_offset,%r27 |
30 | LDREG RT%__per_cpu_offset(%r1),\t1 | 31 | LDREG RT%__per_cpu_offset(%r1),\t1 |
31 | /* t2 = smp_processor_id() */ | 32 | /* t2 = smp_processor_id() */ |
@@ -40,14 +41,19 @@ | |||
40 | LDREG RT%exception_data(%r1),\t1 | 41 | LDREG RT%exception_data(%r1),\t1 |
41 | /* t1 = this_cpu_ptr(&exception_data) */ | 42 | /* t1 = this_cpu_ptr(&exception_data) */ |
42 | add,l \t1,\t2,\t1 | 43 | add,l \t1,\t2,\t1 |
44 | /* %r27 = t1->fault_gp - restore gp */ | ||
45 | LDREG EXCDATA_GP(\t1), %r27 | ||
43 | /* t1 = t1->fault_ip */ | 46 | /* t1 = t1->fault_ip */ |
44 | LDREG EXCDATA_IP(\t1), \t1 | 47 | LDREG EXCDATA_IP(\t1), \t1 |
45 | .endm | 48 | .endm |
46 | #else | 49 | #else |
47 | .macro get_fault_ip t1 t2 | 50 | .macro get_fault_ip t1 t2 |
51 | loadgp | ||
48 | /* t1 = this_cpu_ptr(&exception_data) */ | 52 | /* t1 = this_cpu_ptr(&exception_data) */ |
49 | addil LT%exception_data,%r27 | 53 | addil LT%exception_data,%r27 |
50 | LDREG RT%exception_data(%r1),\t2 | 54 | LDREG RT%exception_data(%r1),\t2 |
55 | /* %r27 = t2->fault_gp - restore gp */ | ||
56 | LDREG EXCDATA_GP(\t2), %r27 | ||
51 | /* t1 = t2->fault_ip */ | 57 | /* t1 = t2->fault_ip */ |
52 | LDREG EXCDATA_IP(\t2), \t1 | 58 | LDREG EXCDATA_IP(\t2), \t1 |
53 | .endm | 59 | .endm |
diff --git a/arch/parisc/mm/fault.c b/arch/parisc/mm/fault.c index 26fac9c671c9..16dbe81c97c9 100644 --- a/arch/parisc/mm/fault.c +++ b/arch/parisc/mm/fault.c | |||
@@ -145,6 +145,7 @@ int fixup_exception(struct pt_regs *regs) | |||
145 | struct exception_data *d; | 145 | struct exception_data *d; |
146 | d = this_cpu_ptr(&exception_data); | 146 | d = this_cpu_ptr(&exception_data); |
147 | d->fault_ip = regs->iaoq[0]; | 147 | d->fault_ip = regs->iaoq[0]; |
148 | d->fault_gp = regs->gr[27]; | ||
148 | d->fault_space = regs->isr; | 149 | d->fault_space = regs->isr; |
149 | d->fault_addr = regs->ior; | 150 | d->fault_addr = regs->ior; |
150 | 151 | ||