1/* 2 * Copyright (c) 2001-2005 The Regents of The University of Michigan 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions are 7 * met: redistributions of source code must retain the above copyright 8 * notice, this list of conditions and the following disclaimer; --- 110 unchanged lines hidden (view full) --- 119 if (i->second->used) { 120 i->second->used = false; 121 usedEntries--; 122 } 123 DPRINTF(TLB, "TLB: Found conflicting entry, deleting it\n"); 124 lookupTable.erase(i); 125 } 126 |
127 i = lookupTable.insert(new_entry->range, new_entry); 128 assert(i != lookupTable.end()); |
129 130 // If all entries have there used bit set, clear it on them all, but the 131 // one we just inserted 132 if (usedEntries == size) { 133 clearUsedBits(); 134 new_entry->used = true; 135 usedEntries++; 136 } --- 7 unchanged lines hidden (view full) --- 144 MapIter i; 145 TlbRange tr; 146 TlbEntry *t; 147 148 DPRINTF(TLB, "TLB: Looking up entry va=%#x pid=%d cid=%d r=%d\n", 149 va, partition_id, context_id, real); 150 // Assemble full address structure 151 tr.va = va; |
152 tr.size = MachineBytes; |
153 tr.contextId = context_id; 154 tr.partitionId = partition_id; 155 tr.real = real; 156 157 // Try to find the entry 158 i = lookupTable.find(tr); 159 if (i == lookupTable.end()) { 160 DPRINTF(TLB, "TLB: No valid entry found\n"); --- 15 unchanged lines hidden (view full) --- 176 } 177 178 return t; 179} 180 181void 182TLB::dumpAll() 183{ |
184 MapIter i; |
185 for (int x = 0; x < size; x++) { 186 if (tlb[x].valid) { 187 DPRINTFN("%4d: %#2x:%#2x %c %#4x %#8x %#8x %#16x\n", 188 x, tlb[x].range.partitionId, tlb[x].range.contextId, 189 tlb[x].range.real ? 'R' : ' ', tlb[x].range.size, 190 tlb[x].range.va, tlb[x].pte.paddr(), tlb[x].pte()); 191 } 192 } 193} 194 195void 196TLB::demapPage(Addr va, int partition_id, bool real, int context_id) 197{ 198 TlbRange tr; 199 MapIter i; 200 |
201 DPRINTF(IPR, "TLB: Demapping Page va=%#x pid=%#d cid=%d r=%d\n", 202 va, partition_id, context_id, real); 203 |
204 cacheValid = false; 205 206 // Assemble full address structure 207 tr.va = va; |
208 tr.size = MachineBytes; |
209 tr.contextId = context_id; 210 tr.partitionId = partition_id; 211 tr.real = real; 212 213 // Demap any entry that conflicts 214 i = lookupTable.find(tr); 215 if (i != lookupTable.end()) { |
216 DPRINTF(IPR, "TLB: Demapped page\n"); |
217 i->second->valid = false; 218 if (i->second->used) { 219 i->second->used = false; 220 usedEntries--; 221 } 222 lookupTable.erase(i); 223 } 224} 225 226void 227TLB::demapContext(int partition_id, int context_id) 228{ 229 int x; |
230 DPRINTF(IPR, "TLB: Demapping Context pid=%#d cid=%d\n", 231 partition_id, context_id); |
232 cacheValid = false; 233 for (x = 0; x < size; x++) { 234 if (tlb[x].range.contextId == context_id && 235 tlb[x].range.partitionId == partition_id) { 236 tlb[x].valid = false; 237 if (tlb[x].used) { 238 tlb[x].used = false; 239 usedEntries--; 240 } 241 lookupTable.erase(tlb[x].range); 242 } 243 } 244} 245 246void 247TLB::demapAll(int partition_id) 248{ 249 int x; |
250 DPRINTF(TLB, "TLB: Demapping All pid=%#d\n", partition_id); |
251 cacheValid = false; 252 for (x = 0; x < size; x++) { 253 if (!tlb[x].pte.locked() && tlb[x].range.partitionId == partition_id) { 254 tlb[x].valid = false; 255 if (tlb[x].used) { 256 tlb[x].used = false; 257 usedEntries--; 258 } --- 629 unchanged lines hidden (view full) --- 888 ASI asi = (ASI)pkt->req->getAsi(); 889 890 Addr ta_insert; 891 Addr va_insert; 892 Addr ct_insert; 893 int part_insert; 894 int entry_insert = -1; 895 bool real_insert; |
896 bool ignore; 897 int part_id; 898 int ctx_id; |
899 PageTableEntry pte; 900 901 DPRINTF(IPR, "Memory Mapped IPR Write: asi=%#X a=%#x d=%#X\n", 902 (uint32_t)asi, va, data); 903 904 switch (asi) { 905 case ASI_LSU_CONTROL_REG: 906 assert(va == 0); --- 103 unchanged lines hidden (view full) --- 1010 va_insert = mbits(ta_insert, 63,13); 1011 ct_insert = mbits(ta_insert, 12,0); 1012 part_insert = tc->readMiscRegWithEffect(MISCREG_MMU_PART_ID); 1013 real_insert = bits(va, 9,9); 1014 pte.populate(data, bits(va,10,10) ? PageTableEntry::sun4v : 1015 PageTableEntry::sun4u); 1016 insert(va_insert, part_insert, ct_insert, real_insert, pte, entry_insert); 1017 break; |
1018 case ASI_IMMU_DEMAP: 1019 ignore = false; 1020 ctx_id = -1; 1021 part_id = tc->readMiscRegWithEffect(MISCREG_MMU_PART_ID); 1022 switch (bits(va,5,4)) { 1023 case 0: 1024 ctx_id = tc->readMiscRegWithEffect(MISCREG_MMU_P_CONTEXT); 1025 break; 1026 case 1: 1027 ignore = true; 1028 break; 1029 case 3: 1030 ctx_id = 0; 1031 break; 1032 default: 1033 ignore = true; 1034 } 1035 1036 switch(bits(va,7,6)) { 1037 case 0: // demap page 1038 if (!ignore) 1039 tc->getITBPtr()->demapPage(mbits(va,63,13), part_id, 1040 bits(va,9,9), ctx_id); 1041 break; 1042 case 1: //demap context 1043 if (!ignore) 1044 tc->getITBPtr()->demapContext(part_id, ctx_id); 1045 break; 1046 case 2: 1047 tc->getITBPtr()->demapAll(part_id); 1048 break; 1049 default: 1050 panic("Invalid type for IMMU demap\n"); 1051 } 1052 break; |
1053 case ASI_DMMU: 1054 switch (va) { 1055 case 0x30: 1056 tc->setMiscRegWithEffect(MISCREG_MMU_DTLB_TAG_ACCESS, data); 1057 break; 1058 case 0x80: 1059 tc->setMiscRegWithEffect(MISCREG_MMU_PART_ID, data); 1060 break; 1061 default: 1062 goto doMmuWriteError; 1063 } 1064 break; |
1065 case ASI_DMMU_DEMAP: 1066 ignore = false; 1067 ctx_id = -1; 1068 part_id = tc->readMiscRegWithEffect(MISCREG_MMU_PART_ID); 1069 switch (bits(va,5,4)) { 1070 case 0: 1071 ctx_id = tc->readMiscRegWithEffect(MISCREG_MMU_P_CONTEXT); 1072 break; 1073 case 1: 1074 ctx_id = tc->readMiscRegWithEffect(MISCREG_MMU_S_CONTEXT); 1075 break; 1076 case 3: 1077 ctx_id = 0; 1078 break; 1079 default: 1080 ignore = true; 1081 } 1082 1083 switch(bits(va,7,6)) { 1084 case 0: // demap page 1085 if (!ignore) 1086 demapPage(mbits(va,63,13), part_id, bits(va,9,9), ctx_id); 1087 break; 1088 case 1: //demap context 1089 if (!ignore) 1090 demapContext(part_id, ctx_id); 1091 break; 1092 case 2: 1093 demapAll(part_id); 1094 break; 1095 default: 1096 panic("Invalid type for IMMU demap\n"); 1097 } 1098 break; |
1099 default: 1100doMmuWriteError: 1101 panic("need to impl DTB::doMmuRegWrite() got asi=%#x, va=%#x d=%#x\n", 1102 (uint32_t)pkt->req->getAsi(), pkt->getAddr(), data); 1103 } 1104 pkt->result = Packet::Success; 1105 return tc->getCpuPtr()->cycles(1); 1106} --- 56 unchanged lines hidden --- |