History

Merge branch 'upstream' of git://git.linux-mips.org/pub/scm/ralf/upstream-linus

Pull MIPS fixes from Ralf Baechle: "Another round of MIPS fixes for 4.9: - Fix unreadable output in __do_page_fault due to the KERN_CONT patchset - Correctly handle MIPS R6 fixes to the c0_wired register" * 'upstream' of git://git.linux-mips.org/pub/scm/ralf/upstream-linus: MIPS: mm: Fix output of __do_page_fault MIPS: Mask out limit field when calculating wired entry count

Linus Torvalds committed 9 years ago

Commit ff17bf82 parents d8e435f 2a872a55 files · +29 −9Browse files

Unified · Split

5 files
  1. arch/mips/include/asm/mipsregs.h +6 −0
  2. arch/mips/include/asm/tlb.h +13 −0
  3. arch/mips/mm/fault.c +5 −4
  4. arch/mips/mm/init.c +2 −2
  5. arch/mips/mm/tlb-r4k.c +3 −3
arch/mips/include/asm/mipsregs.h+6−0
@@ -214,6 +214,12 @@ · 213 unmodified lines
214214 #error Bad page size configuration for hugetlbfs!
215215 #endif
216216
217+/*
218+ * Wired register bits
219+ */
220+#define MIPSR6_WIRED_LIMIT (_ULCAST_(0xffff) << 16)
221+#define MIPSR6_WIRED_WIRED (_ULCAST_(0xffff) << 0)
222+
217223 /*
218224 * Values used for computation of new tlb entries
219225 */
arch/mips/include/asm/tlb.h+13−0
@@ -1,6 +1,9 @@
11 #ifndef __ASM_TLB_H
22 #define __ASM_TLB_H
33
4+#include <asm/cpu-features.h>
5+#include <asm/mipsregs.h>
6+
47 /*
58 * MIPS doesn't need any special per-pte or per-vma handling, except
69 * we need to flush cache for area to be unmapped.
@@ -22,6 +25,16 @@ · 15 unmodified lines
2225 ((CKSEG0 + ((idx) << (PAGE_SHIFT + 1))) | \
2326 (cpu_has_tlbinv ? MIPS_ENTRYHI_EHINV : 0))
2427
28+static inline unsigned int num_wired_entries(void)
29+{
30+ unsigned int wired = read_c0_wired();
31+
32+ if (cpu_has_mips_r6)
33+ wired &= MIPSR6_WIRED_WIRED;
34+
35+ return wired;
36+}
37+
2538 #include <asm-generic/tlb.h>
2639
2740 #endif /* __ASM_TLB_H */
arch/mips/mm/fault.c+5−4
@@ -209,17 +209,18 @@ bad_area_nosemaphore: · 208 unmodified lines
209209 if (show_unhandled_signals &&
210210 unhandled_signal(tsk, SIGSEGV) &&
211211 __ratelimit(&ratelimit_state)) {
212− pr_info("\ndo_page_fault(): sending SIGSEGV to %s for invalid %s %0*lx",
212+ pr_info("do_page_fault(): sending SIGSEGV to %s for invalid %s %0*lx\n",
213213 tsk->comm,
214214 write ? "write access to" : "read access from",
215215 field, address);
216216 pr_info("epc = %0*lx in", field,
217217 (unsigned long) regs->cp0_epc);
218− print_vma_addr(" ", regs->cp0_epc);
218+ print_vma_addr(KERN_CONT " ", regs->cp0_epc);
219+ pr_cont("\n");
219220 pr_info("ra = %0*lx in", field,
220221 (unsigned long) regs->regs[31]);
221− print_vma_addr(" ", regs->regs[31]);
222− pr_info("\n");
222+ print_vma_addr(KERN_CONT " ", regs->regs[31]);
223+ pr_cont("\n");
223224 }
224225 current->thread.trap_nr = (regs->cp0_cause >> 2) & 0x1f;
225226 info.si_signo = SIGSEGV;
arch/mips/mm/init.c+2−2
@@ -118,7 +118,7 @@ static void *__kmap_pgprot(struct page *page, unsigned long addr, pgprot_t prot) · 117 unmodified lines
118118 writex_c0_entrylo1(entrylo);
119119 }
120120 #endif
121− tlbidx = read_c0_wired();
121+ tlbidx = num_wired_entries();
122122 write_c0_wired(tlbidx + 1);
123123 write_c0_index(tlbidx);
124124 mtc0_tlbw_hazard();
@@ -147,7 +147,7 @@ void kunmap_coherent(void) · 22 unmodified lines
147147
148148 local_irq_save(flags);
149149 old_ctx = read_c0_entryhi();
150− wired = read_c0_wired() - 1;
150+ wired = num_wired_entries() - 1;
151151 write_c0_wired(wired);
152152 write_c0_index(wired);
153153 write_c0_entryhi(UNIQUE_ENTRYHI(wired));
arch/mips/mm/tlb-r4k.c+3−3
@@ -65,7 +65,7 @@ void local_flush_tlb_all(void) · 64 unmodified lines
6565 write_c0_entrylo0(0);
6666 write_c0_entrylo1(0);
6767
68− entry = read_c0_wired();
68+ entry = num_wired_entries();
6969
7070 /*
7171 * Blast 'em all away.
@@ -385,7 +385,7 @@ void add_wired_entry(unsigned long entrylo0, unsigned long entrylo1, · 313 unmodified lines
385385 old_ctx = read_c0_entryhi();
386386 htw_stop();
387387 old_pagemask = read_c0_pagemask();
388− wired = read_c0_wired();
388+ wired = num_wired_entries();
389389 write_c0_wired(wired + 1);
390390 write_c0_index(wired);
391391 tlbw_use_hazard(); /* What is the hazard here? */
@@ -449,7 +449,7 @@ __init int add_temporary_entry(unsigned long entrylo0, unsigned long entrylo1, · 57 unmodified lines
449449 htw_stop();
450450 old_ctx = read_c0_entryhi();
451451 old_pagemask = read_c0_pagemask();
452− wired = read_c0_wired();
452+ wired = num_wired_entries();
453453 if (--temp_tlb_entry < wired) {
454454 printk(KERN_WARNING
455455 "No TLB space left for add_temporary_entry\n");