tlb.cc (6378:4a2ff62c3b4f) tlb.cc (6379:75d4aaf7dd54)
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

--- 301 unchanged lines hidden (view full) ---

310#else
311 if (IsKSeg0(req->getVaddr())) {
312 // Address will not be translated through TLB, set response, and go!
313 req->setPaddr(KSeg02Phys(req->getVaddr()));
314 if (getOperatingMode(tc->readMiscReg(Status)) != mode_kernel ||
315 req->isMisaligned()) {
316 AddressErrorFault *Flt = new AddressErrorFault();
317 /* BadVAddr must be set */
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

--- 301 unchanged lines hidden (view full) ---

310#else
311 if (IsKSeg0(req->getVaddr())) {
312 // Address will not be translated through TLB, set response, and go!
313 req->setPaddr(KSeg02Phys(req->getVaddr()));
314 if (getOperatingMode(tc->readMiscReg(Status)) != mode_kernel ||
315 req->isMisaligned()) {
316 AddressErrorFault *Flt = new AddressErrorFault();
317 /* BadVAddr must be set */
318 Flt->BadVAddr = req->getVaddr();
318 Flt->badVAddr = req->getVaddr();
319 return Flt;
320 }
321 } else if(IsKSeg1(req->getVaddr())) {
322 // Address will not be translated through TLB, set response, and go!
323 req->setPaddr(KSeg02Phys(req->getVaddr()));
324 } else {
325 /*
326 * This is an optimization - smallPages is updated every time a TLB

--- 6 unchanged lines hidden (view full) ---

333 } else {
334 VPN = ((req->getVaddr() >> 11) & 0xFFFFFFFC);
335 }
336 uint8_t Asid = req->getAsid();
337 if (req->isMisaligned()) {
338 // Unaligned address!
339 AddressErrorFault *Flt = new AddressErrorFault();
340 /* BadVAddr must be set */
319 return Flt;
320 }
321 } else if(IsKSeg1(req->getVaddr())) {
322 // Address will not be translated through TLB, set response, and go!
323 req->setPaddr(KSeg02Phys(req->getVaddr()));
324 } else {
325 /*
326 * This is an optimization - smallPages is updated every time a TLB

--- 6 unchanged lines hidden (view full) ---

333 } else {
334 VPN = ((req->getVaddr() >> 11) & 0xFFFFFFFC);
335 }
336 uint8_t Asid = req->getAsid();
337 if (req->isMisaligned()) {
338 // Unaligned address!
339 AddressErrorFault *Flt = new AddressErrorFault();
340 /* BadVAddr must be set */
341 Flt->BadVAddr = req->getVaddr();
341 Flt->badVAddr = req->getVaddr();
342 return Flt;
343 }
344 PTE *pte = lookup(VPN,Asid);
345 if (pte != NULL) {
346 // Ok, found something
347 /* Check for valid bits */
348 int EvenOdd;
349 bool Valid;

--- 6 unchanged lines hidden (view full) ---

356 Valid = pte->V1;
357 EvenOdd = 1;
358 }
359
360 if (Valid == false) {
361 //Invalid entry
362 ItbInvalidFault *Flt = new ItbInvalidFault();
363 /* EntryHi VPN, ASID fields must be set */
342 return Flt;
343 }
344 PTE *pte = lookup(VPN,Asid);
345 if (pte != NULL) {
346 // Ok, found something
347 /* Check for valid bits */
348 int EvenOdd;
349 bool Valid;

--- 6 unchanged lines hidden (view full) ---

356 Valid = pte->V1;
357 EvenOdd = 1;
358 }
359
360 if (Valid == false) {
361 //Invalid entry
362 ItbInvalidFault *Flt = new ItbInvalidFault();
363 /* EntryHi VPN, ASID fields must be set */
364 Flt->EntryHi_Asid = Asid;
365 Flt->EntryHi_VPN2 = (VPN >> 2);
366 Flt->EntryHi_VPN2X = (VPN & 0x3);
364 Flt->entryHiAsid = Asid;
365 Flt->entryHiVPN2 = (VPN >> 2);
366 Flt->entryHiVPN2X = (VPN & 0x3);
367
368 /* BadVAddr must be set */
367
368 /* BadVAddr must be set */
369 Flt->BadVAddr = req->getVaddr();
369 Flt->badVAddr = req->getVaddr();
370
371 /* Context must be set */
370
371 /* Context must be set */
372 Flt->Context_BadVPN2 = (VPN >> 2);
372 Flt->contextBadVPN2 = (VPN >> 2);
373 return Flt;
374 } else {
375 // Ok, this is really a match, set paddr
376 Addr PAddr;
377 if (EvenOdd == 0) {
378 PAddr = pte->PFN0;
379 } else {
380 PAddr = pte->PFN1;
381 }
382 PAddr >>= (pte->AddrShiftAmount - 12);
383 PAddr <<= pte->AddrShiftAmount;
384 PAddr |= ((req->getVaddr()) & pte->OffsetMask);
385 req->setPaddr(PAddr);
386 }
387 } else {
388 // Didn't find any match, return a TLB Refill Exception
389 ItbRefillFault *Flt=new ItbRefillFault();
390 /* EntryHi VPN, ASID fields must be set */
373 return Flt;
374 } else {
375 // Ok, this is really a match, set paddr
376 Addr PAddr;
377 if (EvenOdd == 0) {
378 PAddr = pte->PFN0;
379 } else {
380 PAddr = pte->PFN1;
381 }
382 PAddr >>= (pte->AddrShiftAmount - 12);
383 PAddr <<= pte->AddrShiftAmount;
384 PAddr |= ((req->getVaddr()) & pte->OffsetMask);
385 req->setPaddr(PAddr);
386 }
387 } else {
388 // Didn't find any match, return a TLB Refill Exception
389 ItbRefillFault *Flt=new ItbRefillFault();
390 /* EntryHi VPN, ASID fields must be set */
391 Flt->EntryHi_Asid = Asid;
392 Flt->EntryHi_VPN2 = (VPN >> 2);
393 Flt->EntryHi_VPN2X = (VPN & 0x3);
391 Flt->entryHiAsid = Asid;
392 Flt->entryHiVPN2 = (VPN >> 2);
393 Flt->entryHiVPN2X = (VPN & 0x3);
394
395 /* BadVAddr must be set */
394
395 /* BadVAddr must be set */
396 Flt->BadVAddr = req->getVaddr();
396 Flt->badVAddr = req->getVaddr();
397
398 /* Context must be set */
397
398 /* Context must be set */
399 Flt->Context_BadVPN2 = (VPN >> 2);
399 Flt->contextBadVPN2 = (VPN >> 2);
400 return Flt;
401 }
402 }
403 return checkCacheability(req);
404#endif
405}
406
407Fault

--- 22 unchanged lines hidden (view full) ---

430#else
431 if (IsKSeg0(req->getVaddr())) {
432 // Address will not be translated through TLB, set response, and go!
433 req->setPaddr(KSeg02Phys(req->getVaddr()));
434 if (getOperatingMode(tc->readMiscReg(Status)) != mode_kernel ||
435 req->isMisaligned()) {
436 StoreAddressErrorFault *Flt = new StoreAddressErrorFault();
437 /* BadVAddr must be set */
400 return Flt;
401 }
402 }
403 return checkCacheability(req);
404#endif
405}
406
407Fault

--- 22 unchanged lines hidden (view full) ---

430#else
431 if (IsKSeg0(req->getVaddr())) {
432 // Address will not be translated through TLB, set response, and go!
433 req->setPaddr(KSeg02Phys(req->getVaddr()));
434 if (getOperatingMode(tc->readMiscReg(Status)) != mode_kernel ||
435 req->isMisaligned()) {
436 StoreAddressErrorFault *Flt = new StoreAddressErrorFault();
437 /* BadVAddr must be set */
438 Flt->BadVAddr = req->getVaddr();
438 Flt->badVAddr = req->getVaddr();
439
440 return Flt;
441 }
442 } else if(IsKSeg1(req->getVaddr())) {
443 // Address will not be translated through TLB, set response, and go!
444 req->setPaddr(KSeg02Phys(req->getVaddr()));
445 } else {
446 /*

--- 6 unchanged lines hidden (view full) ---

453 VPN = ((req->getVaddr() >> 11));
454 }
455 uint8_t Asid = req->getAsid();
456 PTE *pte = lookup(VPN, Asid);
457 if (req->isMisaligned()) {
458 // Unaligned address!
459 StoreAddressErrorFault *Flt = new StoreAddressErrorFault();
460 /* BadVAddr must be set */
439
440 return Flt;
441 }
442 } else if(IsKSeg1(req->getVaddr())) {
443 // Address will not be translated through TLB, set response, and go!
444 req->setPaddr(KSeg02Phys(req->getVaddr()));
445 } else {
446 /*

--- 6 unchanged lines hidden (view full) ---

453 VPN = ((req->getVaddr() >> 11));
454 }
455 uint8_t Asid = req->getAsid();
456 PTE *pte = lookup(VPN, Asid);
457 if (req->isMisaligned()) {
458 // Unaligned address!
459 StoreAddressErrorFault *Flt = new StoreAddressErrorFault();
460 /* BadVAddr must be set */
461 Flt->BadVAddr = req->getVaddr();
461 Flt->badVAddr = req->getVaddr();
462 return Flt;
463 }
464 if (pte != NULL) {
465 // Ok, found something
466 /* Check for valid bits */
467 int EvenOdd;
468 bool Valid;
469 bool Dirty;

--- 8 unchanged lines hidden (view full) ---

478 Dirty = pte->D1;
479 EvenOdd = 1;
480 }
481
482 if (Valid == false) {
483 //Invalid entry
484 DtbInvalidFault *Flt = new DtbInvalidFault();
485 /* EntryHi VPN, ASID fields must be set */
462 return Flt;
463 }
464 if (pte != NULL) {
465 // Ok, found something
466 /* Check for valid bits */
467 int EvenOdd;
468 bool Valid;
469 bool Dirty;

--- 8 unchanged lines hidden (view full) ---

478 Dirty = pte->D1;
479 EvenOdd = 1;
480 }
481
482 if (Valid == false) {
483 //Invalid entry
484 DtbInvalidFault *Flt = new DtbInvalidFault();
485 /* EntryHi VPN, ASID fields must be set */
486 Flt->EntryHi_Asid = Asid;
487 Flt->EntryHi_VPN2 = (VPN>>2);
488 Flt->EntryHi_VPN2X = (VPN & 0x3);
486 Flt->entryHiAsid = Asid;
487 Flt->entryHiVPN2 = (VPN>>2);
488 Flt->entryHiVPN2X = (VPN & 0x3);
489
490 /* BadVAddr must be set */
489
490 /* BadVAddr must be set */
491 Flt->BadVAddr = req->getVaddr();
491 Flt->badVAddr = req->getVaddr();
492
493 /* Context must be set */
492
493 /* Context must be set */
494 Flt->Context_BadVPN2 = (VPN >> 2);
494 Flt->contextBadVPN2 = (VPN >> 2);
495
496 return Flt;
497 } else {
498 // Ok, this is really a match, set paddr
499 if (!Dirty) {
500 TLBModifiedFault *Flt = new TLBModifiedFault();
501 /* EntryHi VPN, ASID fields must be set */
495
496 return Flt;
497 } else {
498 // Ok, this is really a match, set paddr
499 if (!Dirty) {
500 TLBModifiedFault *Flt = new TLBModifiedFault();
501 /* EntryHi VPN, ASID fields must be set */
502 Flt->EntryHi_Asid = Asid;
503 Flt->EntryHi_VPN2 = (VPN >> 2);
504 Flt->EntryHi_VPN2X = (VPN & 0x3);
502 Flt->entryHiAsid = Asid;
503 Flt->entryHiVPN2 = (VPN >> 2);
504 Flt->entryHiVPN2X = (VPN & 0x3);
505
506 /* BadVAddr must be set */
505
506 /* BadVAddr must be set */
507 Flt->BadVAddr = req->getVaddr();
507 Flt->badVAddr = req->getVaddr();
508
509 /* Context must be set */
508
509 /* Context must be set */
510 Flt->Context_BadVPN2 = (VPN >> 2);
510 Flt->contextBadVPN2 = (VPN >> 2);
511 return Flt;
512 }
513 Addr PAddr;
514 if (EvenOdd == 0) {
515 PAddr = pte->PFN0;
516 } else {
517 PAddr = pte->PFN1;
518 }
519 PAddr >>= (pte->AddrShiftAmount - 12);
520 PAddr <<= pte->AddrShiftAmount;
521 PAddr |= ((req->getVaddr()) & pte->OffsetMask);
522 req->setPaddr(PAddr);
523 }
524 } else {
525 // Didn't find any match, return a TLB Refill Exception
526 DtbRefillFault *Flt = new DtbRefillFault();
527 /* EntryHi VPN, ASID fields must be set */
511 return Flt;
512 }
513 Addr PAddr;
514 if (EvenOdd == 0) {
515 PAddr = pte->PFN0;
516 } else {
517 PAddr = pte->PFN1;
518 }
519 PAddr >>= (pte->AddrShiftAmount - 12);
520 PAddr <<= pte->AddrShiftAmount;
521 PAddr |= ((req->getVaddr()) & pte->OffsetMask);
522 req->setPaddr(PAddr);
523 }
524 } else {
525 // Didn't find any match, return a TLB Refill Exception
526 DtbRefillFault *Flt = new DtbRefillFault();
527 /* EntryHi VPN, ASID fields must be set */
528 Flt->EntryHi_Asid = Asid;
529 Flt->EntryHi_VPN2 = (VPN >> 2);
530 Flt->EntryHi_VPN2X = (VPN & 0x3);
528 Flt->entryHiAsid = Asid;
529 Flt->entryHiVPN2 = (VPN >> 2);
530 Flt->entryHiVPN2X = (VPN & 0x3);
531
532 /* BadVAddr must be set */
531
532 /* BadVAddr must be set */
533 Flt->BadVAddr = req->getVaddr();
533 Flt->badVAddr = req->getVaddr();
534
535 /* Context must be set */
534
535 /* Context must be set */
536 Flt->Context_BadVPN2 = (VPN >> 2);
536 Flt->contextBadVPN2 = (VPN >> 2);
537 return Flt;
538 }
539 }
540 return checkCacheability(req);
541#endif
542}
543
544Fault

--- 33 unchanged lines hidden ---
537 return Flt;
538 }
539 }
540 return checkCacheability(req);
541#endif
542}
543
544Fault

--- 33 unchanged lines hidden ---