Commit cb84318b authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'loongarch-fixes-5.19-3' of...

Merge tag 'loongarch-fixes-5.19-3' of git://git.kernel.org/pub/scm/linux/kernel/git/chenhuacai/linux-loongson

Pull LoongArch fixes from Huacai Chen:
 "Some bug fixes and a trivial cleanup"

* tag 'loongarch-fixes-5.19-3' of git://git.kernel.org/pub/scm/linux/kernel/git/chenhuacai/linux-loongson:
  LoongArch: Make compute_return_era() return void
  LoongArch: Fix wrong fpu version
  LoongArch: Fix EENTRY/MERRENTRY setting in setup_tlb_handler()
  LoongArch: Fix sleeping in atomic context in setup_tlb_handler()
  LoongArch: Fix the _stext symbol address
  LoongArch: Fix the !THP build
parents 29eeafc6 ea18d434
...@@ -12,10 +12,9 @@ static inline unsigned long exception_era(struct pt_regs *regs) ...@@ -12,10 +12,9 @@ static inline unsigned long exception_era(struct pt_regs *regs)
return regs->csr_era; return regs->csr_era;
} }
static inline int compute_return_era(struct pt_regs *regs) static inline void compute_return_era(struct pt_regs *regs)
{ {
regs->csr_era += 4; regs->csr_era += 4;
return 0;
} }
#endif /* _ASM_BRANCH_H */ #endif /* _ASM_BRANCH_H */
...@@ -426,6 +426,11 @@ static inline void update_mmu_cache_pmd(struct vm_area_struct *vma, ...@@ -426,6 +426,11 @@ static inline void update_mmu_cache_pmd(struct vm_area_struct *vma,
#define kern_addr_valid(addr) (1) #define kern_addr_valid(addr) (1)
static inline unsigned long pmd_pfn(pmd_t pmd)
{
return (pmd_val(pmd) & _PFN_MASK) >> _PFN_SHIFT;
}
#ifdef CONFIG_TRANSPARENT_HUGEPAGE #ifdef CONFIG_TRANSPARENT_HUGEPAGE
/* We don't have hardware dirty/accessed bits, generic_pmdp_establish is fine.*/ /* We don't have hardware dirty/accessed bits, generic_pmdp_establish is fine.*/
...@@ -497,11 +502,6 @@ static inline pmd_t pmd_mkyoung(pmd_t pmd) ...@@ -497,11 +502,6 @@ static inline pmd_t pmd_mkyoung(pmd_t pmd)
return pmd; return pmd;
} }
static inline unsigned long pmd_pfn(pmd_t pmd)
{
return (pmd_val(pmd) & _PFN_MASK) >> _PFN_SHIFT;
}
static inline struct page *pmd_page(pmd_t pmd) static inline struct page *pmd_page(pmd_t pmd)
{ {
if (pmd_trans_huge(pmd)) if (pmd_trans_huge(pmd))
......
...@@ -263,7 +263,7 @@ void cpu_probe(void) ...@@ -263,7 +263,7 @@ void cpu_probe(void)
c->cputype = CPU_UNKNOWN; c->cputype = CPU_UNKNOWN;
c->processor_id = read_cpucfg(LOONGARCH_CPUCFG0); c->processor_id = read_cpucfg(LOONGARCH_CPUCFG0);
c->fpu_vers = (read_cpucfg(LOONGARCH_CPUCFG2) >> 3) & 0x3; c->fpu_vers = (read_cpucfg(LOONGARCH_CPUCFG2) & CPUCFG2_FPVERS) >> 3;
c->fpu_csr0 = FPU_CSR_RN; c->fpu_csr0 = FPU_CSR_RN;
c->fpu_mask = FPU_CSR_RSVD; c->fpu_mask = FPU_CSR_RSVD;
......
...@@ -14,8 +14,6 @@ ...@@ -14,8 +14,6 @@
__REF __REF
SYM_ENTRY(_stext, SYM_L_GLOBAL, SYM_A_NONE)
SYM_CODE_START(kernel_entry) # kernel entry point SYM_CODE_START(kernel_entry) # kernel entry point
/* Config direct window and set PG */ /* Config direct window and set PG */
......
...@@ -475,8 +475,7 @@ asmlinkage void noinstr do_ri(struct pt_regs *regs) ...@@ -475,8 +475,7 @@ asmlinkage void noinstr do_ri(struct pt_regs *regs)
die_if_kernel("Reserved instruction in kernel code", regs); die_if_kernel("Reserved instruction in kernel code", regs);
if (unlikely(compute_return_era(regs) < 0)) compute_return_era(regs);
goto out;
if (unlikely(get_user(opcode, era) < 0)) { if (unlikely(get_user(opcode, era) < 0)) {
status = SIGSEGV; status = SIGSEGV;
......
...@@ -37,6 +37,7 @@ SECTIONS ...@@ -37,6 +37,7 @@ SECTIONS
HEAD_TEXT_SECTION HEAD_TEXT_SECTION
. = ALIGN(PECOFF_SEGMENT_ALIGN); . = ALIGN(PECOFF_SEGMENT_ALIGN);
_stext = .;
.text : { .text : {
TEXT_TEXT TEXT_TEXT
SCHED_TEXT SCHED_TEXT
......
...@@ -281,15 +281,16 @@ void setup_tlb_handler(int cpu) ...@@ -281,15 +281,16 @@ void setup_tlb_handler(int cpu)
if (pcpu_handlers[cpu]) if (pcpu_handlers[cpu])
return; return;
page = alloc_pages_node(cpu_to_node(cpu), GFP_KERNEL, get_order(vec_sz)); page = alloc_pages_node(cpu_to_node(cpu), GFP_ATOMIC, get_order(vec_sz));
if (!page) if (!page)
return; return;
addr = page_address(page); addr = page_address(page);
pcpu_handlers[cpu] = virt_to_phys(addr); pcpu_handlers[cpu] = (unsigned long)addr;
memcpy((void *)addr, (void *)eentry, vec_sz); memcpy((void *)addr, (void *)eentry, vec_sz);
local_flush_icache_range((unsigned long)addr, (unsigned long)addr + vec_sz); local_flush_icache_range((unsigned long)addr, (unsigned long)addr + vec_sz);
csr_write64(pcpu_handlers[cpu], LOONGARCH_CSR_TLBRENTRY); csr_write64(pcpu_handlers[cpu], LOONGARCH_CSR_EENTRY);
csr_write64(pcpu_handlers[cpu], LOONGARCH_CSR_MERRENTRY);
csr_write64(pcpu_handlers[cpu] + 80*VECSIZE, LOONGARCH_CSR_TLBRENTRY); csr_write64(pcpu_handlers[cpu] + 80*VECSIZE, LOONGARCH_CSR_TLBRENTRY);
} }
#endif #endif
......
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