Commit 4ccccc52 authored by Heiko Carstens's avatar Heiko Carstens Committed by Martin Schwidefsky

s390/pgtable: introduce and use generic csp inline asm

We have already two inline assemblies which make use of the csp
instruction. Since I need a third instance let's introduce a generic
inline assmebly which can be used by everyone.
Signed-off-by: default avatarHeiko Carstens <heiko.carstens@de.ibm.com>
Acked-by: default avatarMartin Schwidefsky <schwidefsky@de.ibm.com>
Signed-off-by: default avatarMartin Schwidefsky <schwidefsky@de.ibm.com>
parent fd346c9d
...@@ -424,6 +424,19 @@ static inline int mm_use_skey(struct mm_struct *mm) ...@@ -424,6 +424,19 @@ static inline int mm_use_skey(struct mm_struct *mm)
return 0; return 0;
} }
static inline void csp(unsigned int *ptr, unsigned int old, unsigned int new)
{
register unsigned long reg2 asm("2") = old;
register unsigned long reg3 asm("3") = new;
unsigned long address = (unsigned long)ptr | 1;
asm volatile(
" csp %0,%3"
: "+d" (reg2), "+m" (*ptr)
: "d" (reg3), "d" (address)
: "cc");
}
/* /*
* pgd/pmd/pte query functions * pgd/pmd/pte query functions
*/ */
...@@ -1068,15 +1081,8 @@ static inline pmd_t mk_pmd_phys(unsigned long physpage, pgprot_t pgprot) ...@@ -1068,15 +1081,8 @@ static inline pmd_t mk_pmd_phys(unsigned long physpage, pgprot_t pgprot)
static inline void __pmdp_csp(pmd_t *pmdp) static inline void __pmdp_csp(pmd_t *pmdp)
{ {
register unsigned long reg2 asm("2") = pmd_val(*pmdp); csp((unsigned int *)pmdp + 1, pmd_val(*pmdp),
register unsigned long reg3 asm("3") = pmd_val(*pmdp) | pmd_val(*pmdp) | _SEGMENT_ENTRY_INVALID);
_SEGMENT_ENTRY_INVALID;
register unsigned long reg4 asm("4") = ((unsigned long) pmdp) + 5;
asm volatile(
" csp %1,%3"
: "=m" (*pmdp)
: "d" (reg2), "d" (reg3), "d" (reg4), "m" (*pmdp) : "cc");
} }
static inline void __pmdp_idte(unsigned long address, pmd_t *pmdp) static inline void __pmdp_idte(unsigned long address, pmd_t *pmdp)
......
...@@ -5,6 +5,7 @@ ...@@ -5,6 +5,7 @@
#include <linux/sched.h> #include <linux/sched.h>
#include <asm/processor.h> #include <asm/processor.h>
#include <asm/pgalloc.h> #include <asm/pgalloc.h>
#include <asm/pgtable.h>
/* /*
* Flush all TLB entries on the local CPU. * Flush all TLB entries on the local CPU.
...@@ -44,17 +45,9 @@ void smp_ptlb_all(void); ...@@ -44,17 +45,9 @@ void smp_ptlb_all(void);
*/ */
static inline void __tlb_flush_global(void) static inline void __tlb_flush_global(void)
{ {
register unsigned long reg2 asm("2"); unsigned int dummy = 0;
register unsigned long reg3 asm("3");
register unsigned long reg4 asm("4"); csp(&dummy, 0, 0);
long dummy;
dummy = 0;
reg2 = reg3 = 0;
reg4 = ((unsigned long) &dummy) + 1;
asm volatile(
" csp %0,%2"
: : "d" (reg2), "d" (reg3), "d" (reg4), "m" (dummy) : "cc" );
} }
/* /*
......
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