Re: [PATCH 1/2] parisc: Use constants to encode the space registers like PRIV_KERNEL

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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
>>
>
>





[Index of Archives]     [Linux SoC]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux