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 --- |