mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-29 13:53:33 +00:00
parisc: Simplify fast path for non-access data TLB faults
With the latest cache fix for non-access faults and the support for non-access faults (code 17) in handle_interruption, we can remove the fast path emulation for fdc, fic, pdc, lpa, probe and probei instructions. Signed-off-by: John David Anglin <dave.anglin@bell.net> Signed-off-by: Helge Deller <deller@gmx.de>
This commit is contained in:
parent
e00b0a2ab8
commit
14615ecccb
1 changed files with 5 additions and 67 deletions
|
@ -1288,74 +1288,12 @@ nadtlb_check_alias_20:
|
||||||
nadtlb_emulate:
|
nadtlb_emulate:
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Non access misses can be caused by fdc,fic,pdc,lpa,probe and
|
* Non-access misses can be caused by fdc,fic,pdc,lpa,probe and
|
||||||
* probei instructions. We don't want to fault for these
|
* probei instructions. The kernel no longer faults doing flushes.
|
||||||
* instructions (not only does it not make sense, it can cause
|
* Use of lpa and probe instructions is rare. Given the issue
|
||||||
* deadlocks, since some flushes are done with the mmap
|
* with shadow registers, we defer everything to the "slow" path.
|
||||||
* semaphore held). If the translation doesn't exist, we can't
|
|
||||||
* insert a translation, so have to emulate the side effects
|
|
||||||
* of the instruction. Since we don't insert a translation
|
|
||||||
* we can get a lot of faults during a flush loop, so it makes
|
|
||||||
* sense to try to do it here with minimum overhead. We only
|
|
||||||
* emulate fdc,fic,pdc,probew,prober instructions whose base
|
|
||||||
* and index registers are not shadowed. We defer everything
|
|
||||||
* else to the "slow" path.
|
|
||||||
*/
|
*/
|
||||||
|
b,n nadtlb_fault
|
||||||
mfctl %cr19,%r9 /* Get iir */
|
|
||||||
|
|
||||||
/* PA 2.0 Arch Ref. Book pg 382 has a good description of the insn bits.
|
|
||||||
Checks for fdc,fdce,pdc,"fic,4f",prober,probeir,probew, probeiw */
|
|
||||||
|
|
||||||
/* Checks for fdc,fdce,pdc,"fic,4f" only */
|
|
||||||
ldi 0x280,%r16
|
|
||||||
and %r9,%r16,%r17
|
|
||||||
cmpb,<>,n %r16,%r17,nadtlb_probe_check
|
|
||||||
bb,>=,n %r9,26,nadtlb_nullify /* m bit not set, just nullify */
|
|
||||||
BL get_register,%r25
|
|
||||||
extrw,u %r9,15,5,%r8 /* Get index register # */
|
|
||||||
cmpib,COND(=),n -1,%r1,nadtlb_fault /* have to use slow path */
|
|
||||||
copy %r1,%r24
|
|
||||||
BL get_register,%r25
|
|
||||||
extrw,u %r9,10,5,%r8 /* Get base register # */
|
|
||||||
cmpib,COND(=),n -1,%r1,nadtlb_fault /* have to use slow path */
|
|
||||||
BL set_register,%r25
|
|
||||||
add,l %r1,%r24,%r1 /* doesn't affect c/b bits */
|
|
||||||
|
|
||||||
nadtlb_nullify:
|
|
||||||
mfctl %ipsw,%r8
|
|
||||||
ldil L%PSW_N,%r9
|
|
||||||
or %r8,%r9,%r8 /* Set PSW_N */
|
|
||||||
mtctl %r8,%ipsw
|
|
||||||
|
|
||||||
rfir
|
|
||||||
nop
|
|
||||||
|
|
||||||
/*
|
|
||||||
When there is no translation for the probe address then we
|
|
||||||
must nullify the insn and return zero in the target register.
|
|
||||||
This will indicate to the calling code that it does not have
|
|
||||||
write/read privileges to this address.
|
|
||||||
|
|
||||||
This should technically work for prober and probew in PA 1.1,
|
|
||||||
and also probe,r and probe,w in PA 2.0
|
|
||||||
|
|
||||||
WARNING: USE ONLY NON-SHADOW REGISTERS WITH PROBE INSN!
|
|
||||||
THE SLOW-PATH EMULATION HAS NOT BEEN WRITTEN YET.
|
|
||||||
|
|
||||||
*/
|
|
||||||
nadtlb_probe_check:
|
|
||||||
ldi 0x80,%r16
|
|
||||||
and %r9,%r16,%r17
|
|
||||||
cmpb,<>,n %r16,%r17,nadtlb_fault /* Must be probe,[rw]*/
|
|
||||||
BL get_register,%r25 /* Find the target register */
|
|
||||||
extrw,u %r9,31,5,%r8 /* Get target register */
|
|
||||||
cmpib,COND(=),n -1,%r1,nadtlb_fault /* have to use slow path */
|
|
||||||
BL set_register,%r25
|
|
||||||
copy %r0,%r1 /* Write zero to target register */
|
|
||||||
b nadtlb_nullify /* Nullify return insn */
|
|
||||||
nop
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef CONFIG_64BIT
|
#ifdef CONFIG_64BIT
|
||||||
itlb_miss_20w:
|
itlb_miss_20w:
|
||||||
|
|
Loading…
Reference in a new issue