tlb.cc (8232:b28d06a175be) | tlb.cc (8567:d154cd83c353) |
---|---|
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 --- 299 unchanged lines hidden (view full) --- 308 309 bool misaligned = (req->getSize() - 1) & vaddr; 310 311 if (IsKSeg0(vaddr)) { 312 // Address will not be translated through TLB, set response, and go! 313 req->setPaddr(KSeg02Phys(vaddr)); 314 if (getOperatingMode(tc->readMiscReg(MISCREG_STATUS)) != mode_kernel || 315 misaligned) { | 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 --- 299 unchanged lines hidden (view full) --- 308 309 bool misaligned = (req->getSize() - 1) & vaddr; 310 311 if (IsKSeg0(vaddr)) { 312 // Address will not be translated through TLB, set response, and go! 313 req->setPaddr(KSeg02Phys(vaddr)); 314 if (getOperatingMode(tc->readMiscReg(MISCREG_STATUS)) != mode_kernel || 315 misaligned) { |
316 AddressErrorFault *Flt = new AddressErrorFault(); 317 /* BadVAddr must be set */ 318 Flt->badVAddr = vaddr; 319 return Flt; | 316 return new AddressErrorFault(vaddr); |
320 } 321 } else if(IsKSeg1(vaddr)) { 322 // Address will not be translated through TLB, set response, and go! 323 req->setPaddr(KSeg02Phys(vaddr)); 324 } else { 325 /* 326 * This is an optimization - smallPages is updated every time a TLB 327 * operation is performed. That way, we don't need to look at 328 * Config3 _ SP and PageGrain _ ESP every time we do a TLB lookup 329 */ 330 Addr VPN; 331 if (smallPages == 1) { 332 VPN = (vaddr >> 11); 333 } else { 334 VPN = ((vaddr >> 11) & 0xFFFFFFFC); 335 } 336 uint8_t Asid = req->getAsid(); 337 if (misaligned) { 338 // Unaligned address! | 317 } 318 } else if(IsKSeg1(vaddr)) { 319 // Address will not be translated through TLB, set response, and go! 320 req->setPaddr(KSeg02Phys(vaddr)); 321 } else { 322 /* 323 * This is an optimization - smallPages is updated every time a TLB 324 * operation is performed. That way, we don't need to look at 325 * Config3 _ SP and PageGrain _ ESP every time we do a TLB lookup 326 */ 327 Addr VPN; 328 if (smallPages == 1) { 329 VPN = (vaddr >> 11); 330 } else { 331 VPN = ((vaddr >> 11) & 0xFFFFFFFC); 332 } 333 uint8_t Asid = req->getAsid(); 334 if (misaligned) { 335 // Unaligned address! |
339 AddressErrorFault *Flt = new AddressErrorFault(); 340 /* BadVAddr must be set */ 341 Flt->badVAddr = vaddr; 342 return Flt; | 336 return new AddressErrorFault(vaddr); |
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; 350 if ((((vaddr) >> pte->AddrShiftAmount) & 1) == 0) { 351 // Check even bits 352 Valid = pte->V0; 353 EvenOdd = 0; 354 } else { 355 // Check odd bits 356 Valid = pte->V1; 357 EvenOdd = 1; 358 } 359 360 if (Valid == false) { | 337 } 338 PTE *pte = lookup(VPN,Asid); 339 if (pte != NULL) { 340 // Ok, found something 341 /* Check for valid bits */ 342 int EvenOdd; 343 bool Valid; 344 if ((((vaddr) >> pte->AddrShiftAmount) & 1) == 0) { 345 // Check even bits 346 Valid = pte->V0; 347 EvenOdd = 0; 348 } else { 349 // Check odd bits 350 Valid = pte->V1; 351 EvenOdd = 1; 352 } 353 354 if (Valid == false) { |
361 //Invalid entry 362 ItbInvalidFault *Flt = new ItbInvalidFault(); 363 /* EntryHi VPN, ASID fields must be set */ 364 Flt->entryHiAsid = Asid; 365 Flt->entryHiVPN2 = (VPN >> 2); 366 Flt->entryHiVPN2X = (VPN & 0x3); 367 368 /* BadVAddr must be set */ 369 Flt->badVAddr = vaddr; 370 371 /* Context must be set */ 372 Flt->contextBadVPN2 = (VPN >> 2); 373 return Flt; | 355 return new ItbInvalidFault(Asid, vaddr, vpn); |
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 |= (vaddr & pte->OffsetMask); 385 req->setPaddr(PAddr); 386 } 387 } else { 388 // 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 |
389 ItbRefillFault *Flt = new ItbRefillFault(); 390 /* EntryHi VPN, ASID fields must be set */ 391 Flt->entryHiAsid = Asid; 392 Flt->entryHiVPN2 = (VPN >> 2); 393 Flt->entryHiVPN2X = (VPN & 0x3); 394 395 /* BadVAddr must be set */ 396 Flt->badVAddr = vaddr; 397 398 /* Context must be set */ 399 Flt->contextBadVPN2 = (VPN >> 2); 400 return Flt; | 371 return new ItbRefillFault(Asid, vaddr, vpn); |
401 } 402 } 403 return checkCacheability(req); 404#endif 405} 406 407Fault 408TLB::translateData(RequestPtr req, ThreadContext *tc, bool write) --- 23 unchanged lines hidden (view full) --- 432 433 bool misaligned = (req->getSize() - 1) & vaddr; 434 435 if (IsKSeg0(vaddr)) { 436 // Address will not be translated through TLB, set response, and go! 437 req->setPaddr(KSeg02Phys(vaddr)); 438 if (getOperatingMode(tc->readMiscReg(MISCREG_STATUS)) != mode_kernel || 439 misaligned) { | 372 } 373 } 374 return checkCacheability(req); 375#endif 376} 377 378Fault 379TLB::translateData(RequestPtr req, ThreadContext *tc, bool write) --- 23 unchanged lines hidden (view full) --- 403 404 bool misaligned = (req->getSize() - 1) & vaddr; 405 406 if (IsKSeg0(vaddr)) { 407 // Address will not be translated through TLB, set response, and go! 408 req->setPaddr(KSeg02Phys(vaddr)); 409 if (getOperatingMode(tc->readMiscReg(MISCREG_STATUS)) != mode_kernel || 410 misaligned) { |
440 StoreAddressErrorFault *Flt = new StoreAddressErrorFault(); 441 /* BadVAddr must be set */ 442 Flt->badVAddr = vaddr; 443 444 return Flt; | 411 return new StoreAddressErrorFault(vaddr); |
445 } 446 } else if(IsKSeg1(vaddr)) { 447 // Address will not be translated through TLB, set response, and go! 448 req->setPaddr(KSeg02Phys(vaddr)); 449 } else { 450 /* 451 * This is an optimization - smallPages is updated every time a TLB 452 * operation is performed. That way, we don't need to look at 453 * Config3 _ SP and PageGrain _ ESP every time we do a TLB lookup 454 */ 455 Addr VPN = (vaddr >> 11) & 0xFFFFFFFC; 456 if (smallPages == 1) { 457 VPN = vaddr >> 11; 458 } 459 uint8_t Asid = req->getAsid(); 460 PTE *pte = lookup(VPN, Asid); 461 if (misaligned) { | 412 } 413 } else if(IsKSeg1(vaddr)) { 414 // Address will not be translated through TLB, set response, and go! 415 req->setPaddr(KSeg02Phys(vaddr)); 416 } else { 417 /* 418 * This is an optimization - smallPages is updated every time a TLB 419 * operation is performed. That way, we don't need to look at 420 * Config3 _ SP and PageGrain _ ESP every time we do a TLB lookup 421 */ 422 Addr VPN = (vaddr >> 11) & 0xFFFFFFFC; 423 if (smallPages == 1) { 424 VPN = vaddr >> 11; 425 } 426 uint8_t Asid = req->getAsid(); 427 PTE *pte = lookup(VPN, Asid); 428 if (misaligned) { |
462 // Unaligned address! 463 StoreAddressErrorFault *Flt = new StoreAddressErrorFault(); 464 /* BadVAddr must be set */ 465 Flt->badVAddr = vaddr; 466 return Flt; | 429 return new StoreAddressErrorFault(vaddr); |
467 } 468 if (pte != NULL) { 469 // Ok, found something 470 /* Check for valid bits */ 471 int EvenOdd; 472 bool Valid; 473 bool Dirty; 474 if ((((vaddr >> pte->AddrShiftAmount) & 1)) == 0) { --- 4 unchanged lines hidden (view full) --- 479 } else { 480 // Check odd bits 481 Valid = pte->V1; 482 Dirty = pte->D1; 483 EvenOdd = 1; 484 } 485 486 if (Valid == false) { | 430 } 431 if (pte != NULL) { 432 // Ok, found something 433 /* Check for valid bits */ 434 int EvenOdd; 435 bool Valid; 436 bool Dirty; 437 if ((((vaddr >> pte->AddrShiftAmount) & 1)) == 0) { --- 4 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) { |
487 //Invalid entry 488 DtbInvalidFault *Flt = new DtbInvalidFault(); 489 /* EntryHi VPN, ASID fields must be set */ 490 Flt->entryHiAsid = Asid; 491 Flt->entryHiVPN2 = (VPN>>2); 492 Flt->entryHiVPN2X = (VPN & 0x3); 493 494 /* BadVAddr must be set */ 495 Flt->badVAddr = vaddr; 496 497 /* Context must be set */ 498 Flt->contextBadVPN2 = (VPN >> 2); 499 500 return Flt; | 450 return new DtbInvalidFault(Asid, vaddr, VPN); |
501 } else { 502 // Ok, this is really a match, set paddr 503 if (!Dirty) { | 451 } else { 452 // Ok, this is really a match, set paddr 453 if (!Dirty) { |
504 TLBModifiedFault *Flt = new TLBModifiedFault(); 505 /* EntryHi VPN, ASID fields must be set */ 506 Flt->entryHiAsid = Asid; 507 Flt->entryHiVPN2 = (VPN >> 2); 508 Flt->entryHiVPN2X = (VPN & 0x3); 509 510 /* BadVAddr must be set */ 511 Flt->badVAddr = vaddr; 512 513 /* Context must be set */ 514 Flt->contextBadVPN2 = (VPN >> 2); 515 return Flt; | 454 return new TLBModifiedFault(Asid, vaddr, VPN); |
516 } 517 Addr PAddr; 518 if (EvenOdd == 0) { 519 PAddr = pte->PFN0; 520 } else { 521 PAddr = pte->PFN1; 522 } 523 PAddr >>= (pte->AddrShiftAmount - 12); 524 PAddr <<= pte->AddrShiftAmount; 525 PAddr |= (vaddr & pte->OffsetMask); 526 req->setPaddr(PAddr); 527 } 528 } else { 529 // Didn't find any match, return a TLB Refill Exception | 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 |
530 DtbRefillFault *Flt = new DtbRefillFault(); 531 /* EntryHi VPN, ASID fields must be set */ 532 Flt->entryHiAsid = Asid; 533 Flt->entryHiVPN2 = (VPN >> 2); 534 Flt->entryHiVPN2X = (VPN & 0x3); 535 536 /* BadVAddr must be set */ 537 Flt->badVAddr = vaddr; 538 539 /* Context must be set */ 540 Flt->contextBadVPN2 = (VPN >> 2); 541 return Flt; | 469 return new DtbRefillFault(Asid, vaddr, VPN); |
542 } 543 } 544 return checkCacheability(req); 545#endif 546} 547 548Fault 549TLB::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 --- |