tlb.cc (8607:5fb918115c07) | tlb.cc (8696:642f83fafffb) |
---|---|
1/* 2 * Copyright (c) 2001-2005 The Regents of The University of Michigan 3 * Copyright (c) 2007 MIPS Technologies, Inc. 4 * All rights reserved. 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions are 8 * met: redistributions of source code must retain the above copyright --- 15 unchanged lines hidden (view full) --- 24 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 25 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 26 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 27 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28 * 29 * Authors: Nathan Binkert 30 * Steve Reinhardt 31 * Jaidev Patwardhan | 1/* 2 * Copyright (c) 2001-2005 The Regents of The University of Michigan 3 * Copyright (c) 2007 MIPS Technologies, Inc. 4 * All rights reserved. 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions are 8 * met: redistributions of source code must retain the above copyright --- 15 unchanged lines hidden (view full) --- 24 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 25 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 26 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 27 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28 * 29 * Authors: Nathan Binkert 30 * Steve Reinhardt 31 * Jaidev Patwardhan |
32 * Zhengxing Li 33 * Deyuan Guo |
|
32 */ 33 34#include <string> 35#include <vector> 36 37#include "arch/mips/faults.hh" 38#include "arch/mips/pagetable.hh" 39#include "arch/mips/pra_constants.hh" --- 305 unchanged lines hidden (view full) --- 345 EvenOdd = 0; 346 } else { 347 // Check odd bits 348 Valid = pte->V1; 349 EvenOdd = 1; 350 } 351 352 if (Valid == false) { | 34 */ 35 36#include <string> 37#include <vector> 38 39#include "arch/mips/faults.hh" 40#include "arch/mips/pagetable.hh" 41#include "arch/mips/pra_constants.hh" --- 305 unchanged lines hidden (view full) --- 347 EvenOdd = 0; 348 } else { 349 // Check odd bits 350 Valid = pte->V1; 351 EvenOdd = 1; 352 } 353 354 if (Valid == false) { |
353 return new InvalidFault(Asid, vaddr, vpn, false); | 355 return new TlbInvalidFault(Asid, vaddr, VPN, false); |
354 } else { 355 // Ok, this is really a match, set paddr 356 Addr PAddr; 357 if (EvenOdd == 0) { 358 PAddr = pte->PFN0; 359 } else { 360 PAddr = pte->PFN1; 361 } 362 PAddr >>= (pte->AddrShiftAmount - 12); 363 PAddr <<= pte->AddrShiftAmount; 364 PAddr |= (vaddr & pte->OffsetMask); 365 req->setPaddr(PAddr); 366 } 367 } else { 368 // Didn't find any match, return a TLB Refill Exception | 356 } else { 357 // Ok, this is really a match, set paddr 358 Addr PAddr; 359 if (EvenOdd == 0) { 360 PAddr = pte->PFN0; 361 } else { 362 PAddr = pte->PFN1; 363 } 364 PAddr >>= (pte->AddrShiftAmount - 12); 365 PAddr <<= pte->AddrShiftAmount; 366 PAddr |= (vaddr & pte->OffsetMask); 367 req->setPaddr(PAddr); 368 } 369 } else { 370 // Didn't find any match, return a TLB Refill Exception |
369 return new RefillFault(Asid, vaddr, vpn, false); | 371 return new TlbRefillFault(Asid, vaddr, VPN, false); |
370 } 371 } 372 return checkCacheability(req); 373#endif 374} 375 376Fault 377TLB::translateData(RequestPtr req, ThreadContext *tc, bool write) --- 62 unchanged lines hidden (view full) --- 440 } else { 441 // Check odd bits 442 Valid = pte->V1; 443 Dirty = pte->D1; 444 EvenOdd = 1; 445 } 446 447 if (Valid == false) { | 372 } 373 } 374 return checkCacheability(req); 375#endif 376} 377 378Fault 379TLB::translateData(RequestPtr req, ThreadContext *tc, bool write) --- 62 unchanged lines hidden (view full) --- 442 } else { 443 // Check odd bits 444 Valid = pte->V1; 445 Dirty = pte->D1; 446 EvenOdd = 1; 447 } 448 449 if (Valid == false) { |
448 return new InvalidFault(Asid, vaddr, VPN, true); | 450 return new TlbInvalidFault(Asid, vaddr, VPN, write); |
449 } else { 450 // Ok, this is really a match, set paddr | 451 } else { 452 // Ok, this is really a match, set paddr |
451 if (!Dirty) { | 453 if (!Dirty && write) { |
452 return new TlbModifiedFault(Asid, vaddr, VPN); 453 } 454 Addr PAddr; 455 if (EvenOdd == 0) { 456 PAddr = pte->PFN0; 457 } else { 458 PAddr = pte->PFN1; 459 } 460 PAddr >>= (pte->AddrShiftAmount - 12); 461 PAddr <<= pte->AddrShiftAmount; 462 PAddr |= (vaddr & pte->OffsetMask); 463 req->setPaddr(PAddr); 464 } 465 } else { 466 // Didn't find any match, return a TLB Refill Exception | 454 return new TlbModifiedFault(Asid, vaddr, VPN); 455 } 456 Addr PAddr; 457 if (EvenOdd == 0) { 458 PAddr = pte->PFN0; 459 } else { 460 PAddr = pte->PFN1; 461 } 462 PAddr >>= (pte->AddrShiftAmount - 12); 463 PAddr <<= pte->AddrShiftAmount; 464 PAddr |= (vaddr & pte->OffsetMask); 465 req->setPaddr(PAddr); 466 } 467 } else { 468 // Didn't find any match, return a TLB Refill Exception |
467 return new RefillFault(Asid, vaddr, VPN, true); | 469 return new TlbRefillFault(Asid, vaddr, VPN, write); |
468 } 469 } 470 return checkCacheability(req); 471#endif 472} 473 474Fault 475TLB::translateAtomic(RequestPtr req, ThreadContext *tc, Mode mode) --- 32 unchanged lines hidden --- | 470 } 471 } 472 return checkCacheability(req); 473#endif 474} 475 476Fault 477TLB::translateAtomic(RequestPtr req, ThreadContext *tc, Mode mode) --- 32 unchanged lines hidden --- |