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.