All of lore.kernel.org
 help / color / mirror / Atom feed
diff for duplicates of <51A45861.1010008@gmail.com>

diff --git a/a/1.txt b/N1/1.txt
index 3422cb3..6e03473 100644
--- a/a/1.txt
+++ b/N1/1.txt
@@ -68,129 +68,3 @@ Peter, Kamezawa, other reviewers of that commit, could you please comment?
 
 
 ------8<------
-From 29324d01c0c95b11fbfe509d9b0eae42cab6d380 Mon Sep 17 00:00:00 2001
-From: Max Filippov <jcmvbkbc@gmail.com>
-Date: Tue, 28 May 2013 08:06:03 +0400
-Subject: [PATCH] mips: check TLB sanity on return to userspace
-
-Signed-off-by: Max Filippov <jcmvbkbc@gmail.com>
----
- arch/mips/kernel/entry.S |    1 +
- arch/mips/lib/dump_tlb.c |   81 ++++++++++++++++++++++++++++++++++++++++++++++
- 2 files changed, 82 insertions(+), 0 deletions(-)
-
-diff --git a/arch/mips/kernel/entry.S b/arch/mips/kernel/entry.S
-index e578685..82881ac 100644
---- a/arch/mips/kernel/entry.S
-+++ b/arch/mips/kernel/entry.S
-@@ -49,6 +49,7 @@ resume_userspace:
- 	local_irq_disable		# make sure we dont miss an
- 					# interrupt setting need_resched
- 					# between sampling and return
-+	jal	check_tlb_all
- 	LONG_L	a2, TI_FLAGS($28)	# current->work
- 	andi	t0, a2, _TIF_WORK_MASK	# (ignoring syscall_trace)
- 	bnez	t0, work_pending
-diff --git a/arch/mips/lib/dump_tlb.c b/arch/mips/lib/dump_tlb.c
-index 32b9f21..629e38b 100644
---- a/arch/mips/lib/dump_tlb.c
-+++ b/arch/mips/lib/dump_tlb.c
-@@ -6,6 +6,8 @@
-  */
- #include <linux/kernel.h>
- #include <linux/mm.h>
-+#include <linux/sched.h>
-+#include <linux/mm_types.h>
-
- #include <asm/mipsregs.h>
- #include <asm/page.h>
-@@ -111,3 +113,82 @@ void dump_tlb_all(void)
- {
- 	dump_tlb(0, current_cpu_data.tlbsize - 1);
- }
-+
-+static inline pte_t *get_pte_for_vaddr(unsigned vaddr)
-+{
-+	struct task_struct *task = get_current();
-+	struct mm_struct *mm = task->mm;
-+	pgd_t *pgd;
-+	pud_t *pud;
-+	pmd_t *pmd;
-+	pte_t *pte;
-+
-+	if (!mm)
-+		mm = task->active_mm;
-+	pgd = pgd_offset(mm, vaddr);
-+	if (pgd_none_or_clear_bad(pgd))
-+		return NULL;
-+	pud = pud_offset(pgd, vaddr);
-+	if (pud_none_or_clear_bad(pud))
-+		return NULL;
-+	pmd = pmd_offset(pud, vaddr);
-+	if (pmd_none_or_clear_bad(pmd))
-+		return NULL;
-+	pte = pte_offset_map(pmd, vaddr);
-+	return pte;
-+}
-+
-+static inline void check_tlb_entry(unsigned i, unsigned long va,
-+		unsigned long long entrylo)
-+{
-+	if (entrylo & 2) {
-+		pte_t *pte = get_pte_for_vaddr(va);
-+		unsigned long pte_pa = pte ? (pte_pfn(*pte) << PAGE_SHIFT) : 0;
-+		unsigned long tlb_pa = (entrylo << 6) & PAGE_MASK;
-+		if (pte_pa != tlb_pa)
-+			pr_err("%d: %08lx: %08lx/%08lx\n",
-+					i, va, tlb_pa, pte_pa);
-+	}
-+}
-+static void check_tlb(unsigned last)
-+{
-+	unsigned long s_entryhi, asid;
-+	unsigned int s_index, s_pagemask, i;
-+	struct {
-+		unsigned long entryhi;
-+		unsigned long entrylo0, entrylo1;
-+	} c[64];
-+
-+	BUG_ON(last > ARRAY_SIZE(c));
-+	s_pagemask = read_c0_pagemask();
-+	s_entryhi = read_c0_entryhi();
-+	s_index = read_c0_index();
-+	asid = s_entryhi & 0xff;
-+
-+	for (i = 0; i < last; ++i) {
-+		write_c0_index(i);
-+		BARRIER();
-+		tlb_read();
-+		BARRIER();
-+		c[i].entryhi = read_c0_entryhi();
-+		c[i].entrylo0 = read_c0_entrylo0();
-+		c[i].entrylo1 = read_c0_entrylo1();
-+	}
-+	for (i = 0; i < last; ++i) {
-+		/* Unused entries have a virtual address of CKSEG0.  */
-+		if ((c[i].entryhi & ~0x1ffffUL) != CKSEG0
-+		    && (c[i].entryhi & 0xff) == asid) {
-+			unsigned long va = c[i].entryhi & ~0x1fffUL;
-+			check_tlb_entry(i, va, c[i].entrylo0);
-+			check_tlb_entry(i, va + PAGE_SIZE, c[i].entrylo1);
-+		}
-+	}
-+	write_c0_entryhi(s_entryhi);
-+	write_c0_index(s_index);
-+	write_c0_pagemask(s_pagemask);
-+}
-+
-+void check_tlb_all(void)
-+{
-+	check_tlb(current_cpu_data.tlbsize);
-+}
--- 
-1.7.7.6
-
-
--- 
-Thanks.
--- Max
diff --git a/a/content_digest b/N1/content_digest
index 96434c1..a389ae1 100644
--- a/a/content_digest
+++ b/N1/content_digest
@@ -83,132 +83,6 @@
  "Peter, Kamezawa, other reviewers of that commit, could you please comment?\n"
  "\n"
  "\n"
- "------8<------\n"
- "From 29324d01c0c95b11fbfe509d9b0eae42cab6d380 Mon Sep 17 00:00:00 2001\n"
- "From: Max Filippov <jcmvbkbc@gmail.com>\n"
- "Date: Tue, 28 May 2013 08:06:03 +0400\n"
- "Subject: [PATCH] mips: check TLB sanity on return to userspace\n"
- "\n"
- "Signed-off-by: Max Filippov <jcmvbkbc@gmail.com>\n"
- "---\n"
- " arch/mips/kernel/entry.S |    1 +\n"
- " arch/mips/lib/dump_tlb.c |   81 ++++++++++++++++++++++++++++++++++++++++++++++\n"
- " 2 files changed, 82 insertions(+), 0 deletions(-)\n"
- "\n"
- "diff --git a/arch/mips/kernel/entry.S b/arch/mips/kernel/entry.S\n"
- "index e578685..82881ac 100644\n"
- "--- a/arch/mips/kernel/entry.S\n"
- "+++ b/arch/mips/kernel/entry.S\n"
- "@@ -49,6 +49,7 @@ resume_userspace:\n"
- " \tlocal_irq_disable\t\t# make sure we dont miss an\n"
- " \t\t\t\t\t# interrupt setting need_resched\n"
- " \t\t\t\t\t# between sampling and return\n"
- "+\tjal\tcheck_tlb_all\n"
- " \tLONG_L\ta2, TI_FLAGS($28)\t# current->work\n"
- " \tandi\tt0, a2, _TIF_WORK_MASK\t# (ignoring syscall_trace)\n"
- " \tbnez\tt0, work_pending\n"
- "diff --git a/arch/mips/lib/dump_tlb.c b/arch/mips/lib/dump_tlb.c\n"
- "index 32b9f21..629e38b 100644\n"
- "--- a/arch/mips/lib/dump_tlb.c\n"
- "+++ b/arch/mips/lib/dump_tlb.c\n"
- "@@ -6,6 +6,8 @@\n"
- "  */\n"
- " #include <linux/kernel.h>\n"
- " #include <linux/mm.h>\n"
- "+#include <linux/sched.h>\n"
- "+#include <linux/mm_types.h>\n"
- "\n"
- " #include <asm/mipsregs.h>\n"
- " #include <asm/page.h>\n"
- "@@ -111,3 +113,82 @@ void dump_tlb_all(void)\n"
- " {\n"
- " \tdump_tlb(0, current_cpu_data.tlbsize - 1);\n"
- " }\n"
- "+\n"
- "+static inline pte_t *get_pte_for_vaddr(unsigned vaddr)\n"
- "+{\n"
- "+\tstruct task_struct *task = get_current();\n"
- "+\tstruct mm_struct *mm = task->mm;\n"
- "+\tpgd_t *pgd;\n"
- "+\tpud_t *pud;\n"
- "+\tpmd_t *pmd;\n"
- "+\tpte_t *pte;\n"
- "+\n"
- "+\tif (!mm)\n"
- "+\t\tmm = task->active_mm;\n"
- "+\tpgd = pgd_offset(mm, vaddr);\n"
- "+\tif (pgd_none_or_clear_bad(pgd))\n"
- "+\t\treturn NULL;\n"
- "+\tpud = pud_offset(pgd, vaddr);\n"
- "+\tif (pud_none_or_clear_bad(pud))\n"
- "+\t\treturn NULL;\n"
- "+\tpmd = pmd_offset(pud, vaddr);\n"
- "+\tif (pmd_none_or_clear_bad(pmd))\n"
- "+\t\treturn NULL;\n"
- "+\tpte = pte_offset_map(pmd, vaddr);\n"
- "+\treturn pte;\n"
- "+}\n"
- "+\n"
- "+static inline void check_tlb_entry(unsigned i, unsigned long va,\n"
- "+\t\tunsigned long long entrylo)\n"
- "+{\n"
- "+\tif (entrylo & 2) {\n"
- "+\t\tpte_t *pte = get_pte_for_vaddr(va);\n"
- "+\t\tunsigned long pte_pa = pte ? (pte_pfn(*pte) << PAGE_SHIFT) : 0;\n"
- "+\t\tunsigned long tlb_pa = (entrylo << 6) & PAGE_MASK;\n"
- "+\t\tif (pte_pa != tlb_pa)\n"
- "+\t\t\tpr_err(\"%d: %08lx: %08lx/%08lx\\n\",\n"
- "+\t\t\t\t\ti, va, tlb_pa, pte_pa);\n"
- "+\t}\n"
- "+}\n"
- "+static void check_tlb(unsigned last)\n"
- "+{\n"
- "+\tunsigned long s_entryhi, asid;\n"
- "+\tunsigned int s_index, s_pagemask, i;\n"
- "+\tstruct {\n"
- "+\t\tunsigned long entryhi;\n"
- "+\t\tunsigned long entrylo0, entrylo1;\n"
- "+\t} c[64];\n"
- "+\n"
- "+\tBUG_ON(last > ARRAY_SIZE(c));\n"
- "+\ts_pagemask = read_c0_pagemask();\n"
- "+\ts_entryhi = read_c0_entryhi();\n"
- "+\ts_index = read_c0_index();\n"
- "+\tasid = s_entryhi & 0xff;\n"
- "+\n"
- "+\tfor (i = 0; i < last; ++i) {\n"
- "+\t\twrite_c0_index(i);\n"
- "+\t\tBARRIER();\n"
- "+\t\ttlb_read();\n"
- "+\t\tBARRIER();\n"
- "+\t\tc[i].entryhi = read_c0_entryhi();\n"
- "+\t\tc[i].entrylo0 = read_c0_entrylo0();\n"
- "+\t\tc[i].entrylo1 = read_c0_entrylo1();\n"
- "+\t}\n"
- "+\tfor (i = 0; i < last; ++i) {\n"
- "+\t\t/* Unused entries have a virtual address of CKSEG0.  */\n"
- "+\t\tif ((c[i].entryhi & ~0x1ffffUL) != CKSEG0\n"
- "+\t\t    && (c[i].entryhi & 0xff) == asid) {\n"
- "+\t\t\tunsigned long va = c[i].entryhi & ~0x1fffUL;\n"
- "+\t\t\tcheck_tlb_entry(i, va, c[i].entrylo0);\n"
- "+\t\t\tcheck_tlb_entry(i, va + PAGE_SIZE, c[i].entrylo1);\n"
- "+\t\t}\n"
- "+\t}\n"
- "+\twrite_c0_entryhi(s_entryhi);\n"
- "+\twrite_c0_index(s_index);\n"
- "+\twrite_c0_pagemask(s_pagemask);\n"
- "+}\n"
- "+\n"
- "+void check_tlb_all(void)\n"
- "+{\n"
- "+\tcheck_tlb(current_cpu_data.tlbsize);\n"
- "+}\n"
- "-- \n"
- "1.7.7.6\n"
- "\n"
- "\n"
- "-- \n"
- "Thanks.\n"
- -- Max
+ ------8<------
 
-60712dac03ac04ec3798fa449d27ce6cef401537ae2d20950181ca53c00c0fa6
+bba02f9656ca5144a102580644ddb4b780677c1f785de61bc3ee7c52df84aab0

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.