1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
|
/* $Id: r4k_tlb_debug.c,v 1.2 2000/01/17 23:32:46 ralf Exp $
*
* This file is subject to the terms and conditions of the GNU General Public
* License. See the file "COPYING" in the main directory of this archive
* for more details.
*
* Copyright (C) 1999 Ralf Baechle
* Copyright (C) 1999 Silicon Graphics, Inc.
*
* TLB debugging routines. These perform horribly slow but can easily be
* modified for debugging purposes.
*/
#include <linux/linkage.h>
#include <linux/kernel.h>
#include <linux/sched.h>
#include <linux/mm.h>
#include <asm/page.h>
#include <asm/pgtable.h>
#include <asm/ptrace.h>
#include <asm/system.h>
asmlinkage void do_page_fault(struct pt_regs *regs, unsigned long write,
unsigned long address);
asmlinkage void tlb_refill_debug(struct pt_regs regs)
{
show_regs(®s);
panic(__FUNCTION__ " called. This Does Not Happen (TM).");
}
asmlinkage void xtlb_refill_debug(struct pt_regs *regs)
{
unsigned long addr;
pgd_t *pgd;
pmd_t *pmd;
pte_t *pte;
addr = regs->cp0_badvaddr & ~((PAGE_SIZE << 1) - 1);
pgd = pgd_offset(current->active_mm, addr);
pmd = pmd_offset(pgd, addr);
pte = pte_offset(pmd, addr);
set_entrylo0(pte_val(pte[0]) >> 6);
set_entrylo1(pte_val(pte[1]) >> 6);
__asm__ __volatile__("nop;nop;nop");
tlb_write_random();
}
asmlinkage void xtlb_mod_debug(struct pt_regs *regs)
{
unsigned long addr;
addr = regs->cp0_badvaddr;
do_page_fault(regs, 1, addr);
}
asmlinkage void xtlb_tlbl_debug(struct pt_regs *regs)
{
unsigned long addr;
addr = regs->cp0_badvaddr;
do_page_fault(regs, 0, addr);
}
asmlinkage void xtlb_tlbs_debug(struct pt_regs *regs)
{
unsigned long addr;
addr = regs->cp0_badvaddr;
do_page_fault(regs, 1, addr);
}
|