1 1.3 martin /* $NetBSD: cop0.c,v 1.3 2008/04/28 20:23:18 martin Exp $ */ 2 1.1 tsutsui 3 1.1 tsutsui /*- 4 1.1 tsutsui * Copyright (c) 2004 The NetBSD Foundation, Inc. 5 1.1 tsutsui * All rights reserved. 6 1.1 tsutsui * 7 1.1 tsutsui * This code is derived from software contributed to The NetBSD Foundation 8 1.1 tsutsui * by UCHIYAMA Yasushi. 9 1.1 tsutsui * 10 1.1 tsutsui * Redistribution and use in source and binary forms, with or without 11 1.1 tsutsui * modification, are permitted provided that the following conditions 12 1.1 tsutsui * are met: 13 1.1 tsutsui * 1. Redistributions of source code must retain the above copyright 14 1.1 tsutsui * notice, this list of conditions and the following disclaimer. 15 1.1 tsutsui * 2. Redistributions in binary form must reproduce the above copyright 16 1.1 tsutsui * notice, this list of conditions and the following disclaimer in the 17 1.1 tsutsui * documentation and/or other materials provided with the distribution. 18 1.1 tsutsui * 19 1.1 tsutsui * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 20 1.1 tsutsui * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 21 1.1 tsutsui * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 22 1.1 tsutsui * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 23 1.1 tsutsui * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 24 1.1 tsutsui * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 25 1.1 tsutsui * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 26 1.1 tsutsui * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 27 1.1 tsutsui * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 28 1.1 tsutsui * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 29 1.1 tsutsui * POSSIBILITY OF SUCH DAMAGE. 30 1.1 tsutsui */ 31 1.1 tsutsui 32 1.1 tsutsui #include <lib/libsa/stand.h> 33 1.1 tsutsui #include <lib/libkern/libkern.h> 34 1.1 tsutsui 35 1.1 tsutsui #include "cmd.h" 36 1.1 tsutsui #include "local.h" 37 1.1 tsutsui 38 1.1 tsutsui #define NTLB 48 /* R4000 */ 39 1.1 tsutsui struct tlb { 40 1.1 tsutsui uint32_t PageMask; 41 1.1 tsutsui uint32_t EntryHi; 42 1.1 tsutsui uint32_t EntryLo0; 43 1.1 tsutsui uint32_t EntryLo1; 44 1.1 tsutsui uint32_t page_mask; 45 1.1 tsutsui char *page_size; 46 1.1 tsutsui uint32_t vpn, pfn0, pfn1; 47 1.1 tsutsui } entry[NTLB]; 48 1.1 tsutsui static void __tlb_pagemask(struct tlb *); 49 1.1 tsutsui 50 1.1 tsutsui 51 1.1 tsutsui /* 52 1.1 tsutsui EWS4800/350. IPL don't handle TLB refill exception. 53 1.1 tsutsui 54 1.1 tsutsui 16M-page 55 1.1 tsutsui paddr 0x00000000-0x18000000 M0, M1, M2 56 1.1 tsutsui vaddr 0x00000000-0x18000000 57 1.1 tsutsui 58 1.1 tsutsui paddr 0x38000000-0x40000000 M3 59 1.1 tsutsui vaddr 0x18000000-0x20000000 60 1.1 tsutsui 61 1.1 tsutsui paddr 0xe0000000-0xf8000000 FrameBuffer 0xf0000000 + reg 0xf5000000 62 1.1 tsutsui vaddr 0xe0000000-0xf8000000 63 1.1 tsutsui 64 1.1 tsutsui 4K-page 65 1.1 tsutsui paddr 0x20000000-0x20028000 160K 66 1.1 tsutsui vaddr 0x20000000-0x20028000 67 1.1 tsutsui */ 68 1.1 tsutsui int 69 1.1 tsutsui cmd_tlb(int argc, char *argp[], int interactive) 70 1.1 tsutsui { 71 1.1 tsutsui extern void tlb_read(int, void *); 72 1.1 tsutsui struct tlb *e; 73 1.1 tsutsui int i; 74 1.1 tsutsui 75 1.1 tsutsui if (argc < 2) { 76 1.1 tsutsui printf("option: r, d, p entry#\n"); 77 1.1 tsutsui return 1; 78 1.1 tsutsui } 79 1.1 tsutsui 80 1.1 tsutsui switch (*argp[1]) { 81 1.1 tsutsui case 'r': /* Read TLB entry all. */ 82 1.1 tsutsui for (i = 0; i < NTLB; i++) 83 1.1 tsutsui tlb_read(i, &entry[i]); 84 1.1 tsutsui printf("done.\n"); 85 1.1 tsutsui break; 86 1.1 tsutsui case 'd': /* Dump TLB summary */ 87 1.1 tsutsui for (i = 0, e = entry; i < NTLB; i++, e++) { 88 1.1 tsutsui __tlb_pagemask(e); 89 1.1 tsutsui e->vpn = (e->EntryHi >> 13) << 1; 90 1.1 tsutsui e->pfn0 = (e->EntryLo0 >> 6); 91 1.1 tsutsui e->pfn1 = (e->EntryLo1 >> 6); 92 1.1 tsutsui printf("%d %s %x %x+%x", i, e->page_size, e->vpn, 93 1.1 tsutsui e->pfn0, e->pfn1); 94 1.1 tsutsui putchar((i + 1) & 3 ? '|' : '\n'); 95 1.1 tsutsui } 96 1.1 tsutsui break; 97 1.1 tsutsui case 'p': /* Print TLB entry */ 98 1.1 tsutsui if (argc < 3) { 99 1.1 tsutsui printf("tlb p entry#.\n"); 100 1.1 tsutsui return 1; 101 1.1 tsutsui } 102 1.1 tsutsui i = strtoul(argp[2], 0, 0); 103 1.1 tsutsui if (i < 0 || i >= NTLB) 104 1.1 tsutsui return 1; 105 1.1 tsutsui e = &entry[i]; 106 1.2 tsutsui printf("[%d] size:%s vaddr:0x%08x paddr:0x%08x+0x%08x " 107 1.2 tsutsui "mask:0x%08x\n", i, e->page_size, e->vpn << 12, 108 1.1 tsutsui e->pfn0 << 12, e->pfn1 << 12, e->page_mask); 109 1.1 tsutsui printf("[%x, %x, %x, %x]\n", 110 1.1 tsutsui e->PageMask, e->EntryHi, e->EntryLo0, e->EntryLo1); 111 1.1 tsutsui 112 1.1 tsutsui break; 113 1.1 tsutsui default: 114 1.1 tsutsui printf("unknown option \"%c\"\n", *argp[1]); 115 1.1 tsutsui break; 116 1.1 tsutsui } 117 1.1 tsutsui 118 1.1 tsutsui return 0; 119 1.1 tsutsui } 120 1.1 tsutsui 121 1.1 tsutsui int 122 1.1 tsutsui cmd_cop0(int argc, char *argp[], int interactive) 123 1.1 tsutsui { 124 1.1 tsutsui int v; 125 1.1 tsutsui 126 1.1 tsutsui __asm volatile("mfc0 %0, $%1" : "=r"(v) : "i"(15)); 127 1.1 tsutsui printf("PRId: %x\n", v); 128 1.1 tsutsui __asm volatile("mfc0 %0, $%1" : "=r"(v) : "i"(16)); 129 1.1 tsutsui printf("Config: %x\n", v); 130 1.1 tsutsui __asm volatile("mfc0 %0, $%1" : "=r"(v) : "i"(12)); 131 1.1 tsutsui printf("Status: %x\n", v); 132 1.1 tsutsui __asm volatile("mfc0 %0, $%1" : "=r"(v) : "i"(13)); 133 1.1 tsutsui printf("Cause: %x\n", v); 134 1.1 tsutsui __asm volatile("mfc0 %0, $%1" : "=r"(v) : "i"(8)); 135 1.1 tsutsui printf("BadVAddr: %x\n", v); 136 1.1 tsutsui __asm volatile("mfc0 %0, $%1" : "=r"(v) : "i"(14)); 137 1.1 tsutsui printf("EPC: %x\n", v); 138 1.1 tsutsui 139 1.1 tsutsui return 0; 140 1.1 tsutsui } 141 1.1 tsutsui 142 1.1 tsutsui void 143 1.1 tsutsui __tlb_pagemask(struct tlb *e) 144 1.1 tsutsui { 145 1.1 tsutsui 146 1.1 tsutsui switch (e->PageMask >> 13) { 147 1.1 tsutsui default: 148 1.1 tsutsui e->page_size = " ERR"; 149 1.1 tsutsui e->page_mask = 0; 150 1.1 tsutsui break; 151 1.1 tsutsui case 0: 152 1.1 tsutsui e->page_size = " 4K"; 153 1.1 tsutsui e->page_mask = 0xfff; 154 1.1 tsutsui break; 155 1.1 tsutsui case 3: 156 1.1 tsutsui e->page_size = " 16K"; 157 1.1 tsutsui e->page_mask = 0x3fff; 158 1.1 tsutsui break; 159 1.1 tsutsui case 0xf: 160 1.1 tsutsui e->page_size = " 64K"; 161 1.1 tsutsui e->page_mask = 0xffff; 162 1.1 tsutsui break; 163 1.1 tsutsui case 0x3f: 164 1.1 tsutsui e->page_size = "256K"; 165 1.1 tsutsui e->page_mask = 0x3ffff; 166 1.1 tsutsui break; 167 1.1 tsutsui case 0xff: 168 1.1 tsutsui e->page_size = " 1M"; 169 1.1 tsutsui e->page_mask = 0xfffff; 170 1.1 tsutsui break; 171 1.1 tsutsui case 0x3ff: 172 1.1 tsutsui e->page_size = " 4M"; 173 1.1 tsutsui e->page_mask = 0x3fffff; 174 1.1 tsutsui break; 175 1.1 tsutsui case 0xfff: 176 1.1 tsutsui e->page_size = " 16M"; 177 1.1 tsutsui e->page_mask = 0xffffff; 178 1.1 tsutsui break; 179 1.1 tsutsui } 180 1.1 tsutsui } 181