Rev 341 | Rev 391 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 341 | Rev 389 | ||
---|---|---|---|
Line 30... | Line 30... | ||
30 | #include <arch/mm/asid.h> |
30 | #include <arch/mm/asid.h> |
31 | #include <mm/tlb.h> |
31 | #include <mm/tlb.h> |
32 | #include <arch/cp0.h> |
32 | #include <arch/cp0.h> |
33 | #include <panic.h> |
33 | #include <panic.h> |
34 | #include <arch.h> |
34 | #include <arch.h> |
35 | - | ||
36 | #include <symtab.h> |
35 | #include <symtab.h> |
37 | 36 | ||
- | 37 | void tlb_init_arch(void) |
|
- | 38 | { |
|
- | 39 | int i; |
|
- | 40 | ||
- | 41 | cp0_pagemask_write(TLB_PAGE_MASK_16K); |
|
- | 42 | cp0_entry_hi_write(0); |
|
- | 43 | cp0_entry_lo0_write(0); |
|
- | 44 | cp0_entry_lo1_write(0); |
|
- | 45 | ||
- | 46 | /* |
|
- | 47 | * Invalidate all entries. |
|
- | 48 | */ |
|
- | 49 | for (i = 0; i < TLB_SIZE; i++) { |
|
- | 50 | cp0_index_write(0); |
|
- | 51 | tlbwi(); |
|
- | 52 | } |
|
- | 53 | ||
- | 54 | /* |
|
- | 55 | * The kernel is going to make use of some wired |
|
- | 56 | * entries (e.g. mapping kernel stacks). |
|
- | 57 | */ |
|
- | 58 | cp0_wired_write(TLB_WIRED); |
|
- | 59 | } |
|
- | 60 | ||
38 | void tlb_refill(struct exception_regdump *pstate) |
61 | void tlb_refill(struct exception_regdump *pstate) |
39 | { |
62 | { |
40 | char *symbol = ""; |
63 | char *symbol = ""; |
41 | char *sym2 = ""; |
64 | char *sym2 = ""; |
42 | 65 | ||
Line 44... | Line 67... | ||
44 | if (s) |
67 | if (s) |
45 | symbol = s; |
68 | symbol = s; |
46 | s = get_symtab_entry(pstate->ra); |
69 | s = get_symtab_entry(pstate->ra); |
47 | if (s) |
70 | if (s) |
48 | sym2 = s; |
71 | sym2 = s; |
49 | panic("%X: tlb_refill exception at %X(%s<-%s)\n", cp0_badvaddr_read(), |
72 | panic("%X: TLB Refill Exception at %X(%s<-%s)\n", cp0_badvaddr_read(), |
50 | pstate->epc, symbol,sym2); |
73 | pstate->epc, symbol, sym2); |
51 | } |
74 | } |
52 | 75 | ||
53 | void tlb_invalid(struct exception_regdump *pstate) |
76 | void tlb_invalid(struct exception_regdump *pstate) |
54 | { |
77 | { |
55 | char *symbol = ""; |
78 | char *symbol = ""; |
56 | 79 | ||
57 | char *s = get_symtab_entry(pstate->epc); |
80 | char *s = get_symtab_entry(pstate->epc); |
58 | if (s) |
81 | if (s) |
59 | symbol = s; |
82 | symbol = s; |
- | 83 | panic("%X: TLB Invalid Exception at %X(%s)\n", cp0_badvaddr_read(), |
|
- | 84 | pstate->epc, symbol); |
|
- | 85 | } |
|
- | 86 | ||
- | 87 | void tlb_modified(struct exception_regdump *pstate) |
|
- | 88 | { |
|
- | 89 | char *symbol = ""; |
|
- | 90 | ||
- | 91 | char *s = get_symtab_entry(pstate->epc); |
|
- | 92 | if (s) |
|
- | 93 | symbol = s; |
|
60 | panic("%X: TLB exception at %X(%s)\n", cp0_badvaddr_read(), |
94 | panic("%X: TLB Modified Exception at %X(%s)\n", cp0_badvaddr_read(), |
61 | pstate->epc, symbol); |
95 | pstate->epc, symbol); |
62 | } |
96 | } |
63 | 97 | ||
- | 98 | ||
64 | void tlb_invalidate(int asid) |
99 | void tlb_invalidate(int asid) |
65 | { |
100 | { |
66 | pri_t pri; |
101 | pri_t pri; |
67 | 102 | ||
68 | pri = cpu_priority_high(); |
103 | pri = cpu_priority_high(); |