On 2/17/22 15:21, John David Anglin wrote: > On 2022-02-17 7:12 a.m., Helge Deller wrote: >> Instead of hardcoding various space registers, use the space register >> constants. Introduce PRIV_TEMP1 and PRIV_TEMP2 for %sr1 and %sr2. > I'm not sure I like using the privilege defines for space registers. Wouldn't it be > better to define SR_KERNEL, SR_TMP1, etc? Agreed, I will change it. Helge >> >> Signed-off-by: Helge Deller <deller@xxxxxx> >> --- >> arch/parisc/include/asm/assembly.h | 7 +++++-- >> arch/parisc/include/asm/cache.h | 11 ++++------- >> arch/parisc/include/asm/mmu_context.h | 2 +- >> arch/parisc/include/asm/pgtable.h | 6 +++--- >> arch/parisc/include/asm/special_insns.h | 4 ++-- >> arch/parisc/kernel/cache.c | 8 ++++---- >> arch/parisc/kernel/pci-dma.c | 4 ++-- >> arch/parisc/lib/memcpy.c | 16 ++++++++-------- >> 8 files changed, 29 insertions(+), 29 deletions(-) >> >> diff --git a/arch/parisc/include/asm/assembly.h b/arch/parisc/include/asm/assembly.h >> index 6369082c6c74..a9b4c7c790db 100644 >> --- a/arch/parisc/include/asm/assembly.h >> +++ b/arch/parisc/include/asm/assembly.h >> @@ -43,9 +43,12 @@ >> #define PA_ASM_LEVEL 1.1 >> #endif >> >> -/* Privilege level field in the rightmost two bits of the IA queues */ >> -#define PRIV_USER 3 >> +/* Various space registers used in the kernel, additionally used to encode the >> + * privilege level field in the rightmost two bits of the IA queues. */ >> #define PRIV_KERNEL 0 >> +#define PRIV_TEMP1 1 >> +#define PRIV_TEMP2 2 >> +#define PRIV_USER 3 >> >> #ifdef __ASSEMBLY__ >> >> diff --git a/arch/parisc/include/asm/cache.h b/arch/parisc/include/asm/cache.h >> index d53e9e27dba0..5032e758594e 100644 >> --- a/arch/parisc/include/asm/cache.h >> +++ b/arch/parisc/include/asm/cache.h >> @@ -39,16 +39,13 @@ extern int icache_stride; >> extern struct pdc_cache_info cache_info; >> void parisc_setup_cache_timing(void); >> >> -#define pdtlb(addr) asm volatile("pdtlb 0(%%sr1,%0)" \ >> +#define pdtlb(sr, addr) asm volatile("pdtlb 0(%%sr%0,%1)" \ >> ALTERNATIVE(ALT_COND_NO_SMP, INSN_PxTLB) \ >> - : : "r" (addr) : "memory") >> -#define pitlb(addr) asm volatile("pitlb 0(%%sr1,%0)" \ >> + : : "i"(sr), "r" (addr) : "memory") >> +#define pitlb(sr, addr) asm volatile("pitlb 0(%%sr%0,%1)" \ >> ALTERNATIVE(ALT_COND_NO_SMP, INSN_PxTLB) \ >> ALTERNATIVE(ALT_COND_NO_SPLIT_TLB, INSN_NOP) \ >> - : : "r" (addr) : "memory") >> -#define pdtlb_kernel(addr) asm volatile("pdtlb 0(%0)" \ >> - ALTERNATIVE(ALT_COND_NO_SMP, INSN_PxTLB) \ >> - : : "r" (addr) : "memory") >> + : : "i"(sr), "r" (addr) : "memory") >> >> #define asm_io_fdc(addr) asm volatile("fdc %%r0(%0)" \ >> ALTERNATIVE(ALT_COND_NO_DCACHE, INSN_NOP) \ >> diff --git a/arch/parisc/include/asm/mmu_context.h b/arch/parisc/include/asm/mmu_context.h >> index 726257648d9f..eaf29632c3ce 100644 >> --- a/arch/parisc/include/asm/mmu_context.h >> +++ b/arch/parisc/include/asm/mmu_context.h >> @@ -43,7 +43,7 @@ static inline unsigned long __space_to_prot(mm_context_t context) >> >> static inline void load_context(mm_context_t context) >> { >> - mtsp(context, 3); >> + mtsp(context, PRIV_USER); >> mtctl(__space_to_prot(context), 8); >> } >> >> diff --git a/arch/parisc/include/asm/pgtable.h b/arch/parisc/include/asm/pgtable.h >> index 3e7cf882639f..fac6babb1e68 100644 >> --- a/arch/parisc/include/asm/pgtable.h >> +++ b/arch/parisc/include/asm/pgtable.h >> @@ -70,9 +70,9 @@ static inline void purge_tlb_entries(struct mm_struct *mm, unsigned long addr) >> unsigned long flags; >> >> purge_tlb_start(flags); >> - mtsp(mm->context, 1); >> - pdtlb(addr); >> - pitlb(addr); >> + mtsp(mm->context, PRIV_TEMP1); >> + pdtlb(PRIV_TEMP1, addr); >> + pitlb(PRIV_TEMP1, addr); >> purge_tlb_end(flags); >> } >> >> diff --git a/arch/parisc/include/asm/special_insns.h b/arch/parisc/include/asm/special_insns.h >> index 16ee41e77174..41b3ddbd344c 100644 >> --- a/arch/parisc/include/asm/special_insns.h >> +++ b/arch/parisc/include/asm/special_insns.h >> @@ -55,8 +55,8 @@ static inline void set_eiem(unsigned long val) >> #define mfsp(reg) ({ \ >> unsigned long cr; \ >> __asm__ __volatile__( \ >> - "mfsp " #reg ",%0" : \ >> - "=r" (cr) \ >> + "mfsp %%sr%1,%0" \ >> + : "=r" (cr) : "i"(reg) \ >> ); \ >> cr; \ >> }) >> diff --git a/arch/parisc/kernel/cache.c b/arch/parisc/kernel/cache.c >> index 94150b91c96f..00ed9d57198c 100644 >> --- a/arch/parisc/kernel/cache.c >> +++ b/arch/parisc/kernel/cache.c >> @@ -457,7 +457,7 @@ void flush_kernel_dcache_page_addr(void *addr) >> >> flush_kernel_dcache_page_asm(addr); >> purge_tlb_start(flags); >> - pdtlb_kernel(addr); >> + pdtlb(PRIV_KERNEL, addr); >> purge_tlb_end(flags); >> } >> EXPORT_SYMBOL(flush_kernel_dcache_page_addr); >> @@ -496,9 +496,9 @@ int __flush_tlb_range(unsigned long sid, unsigned long start, >> but cause a purge request to be broadcast to other TLBs. */ >> while (start < end) { >> purge_tlb_start(flags); >> - mtsp(sid, 1); >> - pdtlb(start); >> - pitlb(start); >> + mtsp(sid, PRIV_TEMP1); >> + pdtlb(PRIV_TEMP1, start); >> + pitlb(PRIV_TEMP1, start); >> purge_tlb_end(flags); >> start += PAGE_SIZE; >> } >> diff --git a/arch/parisc/kernel/pci-dma.c b/arch/parisc/kernel/pci-dma.c >> index 36a57aa38e87..7f9b05d36789 100644 >> --- a/arch/parisc/kernel/pci-dma.c >> +++ b/arch/parisc/kernel/pci-dma.c >> @@ -91,7 +91,7 @@ static inline int map_pte_uncached(pte_t * pte, >> printk(KERN_ERR "map_pte_uncached: page already exists\n"); >> purge_tlb_start(flags); >> set_pte(pte, __mk_pte(*paddr_ptr, PAGE_KERNEL_UNC)); >> - pdtlb_kernel(orig_vaddr); >> + pdtlb(PRIV_KERNEL, orig_vaddr); >> purge_tlb_end(flags); >> vaddr += PAGE_SIZE; >> orig_vaddr += PAGE_SIZE; >> @@ -175,7 +175,7 @@ static inline void unmap_uncached_pte(pmd_t * pmd, unsigned long vaddr, >> >> pte_clear(&init_mm, vaddr, pte); >> purge_tlb_start(flags); >> - pdtlb_kernel(orig_vaddr); >> + pdtlb(PRIV_KERNEL, orig_vaddr); >> purge_tlb_end(flags); >> vaddr += PAGE_SIZE; >> orig_vaddr += PAGE_SIZE; >> diff --git a/arch/parisc/lib/memcpy.c b/arch/parisc/lib/memcpy.c >> index ea70a0e08321..a32695eb56fa 100644 >> --- a/arch/parisc/lib/memcpy.c >> +++ b/arch/parisc/lib/memcpy.c >> @@ -13,8 +13,8 @@ >> #include <linux/compiler.h> >> #include <linux/uaccess.h> >> >> -#define get_user_space() (uaccess_kernel() ? 0 : mfsp(3)) >> -#define get_kernel_space() (0) >> +#define get_user_space() mfsp(PRIV_USER) >> +#define get_kernel_space() PRIV_KERNEL >> >> /* Returns 0 for success, otherwise, returns number of bytes not transferred. */ >> extern unsigned long pa_memcpy(void *dst, const void *src, >> @@ -23,8 +23,8 @@ extern unsigned long pa_memcpy(void *dst, const void *src, >> unsigned long raw_copy_to_user(void __user *dst, const void *src, >> unsigned long len) >> { >> - mtsp(get_kernel_space(), 1); >> - mtsp(get_user_space(), 2); >> + mtsp(get_kernel_space(), PRIV_TEMP1); >> + mtsp(get_user_space(), PRIV_TEMP2); >> return pa_memcpy((void __force *)dst, src, len); >> } >> EXPORT_SYMBOL(raw_copy_to_user); >> @@ -32,16 +32,16 @@ EXPORT_SYMBOL(raw_copy_to_user); >> unsigned long raw_copy_from_user(void *dst, const void __user *src, >> unsigned long len) >> { >> - mtsp(get_user_space(), 1); >> - mtsp(get_kernel_space(), 2); >> + mtsp(get_user_space(), PRIV_TEMP1); >> + mtsp(get_kernel_space(), PRIV_TEMP2); >> return pa_memcpy(dst, (void __force *)src, len); >> } >> EXPORT_SYMBOL(raw_copy_from_user); >> >> void * memcpy(void * dst,const void *src, size_t count) >> { >> - mtsp(get_kernel_space(), 1); >> - mtsp(get_kernel_space(), 2); >> + mtsp(get_kernel_space(), PRIV_TEMP1); >> + mtsp(get_kernel_space(), PRIV_TEMP2); >> pa_memcpy(dst, src, count); >> return dst; >> } >> -- >> 2.34.1 >> > >