Commit 896a3756 authored by Grant Grundler's avatar Grant Grundler Committed by Kyle McMartin

[PARISC] Make sure use of RFI conforms to PA 2.0 and 1.1 arch docs

2.6.12-rc4-pa3 : first pass at making sure use of RFI conforms to
PA 2.0 arch pages F-4 and F-5, PA 1.1 Arch page 3-19 and 3-20.

The discussion revolves around all the rules for clearing PSW Q-bit.
The hard part is meeting all the rules for "relied upon translation".

.align directive is used to guarantee the critical sequence ends more than
8 instructions (32 bytes) from the end of page.
Signed-off-by: default avatarGrant Grundler <grundler@parisc-linux.org>
Signed-off-by: default avatarKyle McMartin <kyle@parisc-linux.org>
parent b2c1fe81
...@@ -30,9 +30,9 @@ ...@@ -30,9 +30,9 @@
* - save registers to kernel stack and handle in assembly or C */ * - save registers to kernel stack and handle in assembly or C */
#include <asm/psw.h>
#include <asm/assembly.h> /* for LDREG/STREG defines */ #include <asm/assembly.h> /* for LDREG/STREG defines */
#include <asm/pgtable.h> #include <asm/pgtable.h>
#include <asm/psw.h>
#include <asm/signal.h> #include <asm/signal.h>
#include <asm/unistd.h> #include <asm/unistd.h>
#include <asm/thread_info.h> #include <asm/thread_info.h>
...@@ -67,19 +67,22 @@ ...@@ -67,19 +67,22 @@
/* Switch to virtual mapping, trashing only %r1 */ /* Switch to virtual mapping, trashing only %r1 */
.macro virt_map .macro virt_map
rsm PSW_SM_Q,%r0 /* pcxt_ssm_bug */
tovirt_r1 %r29 rsm PSW_SM_I, %r0 /* barrier for "Relied upon Translation */
mfsp %sr7, %r1
or,= %r0,%r1,%r0 /* Only save sr7 in sr3 if sr7 != 0 */
mtsp %r1, %sr3
mtsp %r0, %sr4 mtsp %r0, %sr4
mtsp %r0, %sr5 mtsp %r0, %sr5
mfsp %sr7, %r1
or,= %r0,%r1,%r0 /* Only save sr7 in sr3 if sr7 != 0 */
mtsp %r1, %sr3
tovirt_r1 %r29
load32 KERNEL_PSW, %r1
rsm PSW_SM_QUIET,%r0 /* second "heavy weight" ctl op */
mtsp %r0, %sr6 mtsp %r0, %sr6
mtsp %r0, %sr7 mtsp %r0, %sr7
load32 KERNEL_PSW, %r1
mtctl %r1, %cr22
mtctl %r0, %cr17 /* Clear IIASQ tail */ mtctl %r0, %cr17 /* Clear IIASQ tail */
mtctl %r0, %cr17 /* Clear IIASQ head */ mtctl %r0, %cr17 /* Clear IIASQ head */
mtctl %r1, %ipsw
load32 4f, %r1 load32 4f, %r1
mtctl %r1, %cr18 /* Set IIAOQ tail */ mtctl %r1, %cr18 /* Set IIAOQ tail */
ldo 4(%r1), %r1 ldo 4(%r1), %r1
...@@ -888,9 +891,6 @@ _switch_to_ret: ...@@ -888,9 +891,6 @@ _switch_to_ret:
* this way, then we will need to copy %sr3 in to PT_SR[3..7], and * this way, then we will need to copy %sr3 in to PT_SR[3..7], and
* adjust IASQ[0..1]. * adjust IASQ[0..1].
* *
* Note that the following code uses a "relied upon translation".
* See the parisc ACD for details. The ssm is necessary due to a
* PCXT bug.
*/ */
.align 4096 .align 4096
...@@ -985,24 +985,19 @@ intr_restore: ...@@ -985,24 +985,19 @@ intr_restore:
rest_fp %r1 rest_fp %r1
rest_general %r29 rest_general %r29
/* Create a "relied upon translation" PA 2.0 Arch. F-5 */ /* inverse of virt_map */
ssm 0,%r0 pcxt_ssm_bug
nop rsm PSW_SM_QUIET,%r0 /* prepare for rfi */
nop
nop
nop
nop
nop
nop
tophys_r1 %r29 tophys_r1 %r29
rsm (PSW_SM_Q|PSW_SM_P|PSW_SM_D|PSW_SM_I),%r0
/* Restore space id's and special cr's from PT_REGS /* Restore space id's and special cr's from PT_REGS
* structure pointed to by r29 */ * structure pointed to by r29
*/
rest_specials %r29 rest_specials %r29
/* Important: Note that rest_stack restores r29 /* IMPORTANT: rest_stack restores r29 last (we are using it)!
* last (we are using it)! It also restores r1 and r30. */ * It also restores r1 and r30.
*/
rest_stack rest_stack
rfi rfi
...@@ -1153,15 +1148,17 @@ intr_save: ...@@ -1153,15 +1148,17 @@ intr_save:
CMPIB=,n 6,%r26,skip_save_ior CMPIB=,n 6,%r26,skip_save_ior
/* save_specials left ipsw value in r8 for us to test */
mfctl %cr20, %r16 /* isr */ mfctl %cr20, %r16 /* isr */
nop /* serialize mfctl on PA 2.0 to avoid 4 cycle penalty */
mfctl %cr21, %r17 /* ior */ mfctl %cr21, %r17 /* ior */
#ifdef __LP64__ #ifdef __LP64__
/* /*
* If the interrupted code was running with W bit off (32 bit), * If the interrupted code was running with W bit off (32 bit),
* clear the b bits (bits 0 & 1) in the ior. * clear the b bits (bits 0 & 1) in the ior.
* save_specials left ipsw value in r8 for us to test.
*/ */
extrd,u,*<> %r8,PSW_W_BIT,1,%r0 extrd,u,*<> %r8,PSW_W_BIT,1,%r0
depdi 0,1,2,%r17 depdi 0,1,2,%r17
...@@ -1487,10 +1484,10 @@ nadtlb_emulate: ...@@ -1487,10 +1484,10 @@ nadtlb_emulate:
add,l %r1,%r24,%r1 /* doesn't affect c/b bits */ add,l %r1,%r24,%r1 /* doesn't affect c/b bits */
nadtlb_nullify: nadtlb_nullify:
mfctl %cr22,%r8 /* Get ipsw */ mfctl %ipsw,%r8
ldil L%PSW_N,%r9 ldil L%PSW_N,%r9
or %r8,%r9,%r8 /* Set PSW_N */ or %r8,%r9,%r8 /* Set PSW_N */
mtctl %r8,%cr22 mtctl %r8,%ipsw
rfir rfir
nop nop
......
...@@ -224,8 +224,6 @@ stext_pdc_ret: ...@@ -224,8 +224,6 @@ stext_pdc_ret:
mtctl %r0,%cr12 mtctl %r0,%cr12
mtctl %r0,%cr13 mtctl %r0,%cr13
/* Prepare to RFI! Man all the cannons! */
/* Initialize the global data pointer */ /* Initialize the global data pointer */
loadgp loadgp
...@@ -254,46 +252,16 @@ $is_pa20: ...@@ -254,46 +252,16 @@ $is_pa20:
$install_iva: $install_iva:
mtctl %r10,%cr14 mtctl %r10,%cr14
#ifdef __LP64__ b aligned_rfi /* Prepare to RFI! Man all the cannons! */
b aligned_rfi
nop nop
.align 256 .align 128
aligned_rfi: aligned_rfi:
ssm 0,0 pcxt_ssm_bug
nop /* 1 */
nop /* 2 */
nop /* 3 */
nop /* 4 */
nop /* 5 */
nop /* 6 */
nop /* 7 */
nop /* 8 */
#endif
#ifdef __LP64__ /* move to psw.h? */
#define PSW_BITS PSW_Q+PSW_I+PSW_D+PSW_P+PSW_R
#else
#define PSW_BITS PSW_SM_Q
#endif
$rfi:
/* turn off troublesome PSW bits */
rsm PSW_BITS,%r0
/* kernel PSW: rsm PSW_SM_QUIET,%r0 /* off troublesome PSW bits */
* - no interruptions except HPMC and TOC (which are handled by PDC) /* Don't need NOPs, have 8 compliant insn before rfi */
* - Q bit set (IODC / PDC interruptions)
* - big-endian
* - virtually mapped
*/
load32 KERNEL_PSW,%r10
mtctl %r10,%ipsw
/* Set the space pointers for the post-RFI world
** Clear the two-level IIA Space Queue, effectively setting
** Kernel space.
*/
mtctl %r0,%cr17 /* Clear IIASQ tail */ mtctl %r0,%cr17 /* Clear IIASQ tail */
mtctl %r0,%cr17 /* Clear IIASQ head */ mtctl %r0,%cr17 /* Clear IIASQ head */
...@@ -301,8 +269,11 @@ $rfi: ...@@ -301,8 +269,11 @@ $rfi:
mtctl %r11,%cr18 /* IIAOQ head */ mtctl %r11,%cr18 /* IIAOQ head */
ldo 4(%r11),%r11 ldo 4(%r11),%r11
mtctl %r11,%cr18 /* IIAOQ tail */ mtctl %r11,%cr18 /* IIAOQ tail */
load32 KERNEL_PSW,%r10
mtctl %r10,%ipsw
/* Jump to hyperspace */ /* Jump through hyperspace to Virt Mode */
rfi rfi
nop nop
......
...@@ -40,8 +40,8 @@ ...@@ -40,8 +40,8 @@
.level 2.0 .level 2.0
#endif #endif
#include <asm/assembly.h>
#include <asm/psw.h> #include <asm/psw.h>
#include <asm/assembly.h>
#include <asm/pgtable.h> #include <asm/pgtable.h>
#include <asm/cache.h> #include <asm/cache.h>
...@@ -62,32 +62,23 @@ flush_tlb_all_local: ...@@ -62,32 +62,23 @@ flush_tlb_all_local:
* to happen in real mode with all interruptions disabled. * to happen in real mode with all interruptions disabled.
*/ */
/* /* pcxt_ssm_bug - relied upon translation! PA 2.0 Arch. F-4 and F-5 */
* Once again, we do the rfi dance ... some day we need examine rsm PSW_SM_I, %r19 /* save I-bit state */
* all of our uses of this type of code and see what can be load32 PA(1f), %r1
* consolidated.
*/
rsm PSW_SM_I, %r19 /* relied upon translation! PA 2.0 Arch. F-5 */
nop nop
nop nop
nop nop
nop nop
nop nop
nop
nop rsm PSW_SM_Q, %r0 /* prep to load iia queue */
rsm PSW_SM_Q, %r0 /* Turn off Q bit to load iia queue */
ldil L%REAL_MODE_PSW, %r1
ldo R%REAL_MODE_PSW(%r1), %r1
mtctl %r1, %cr22
mtctl %r0, %cr17 /* Clear IIASQ tail */ mtctl %r0, %cr17 /* Clear IIASQ tail */
mtctl %r0, %cr17 /* Clear IIASQ head */ mtctl %r0, %cr17 /* Clear IIASQ head */
ldil L%PA(1f), %r1
ldo R%PA(1f)(%r1), %r1
mtctl %r1, %cr18 /* IIAOQ head */ mtctl %r1, %cr18 /* IIAOQ head */
ldo 4(%r1), %r1 ldo 4(%r1), %r1
mtctl %r1, %cr18 /* IIAOQ tail */ mtctl %r1, %cr18 /* IIAOQ tail */
load32 REAL_MODE_PSW, %r1
mtctl %r1, %ipsw
rfi rfi
nop nop
...@@ -178,29 +169,36 @@ fdtonemiddle: /* Loop if LOOP = 1 */ ...@@ -178,29 +169,36 @@ fdtonemiddle: /* Loop if LOOP = 1 */
ADDIB> -1, %r22, fdtoneloop /* Outer loop count decr */ ADDIB> -1, %r22, fdtoneloop /* Outer loop count decr */
add %r21, %r20, %r20 /* increment space */ add %r21, %r20, %r20 /* increment space */
fdtdone:
/* Switch back to virtual mode */ fdtdone:
/*
* Switch back to virtual mode
*/
/* pcxt_ssm_bug */
rsm PSW_SM_I, %r0
load32 2f, %r1
nop
nop
nop
nop
nop
rsm PSW_SM_Q, %r0 /* clear Q bit to load iia queue */ rsm PSW_SM_Q, %r0 /* prep to load iia queue */
ldil L%KERNEL_PSW, %r1
ldo R%KERNEL_PSW(%r1), %r1
or %r1, %r19, %r1 /* Set I bit if set on entry */
mtctl %r1, %cr22
mtctl %r0, %cr17 /* Clear IIASQ tail */ mtctl %r0, %cr17 /* Clear IIASQ tail */
mtctl %r0, %cr17 /* Clear IIASQ head */ mtctl %r0, %cr17 /* Clear IIASQ head */
ldil L%(2f), %r1
ldo R%(2f)(%r1), %r1
mtctl %r1, %cr18 /* IIAOQ head */ mtctl %r1, %cr18 /* IIAOQ head */
ldo 4(%r1), %r1 ldo 4(%r1), %r1
mtctl %r1, %cr18 /* IIAOQ tail */ mtctl %r1, %cr18 /* IIAOQ tail */
load32 KERNEL_PSW, %r1
or %r1, %r19, %r1 /* I-bit to state on entry */
mtctl %r1, %ipsw /* restore I-bit (entire PSW) */
rfi rfi
nop nop
2: bv %r0(%r2) 2: bv %r0(%r2)
nop nop
.exit
.exit
.procend .procend
.export flush_instruction_cache_local,code .export flush_instruction_cache_local,code
...@@ -238,7 +236,7 @@ fioneloop: /* Loop if LOOP = 1 */ ...@@ -238,7 +236,7 @@ fioneloop: /* Loop if LOOP = 1 */
fisync: fisync:
sync sync
mtsm %r22 mtsm %r22 /* restore I-bit */
bv %r0(%r2) bv %r0(%r2)
nop nop
.exit .exit
...@@ -281,7 +279,7 @@ fdoneloop: /* Loop if LOOP = 1 */ ...@@ -281,7 +279,7 @@ fdoneloop: /* Loop if LOOP = 1 */
fdsync: fdsync:
syncdma syncdma
sync sync
mtsm %r22 mtsm %r22 /* restore I-bit */
bv %r0(%r2) bv %r0(%r2)
nop nop
.exit .exit
...@@ -988,11 +986,12 @@ flush_kernel_icache_range_asm: ...@@ -988,11 +986,12 @@ flush_kernel_icache_range_asm:
bv %r0(%r2) bv %r0(%r2)
nop nop
.exit .exit
.procend .procend
.align 128 /* align should cover use of rfi in disable_sr_hashing_asm and
* srdis_done.
*/
.align 256
.export disable_sr_hashing_asm,code .export disable_sr_hashing_asm,code
disable_sr_hashing_asm: disable_sr_hashing_asm:
...@@ -1000,28 +999,26 @@ disable_sr_hashing_asm: ...@@ -1000,28 +999,26 @@ disable_sr_hashing_asm:
.callinfo NO_CALLS .callinfo NO_CALLS
.entry .entry
/* Switch to real mode */ /*
* Switch to real mode
ssm 0, %r0 /* relied upon translation! */ */
nop /* pcxt_ssm_bug */
nop rsm PSW_SM_I, %r0
load32 PA(1f), %r1
nop nop
nop nop
nop nop
nop nop
nop nop
rsm (PSW_SM_Q|PSW_SM_I), %r0 /* disable Q&I to load the iia queue */ rsm PSW_SM_Q, %r0 /* prep to load iia queue */
ldil L%REAL_MODE_PSW, %r1
ldo R%REAL_MODE_PSW(%r1), %r1
mtctl %r1, %cr22
mtctl %r0, %cr17 /* Clear IIASQ tail */ mtctl %r0, %cr17 /* Clear IIASQ tail */
mtctl %r0, %cr17 /* Clear IIASQ head */ mtctl %r0, %cr17 /* Clear IIASQ head */
ldil L%PA(1f), %r1
ldo R%PA(1f)(%r1), %r1
mtctl %r1, %cr18 /* IIAOQ head */ mtctl %r1, %cr18 /* IIAOQ head */
ldo 4(%r1), %r1 ldo 4(%r1), %r1
mtctl %r1, %cr18 /* IIAOQ tail */ mtctl %r1, %cr18 /* IIAOQ tail */
load32 REAL_MODE_PSW, %r1
mtctl %r1, %ipsw
rfi rfi
nop nop
...@@ -1053,27 +1050,31 @@ srdis_pcxl: ...@@ -1053,27 +1050,31 @@ srdis_pcxl:
srdis_pa20: srdis_pa20:
/* Disable Space Register Hashing for PCXU,PCXU+,PCXW,PCXW+ */ /* Disable Space Register Hashing for PCXU,PCXU+,PCXW,PCXW+,PCXW2 */
.word 0x144008bc /* mfdiag %dr2, %r28 */ .word 0x144008bc /* mfdiag %dr2, %r28 */
depdi 0, 54,1, %r28 /* clear DIAG_SPHASH_ENAB (bit 54) */ depdi 0, 54,1, %r28 /* clear DIAG_SPHASH_ENAB (bit 54) */
.word 0x145c1840 /* mtdiag %r28, %dr2 */ .word 0x145c1840 /* mtdiag %r28, %dr2 */
srdis_done:
srdis_done:
/* Switch back to virtual mode */ /* Switch back to virtual mode */
rsm PSW_SM_I, %r0 /* prep to load iia queue */
load32 2f, %r1
nop
nop
nop
nop
nop
rsm PSW_SM_Q, %r0 /* clear Q bit to load iia queue */ rsm PSW_SM_Q, %r0 /* prep to load iia queue */
ldil L%KERNEL_PSW, %r1
ldo R%KERNEL_PSW(%r1), %r1
mtctl %r1, %cr22
mtctl %r0, %cr17 /* Clear IIASQ tail */ mtctl %r0, %cr17 /* Clear IIASQ tail */
mtctl %r0, %cr17 /* Clear IIASQ head */ mtctl %r0, %cr17 /* Clear IIASQ head */
ldil L%(2f), %r1
ldo R%(2f)(%r1), %r1
mtctl %r1, %cr18 /* IIAOQ head */ mtctl %r1, %cr18 /* IIAOQ head */
ldo 4(%r1), %r1 ldo 4(%r1), %r1
mtctl %r1, %cr18 /* IIAOQ tail */ mtctl %r1, %cr18 /* IIAOQ tail */
load32 KERNEL_PSW, %r1
mtctl %r1, %ipsw
rfi rfi
nop nop
......
...@@ -7,8 +7,8 @@ ...@@ -7,8 +7,8 @@
* Copyright (C) 2000 Hewlett Packard (Paul Bame bame@puffin.external.hp.com) * Copyright (C) 2000 Hewlett Packard (Paul Bame bame@puffin.external.hp.com)
* *
*/ */
#include <asm/assembly.h>
#include <asm/psw.h> #include <asm/psw.h>
#include <asm/assembly.h>
.section .bss .section .bss
.export real_stack .export real_stack
...@@ -147,20 +147,17 @@ restore_control_regs: ...@@ -147,20 +147,17 @@ restore_control_regs:
.text .text
rfi_virt2real: rfi_virt2real:
/* switch to real mode... */ /* switch to real mode... */
ssm 0,0 /* See "relied upon translation" */ rsm PSW_SM_I,%r0
nop /* PA 2.0 Arch. F-5 */ load32 PA(rfi_v2r_1), %r1
nop
nop
nop nop
nop nop
nop nop
nop nop
nop nop
rsm (PSW_SM_Q|PSW_SM_I),%r0 /* disable Q & I bits to load iia queue */ rsm PSW_SM_Q,%r0 /* disable Q & I bits to load iia queue */
mtctl %r0, %cr17 /* Clear IIASQ tail */ mtctl %r0, %cr17 /* Clear IIASQ tail */
mtctl %r0, %cr17 /* Clear IIASQ head */ mtctl %r0, %cr17 /* Clear IIASQ head */
load32 PA(rfi_v2r_1), %r1
mtctl %r1, %cr18 /* IIAOQ head */ mtctl %r1, %cr18 /* IIAOQ head */
ldo 4(%r1), %r1 ldo 4(%r1), %r1
mtctl %r1, %cr18 /* IIAOQ tail */ mtctl %r1, %cr18 /* IIAOQ tail */
...@@ -184,10 +181,8 @@ rfi_v2r_1: ...@@ -184,10 +181,8 @@ rfi_v2r_1:
.text .text
.align 128 .align 128
rfi_real2virt: rfi_real2virt:
ssm 0,0 /* See "relied upon translation" */ rsm PSW_SM_I,%r0
nop /* PA 2.0 Arch. F-5 */ load32 (rfi_r2v_1), %r1
nop
nop
nop nop
nop nop
nop nop
...@@ -197,7 +192,6 @@ rfi_real2virt: ...@@ -197,7 +192,6 @@ rfi_real2virt:
rsm PSW_SM_Q,%r0 /* disable Q bit to load iia queue */ rsm PSW_SM_Q,%r0 /* disable Q bit to load iia queue */
mtctl %r0, %cr17 /* Clear IIASQ tail */ mtctl %r0, %cr17 /* Clear IIASQ tail */
mtctl %r0, %cr17 /* Clear IIASQ head */ mtctl %r0, %cr17 /* Clear IIASQ head */
load32 (rfi_r2v_1), %r1
mtctl %r1, %cr18 /* IIAOQ head */ mtctl %r1, %cr18 /* IIAOQ head */
ldo 4(%r1), %r1 ldo 4(%r1), %r1
mtctl %r1, %cr18 /* IIAOQ tail */ mtctl %r1, %cr18 /* IIAOQ tail */
......
...@@ -450,5 +450,30 @@ ...@@ -450,5 +450,30 @@
REST_CR (%cr22, PT_PSW (\regs)) REST_CR (%cr22, PT_PSW (\regs))
.endm .endm
/* First step to create a "relied upon translation"
* See PA 2.0 Arch. page F-4 and F-5.
*
* The ssm was originally necessary due to a "PCxT bug".
* But someone decided it needed to be added to the architecture
* and this "feature" went into rev3 of PA-RISC 1.1 Arch Manual.
* It's been carried forward into PA 2.0 Arch as well. :^(
*
* "ssm 0,%r0" is a NOP with side effects (prefetch barrier).
* rsm/ssm prevents the ifetch unit from speculatively fetching
* instructions past this line in the code stream.
* PA 2.0 processor will single step all insn in the same QUAD (4 insn).
*/
.macro pcxt_ssm_bug
rsm PSW_SM_I,%r0
nop /* 1 */
nop /* 2 */
nop /* 3 */
nop /* 4 */
nop /* 5 */
nop /* 6 */
nop /* 7 */
.endm
#endif /* __ASSEMBLY__ */ #endif /* __ASSEMBLY__ */
#endif #endif
#ifndef _PARISC_PSW_H #ifndef _PARISC_PSW_H
#include <linux/config.h>
#define PSW_I 0x00000001 #define PSW_I 0x00000001
#define PSW_D 0x00000002 #define PSW_D 0x00000002
#define PSW_P 0x00000004 #define PSW_P 0x00000004
...@@ -9,6 +12,16 @@ ...@@ -9,6 +12,16 @@
#define PSW_G 0x00000040 /* PA1.x only */ #define PSW_G 0x00000040 /* PA1.x only */
#define PSW_O 0x00000080 /* PA2.0 only */ #define PSW_O 0x00000080 /* PA2.0 only */
/* ssm/rsm instructions number PSW_W and PSW_E differently */
#define PSW_SM_I PSW_I /* Enable External Interrupts */
#define PSW_SM_D PSW_D
#define PSW_SM_P PSW_P
#define PSW_SM_Q PSW_Q /* Enable Interrupt State Collection */
#define PSW_SM_R PSW_R /* Enable Recover Counter Trap */
#define PSW_SM_W 0x200 /* PA2.0 only : Enable Wide Mode */
#define PSW_SM_QUIET PSW_SM_R+PSW_SM_Q+PSW_SM_P+PSW_SM_D+PSW_SM_I
#define PSW_CB 0x0000ff00 #define PSW_CB 0x0000ff00
#define PSW_M 0x00010000 #define PSW_M 0x00010000
...@@ -30,33 +43,21 @@ ...@@ -30,33 +43,21 @@
#define PSW_Z 0x40000000 /* PA1.x only */ #define PSW_Z 0x40000000 /* PA1.x only */
#define PSW_Y 0x80000000 /* PA1.x only */ #define PSW_Y 0x80000000 /* PA1.x only */
#ifdef __LP64__ #ifdef CONFIG_64BIT
#define PSW_HI_CB 0x000000ff /* PA2.0 only */ # define PSW_HI_CB 0x000000ff /* PA2.0 only */
#endif #endif
/* PSW bits to be used with ssm/rsm */ #ifdef CONFIG_64BIT
#define PSW_SM_I 0x1 # define USER_PSW_HI_MASK PSW_HI_CB
#define PSW_SM_D 0x2 # define WIDE_PSW PSW_W
#define PSW_SM_P 0x4 #else
#define PSW_SM_Q 0x8 # define WIDE_PSW 0
#define PSW_SM_R 0x10
#define PSW_SM_F 0x20
#define PSW_SM_G 0x40
#define PSW_SM_O 0x80
#define PSW_SM_E 0x100
#define PSW_SM_W 0x200
#ifdef __LP64__
# define USER_PSW (PSW_C | PSW_Q | PSW_P | PSW_D | PSW_I)
# define KERNEL_PSW (PSW_W | PSW_C | PSW_Q | PSW_P | PSW_D)
# define REAL_MODE_PSW (PSW_W | PSW_Q)
# define USER_PSW_MASK (PSW_W | PSW_T | PSW_N | PSW_X | PSW_B | PSW_V | PSW_CB)
# define USER_PSW_HI_MASK (PSW_HI_CB)
#else
# define USER_PSW (PSW_C | PSW_Q | PSW_P | PSW_D | PSW_I)
# define KERNEL_PSW (PSW_C | PSW_Q | PSW_P | PSW_D)
# define REAL_MODE_PSW (PSW_Q)
# define USER_PSW_MASK (PSW_T | PSW_N | PSW_X | PSW_B | PSW_V | PSW_CB)
#endif #endif
/* Used when setting up for rfi */
#define KERNEL_PSW (WIDE_PSW | PSW_C | PSW_Q | PSW_P | PSW_D)
#define REAL_MODE_PSW (WIDE_PSW | PSW_Q)
#define USER_PSW_MASK (WIDE_PSW | PSW_T | PSW_N | PSW_X | PSW_B | PSW_V | PSW_CB)
#define USER_PSW (PSW_C | PSW_Q | PSW_P | PSW_D | PSW_I)
#endif #endif
...@@ -64,29 +64,26 @@ static inline void flush_tlb_range(struct vm_area_struct *vma, ...@@ -64,29 +64,26 @@ static inline void flush_tlb_range(struct vm_area_struct *vma,
{ {
unsigned long npages; unsigned long npages;
npages = ((end - (start & PAGE_MASK)) + (PAGE_SIZE - 1)) >> PAGE_SHIFT; npages = ((end - (start & PAGE_MASK)) + (PAGE_SIZE - 1)) >> PAGE_SHIFT;
if (npages >= 512) /* XXX arbitrary, should be tuned */ if (npages >= 512) /* 2MB of space: arbitrary, should be tuned */
flush_tlb_all(); flush_tlb_all();
else { else {
mtsp(vma->vm_mm->context,1); mtsp(vma->vm_mm->context,1);
purge_tlb_start();
if (split_tlb) { if (split_tlb) {
purge_tlb_start();
while (npages--) { while (npages--) {
pdtlb(start); pdtlb(start);
pitlb(start); pitlb(start);
start += PAGE_SIZE; start += PAGE_SIZE;
} }
purge_tlb_end();
} else { } else {
purge_tlb_start();
while (npages--) { while (npages--) {
pdtlb(start); pdtlb(start);
start += PAGE_SIZE; start += PAGE_SIZE;
} }
purge_tlb_end();
} }
purge_tlb_end();
} }
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment