tlb.cc (2665:a124942bacb8) | tlb.cc (2680:246e7104f744) |
---|---|
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; --- 24 unchanged lines hidden (view full) --- 33#include <string> 34#include <vector> 35 36#include "arch/alpha/tlb.hh" 37#include "base/inifile.hh" 38#include "base/str.hh" 39#include "base/trace.hh" 40#include "config/alpha_tlaser.hh" | 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; --- 24 unchanged lines hidden (view full) --- 33#include <string> 34#include <vector> 35 36#include "arch/alpha/tlb.hh" 37#include "base/inifile.hh" 38#include "base/str.hh" 39#include "base/trace.hh" 40#include "config/alpha_tlaser.hh" |
41#include "cpu/exec_context.hh" | 41#include "cpu/thread_context.hh" |
42#include "sim/builder.hh" 43 44using namespace std; 45using namespace EV5; 46 47/////////////////////////////////////////////////////////////////////// 48// 49// Alpha TLB --- 231 unchanged lines hidden (view full) --- 281 .name(name() + ".accesses") 282 .desc("ITB accesses"); 283 284 accesses = hits + misses; 285} 286 287 288Fault | 42#include "sim/builder.hh" 43 44using namespace std; 45using namespace EV5; 46 47/////////////////////////////////////////////////////////////////////// 48// 49// Alpha TLB --- 231 unchanged lines hidden (view full) --- 281 .name(name() + ".accesses") 282 .desc("ITB accesses"); 283 284 accesses = hits + misses; 285} 286 287 288Fault |
289AlphaITB::translate(RequestPtr &req, ExecContext *xc) const | 289AlphaITB::translate(RequestPtr &req, ThreadContext *tc) const |
290{ 291 if (AlphaISA::PcPAL(req->getVaddr())) { 292 // strip off PAL PC marker (lsb is 1) 293 req->setPaddr((req->getVaddr() & ~3) & PAddrImplMask); 294 hits++; 295 return NoFault; 296 } 297 --- 5 unchanged lines hidden (view full) --- 303 acv++; 304 return new ItbAcvFault(req->getVaddr()); 305 } 306 307 308 // VA<42:41> == 2, VA<39:13> maps directly to PA<39:13> for EV5 309 // VA<47:41> == 0x7e, VA<40:13> maps directly to PA<40:13> for EV6 310#if ALPHA_TLASER | 290{ 291 if (AlphaISA::PcPAL(req->getVaddr())) { 292 // strip off PAL PC marker (lsb is 1) 293 req->setPaddr((req->getVaddr() & ~3) & PAddrImplMask); 294 hits++; 295 return NoFault; 296 } 297 --- 5 unchanged lines hidden (view full) --- 303 acv++; 304 return new ItbAcvFault(req->getVaddr()); 305 } 306 307 308 // VA<42:41> == 2, VA<39:13> maps directly to PA<39:13> for EV5 309 // VA<47:41> == 0x7e, VA<40:13> maps directly to PA<40:13> for EV6 310#if ALPHA_TLASER |
311 if ((MCSR_SP(xc->readMiscReg(AlphaISA::IPR_MCSR)) & 2) && | 311 if ((MCSR_SP(tc->readMiscReg(AlphaISA::IPR_MCSR)) & 2) && |
312 VAddrSpaceEV5(req->getVaddr()) == 2) { 313#else 314 if (VAddrSpaceEV6(req->getVaddr()) == 0x7e) { 315#endif 316 // only valid in kernel mode | 312 VAddrSpaceEV5(req->getVaddr()) == 2) { 313#else 314 if (VAddrSpaceEV6(req->getVaddr()) == 0x7e) { 315#endif 316 // only valid in kernel mode |
317 if (ICM_CM(xc->readMiscReg(AlphaISA::IPR_ICM)) != | 317 if (ICM_CM(tc->readMiscReg(AlphaISA::IPR_ICM)) != |
318 AlphaISA::mode_kernel) { 319 acv++; 320 return new ItbAcvFault(req->getVaddr()); 321 } 322 323 req->setPaddr(req->getVaddr() & PAddrImplMask); 324 325#if !ALPHA_TLASER 326 // sign extend the physical address properly 327 if (req->getPaddr() & PAddrUncachedBit40) 328 req->setPaddr(req->getPaddr() | ULL(0xf0000000000)); 329 else 330 req->setPaddr(req->getPaddr() & ULL(0xffffffffff)); 331#endif 332 333 } else { 334 // not a physical address: need to look up pte | 318 AlphaISA::mode_kernel) { 319 acv++; 320 return new ItbAcvFault(req->getVaddr()); 321 } 322 323 req->setPaddr(req->getVaddr() & PAddrImplMask); 324 325#if !ALPHA_TLASER 326 // sign extend the physical address properly 327 if (req->getPaddr() & PAddrUncachedBit40) 328 req->setPaddr(req->getPaddr() | ULL(0xf0000000000)); 329 else 330 req->setPaddr(req->getPaddr() & ULL(0xffffffffff)); 331#endif 332 333 } else { 334 // not a physical address: need to look up pte |
335 int asn = DTB_ASN_ASN(xc->readMiscReg(AlphaISA::IPR_DTB_ASN)); | 335 int asn = DTB_ASN_ASN(tc->readMiscReg(AlphaISA::IPR_DTB_ASN)); |
336 AlphaISA::PTE *pte = lookup(AlphaISA::VAddr(req->getVaddr()).vpn(), 337 asn); 338 339 if (!pte) { 340 misses++; 341 return new ItbPageFault(req->getVaddr()); 342 } 343 344 req->setPaddr((pte->ppn << AlphaISA::PageShift) + 345 (AlphaISA::VAddr(req->getVaddr()).offset() 346 & ~3)); 347 348 // check permissions for this access 349 if (!(pte->xre & | 336 AlphaISA::PTE *pte = lookup(AlphaISA::VAddr(req->getVaddr()).vpn(), 337 asn); 338 339 if (!pte) { 340 misses++; 341 return new ItbPageFault(req->getVaddr()); 342 } 343 344 req->setPaddr((pte->ppn << AlphaISA::PageShift) + 345 (AlphaISA::VAddr(req->getVaddr()).offset() 346 & ~3)); 347 348 // check permissions for this access 349 if (!(pte->xre & |
350 (1 << ICM_CM(xc->readMiscReg(AlphaISA::IPR_ICM))))) { | 350 (1 << ICM_CM(tc->readMiscReg(AlphaISA::IPR_ICM))))) { |
351 // instruction access fault 352 acv++; 353 return new ItbAcvFault(req->getVaddr()); 354 } 355 356 hits++; 357 } 358 } --- 79 unchanged lines hidden (view full) --- 438 439 hits = read_hits + write_hits; 440 misses = read_misses + write_misses; 441 acv = read_acv + write_acv; 442 accesses = read_accesses + write_accesses; 443} 444 445Fault | 351 // instruction access fault 352 acv++; 353 return new ItbAcvFault(req->getVaddr()); 354 } 355 356 hits++; 357 } 358 } --- 79 unchanged lines hidden (view full) --- 438 439 hits = read_hits + write_hits; 440 misses = read_misses + write_misses; 441 acv = read_acv + write_acv; 442 accesses = read_accesses + write_accesses; 443} 444 445Fault |
446AlphaDTB::translate(RequestPtr &req, ExecContext *xc, bool write) const | 446AlphaDTB::translate(RequestPtr &req, ThreadContext *tc, bool write) const |
447{ | 447{ |
448 Addr pc = xc->readPC(); | 448 Addr pc = tc->readPC(); |
449 450 AlphaISA::mode_type mode = | 449 450 AlphaISA::mode_type mode = |
451 (AlphaISA::mode_type)DTB_CM_CM(xc->readMiscReg(AlphaISA::IPR_DTB_CM)); | 451 (AlphaISA::mode_type)DTB_CM_CM(tc->readMiscReg(AlphaISA::IPR_DTB_CM)); |
452 453 454 /** 455 * Check for alignment faults 456 */ 457 if (req->getVaddr() & (req->getSize() - 1)) { 458 DPRINTF(TLB, "Alignment Fault on %#x, size = %d", req->getVaddr(), 459 req->getSize()); 460 uint64_t flags = write ? MM_STAT_WR_MASK : 0; 461 return new DtbAlignmentFault(req->getVaddr(), req->getFlags(), flags); 462 } 463 464 if (pc & 0x1) { 465 mode = (req->getFlags() & ALTMODE) ? 466 (AlphaISA::mode_type)ALT_MODE_AM( | 452 453 454 /** 455 * Check for alignment faults 456 */ 457 if (req->getVaddr() & (req->getSize() - 1)) { 458 DPRINTF(TLB, "Alignment Fault on %#x, size = %d", req->getVaddr(), 459 req->getSize()); 460 uint64_t flags = write ? MM_STAT_WR_MASK : 0; 461 return new DtbAlignmentFault(req->getVaddr(), req->getFlags(), flags); 462 } 463 464 if (pc & 0x1) { 465 mode = (req->getFlags() & ALTMODE) ? 466 (AlphaISA::mode_type)ALT_MODE_AM( |
467 xc->readMiscReg(AlphaISA::IPR_ALT_MODE)) | 467 tc->readMiscReg(AlphaISA::IPR_ALT_MODE)) |
468 : AlphaISA::mode_kernel; 469 } 470 471 if (req->getFlags() & PHYSICAL) { 472 req->setPaddr(req->getVaddr()); 473 } else { 474 // verify that this is a good virtual address 475 if (!validVirtualAddress(req->getVaddr())) { 476 if (write) { write_acv++; } else { read_acv++; } 477 uint64_t flags = (write ? MM_STAT_WR_MASK : 0) | 478 MM_STAT_BAD_VA_MASK | 479 MM_STAT_ACV_MASK; 480 return new DtbPageFault(req->getVaddr(), req->getFlags(), flags); 481 } 482 483 // Check for "superpage" mapping 484#if ALPHA_TLASER | 468 : AlphaISA::mode_kernel; 469 } 470 471 if (req->getFlags() & PHYSICAL) { 472 req->setPaddr(req->getVaddr()); 473 } else { 474 // verify that this is a good virtual address 475 if (!validVirtualAddress(req->getVaddr())) { 476 if (write) { write_acv++; } else { read_acv++; } 477 uint64_t flags = (write ? MM_STAT_WR_MASK : 0) | 478 MM_STAT_BAD_VA_MASK | 479 MM_STAT_ACV_MASK; 480 return new DtbPageFault(req->getVaddr(), req->getFlags(), flags); 481 } 482 483 // Check for "superpage" mapping 484#if ALPHA_TLASER |
485 if ((MCSR_SP(xc->readMiscReg(AlphaISA::IPR_MCSR)) & 2) && | 485 if ((MCSR_SP(tc->readMiscReg(AlphaISA::IPR_MCSR)) & 2) && |
486 VAddrSpaceEV5(req->getVaddr()) == 2) { 487#else 488 if (VAddrSpaceEV6(req->getVaddr()) == 0x7e) { 489#endif 490 491 // only valid in kernel mode | 486 VAddrSpaceEV5(req->getVaddr()) == 2) { 487#else 488 if (VAddrSpaceEV6(req->getVaddr()) == 0x7e) { 489#endif 490 491 // only valid in kernel mode |
492 if (DTB_CM_CM(xc->readMiscReg(AlphaISA::IPR_DTB_CM)) != | 492 if (DTB_CM_CM(tc->readMiscReg(AlphaISA::IPR_DTB_CM)) != |
493 AlphaISA::mode_kernel) { 494 if (write) { write_acv++; } else { read_acv++; } 495 uint64_t flags = ((write ? MM_STAT_WR_MASK : 0) | 496 MM_STAT_ACV_MASK); 497 return new DtbAcvFault(req->getVaddr(), req->getFlags(), flags); 498 } 499 500 req->setPaddr(req->getVaddr() & PAddrImplMask); --- 7 unchanged lines hidden (view full) --- 508#endif 509 510 } else { 511 if (write) 512 write_accesses++; 513 else 514 read_accesses++; 515 | 493 AlphaISA::mode_kernel) { 494 if (write) { write_acv++; } else { read_acv++; } 495 uint64_t flags = ((write ? MM_STAT_WR_MASK : 0) | 496 MM_STAT_ACV_MASK); 497 return new DtbAcvFault(req->getVaddr(), req->getFlags(), flags); 498 } 499 500 req->setPaddr(req->getVaddr() & PAddrImplMask); --- 7 unchanged lines hidden (view full) --- 508#endif 509 510 } else { 511 if (write) 512 write_accesses++; 513 else 514 read_accesses++; 515 |
516 int asn = DTB_ASN_ASN(xc->readMiscReg(AlphaISA::IPR_DTB_ASN)); | 516 int asn = DTB_ASN_ASN(tc->readMiscReg(AlphaISA::IPR_DTB_ASN)); |
517 518 // not a physical address: need to look up pte 519 AlphaISA::PTE *pte = lookup(AlphaISA::VAddr(req->getVaddr()).vpn(), 520 asn); 521 522 if (!pte) { 523 // page fault 524 if (write) { write_misses++; } else { read_misses++; } --- 108 unchanged lines hidden --- | 517 518 // not a physical address: need to look up pte 519 AlphaISA::PTE *pte = lookup(AlphaISA::VAddr(req->getVaddr()).vpn(), 520 asn); 521 522 if (!pte) { 523 // page fault 524 if (write) { write_misses++; } else { read_misses++; } --- 108 unchanged lines hidden --- |