Skip to content

Commit ff17bf8

Browse files
committed
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
2 parents d8e435f + 2a872a5 commit ff17bf8

File tree

5 files changed

+29
-9
lines changed

5 files changed

+29
-9
lines changed

arch/mips/include/asm/mipsregs.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -214,6 +214,12 @@
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

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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 @@
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

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -209,17 +209,18 @@ static void __kprobes __do_page_fault(struct pt_regs *regs, unsigned long write,
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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@ static void *__kmap_pgprot(struct page *page, unsigned long addr, pgprot_t prot)
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)
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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ void local_flush_tlb_all(void)
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,
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,
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");

0 commit comments

Comments
 (0)