powerpc/booke64: Use SPRG7 for VDSO
Previously SPRG3 was marked for use by both VDSO and critical
interrupts (though critical interrupts were not fully implemented).
In commit 8b64a9dfb0
("powerpc/booke64:
Use SPRG0/3 scratch for bolted TLB miss & crit int"), Mihai Caraman
made an attempt to resolve this conflict by restoring the VDSO value
early in the critical interrupt, but this has some issues:
- It's incompatible with EXCEPTION_COMMON which restores r13 from the
by-then-overwritten scratch (this cost me some debugging time).
- It forces critical exceptions to be a special case handled
differently from even machine check and debug level exceptions.
- It didn't occur to me that it was possible to make this work at all
(by doing a final "ld r13, PACA_EXCRIT+EX_R13(r13)") until after
I made (most of) this patch. :-)
It might be worth investigating using a load rather than SPRG on return
from all exceptions (except TLB misses where the scratch never leaves
the SPRG) -- it could save a few cycles. Until then, let's stick with
SPRG for all exceptions.
Since we cannot use SPRG4-7 for scratch without corrupting the state of
a KVM guest, move VDSO to SPRG7 on book3e. Since neither SPRG4-7 nor
critical interrupts exist on book3s, SPRG3 is still used for VDSO
there.
Signed-off-by: Scott Wood <scottwood@freescale.com>
Cc: Mihai Caraman <mihai.caraman@freescale.com>
Cc: Anton Blanchard <anton@samba.org>
Cc: Paul Mackerras <paulus@samba.org>
Cc: kvm-ppc@vger.kernel.org
This commit is contained in:
@@ -715,8 +715,8 @@ int vdso_getcpu_init(void)
|
||||
unsigned long cpu, node, val;
|
||||
|
||||
/*
|
||||
* SPRG3 contains the CPU in the bottom 16 bits and the NUMA node in
|
||||
* the next 16 bits. The VDSO uses this to implement getcpu().
|
||||
* SPRG_VDSO contains the CPU in the bottom 16 bits and the NUMA node
|
||||
* in the next 16 bits. The VDSO uses this to implement getcpu().
|
||||
*/
|
||||
cpu = get_cpu();
|
||||
WARN_ON_ONCE(cpu > 0xffff);
|
||||
@@ -725,8 +725,8 @@ int vdso_getcpu_init(void)
|
||||
WARN_ON_ONCE(node > 0xffff);
|
||||
|
||||
val = (cpu & 0xfff) | ((node & 0xffff) << 16);
|
||||
mtspr(SPRN_SPRG3, val);
|
||||
get_paca()->sprg3 = val;
|
||||
mtspr(SPRN_SPRG_VDSO_WRITE, val);
|
||||
get_paca()->sprg_vdso = val;
|
||||
|
||||
put_cpu();
|
||||
|
||||
|
Reference in New Issue
Block a user