tlb.cc (4088:a60eb44ae415) tlb.cc (4172:141705d83494)
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;

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

307 acv++;
308 return new ItbAcvFault(req->getVaddr());
309 }
310
311
312 // VA<42:41> == 2, VA<39:13> maps directly to PA<39:13> for EV5
313 // VA<47:41> == 0x7e, VA<40:13> maps directly to PA<40:13> for EV6
314#if ALPHA_TLASER
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;

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

307 acv++;
308 return new ItbAcvFault(req->getVaddr());
309 }
310
311
312 // VA<42:41> == 2, VA<39:13> maps directly to PA<39:13> for EV5
313 // VA<47:41> == 0x7e, VA<40:13> maps directly to PA<40:13> for EV6
314#if ALPHA_TLASER
315 if ((MCSR_SP(tc->readMiscReg(IPR_MCSR)) & 2) &&
315 if ((MCSR_SP(tc->readMiscRegNoEffect(IPR_MCSR)) & 2) &&
316 VAddrSpaceEV5(req->getVaddr()) == 2)
317#else
318 if (VAddrSpaceEV6(req->getVaddr()) == 0x7e)
319#endif
320 {
321 // only valid in kernel mode
316 VAddrSpaceEV5(req->getVaddr()) == 2)
317#else
318 if (VAddrSpaceEV6(req->getVaddr()) == 0x7e)
319#endif
320 {
321 // only valid in kernel mode
322 if (ICM_CM(tc->readMiscReg(IPR_ICM)) !=
322 if (ICM_CM(tc->readMiscRegNoEffect(IPR_ICM)) !=
323 mode_kernel) {
324 acv++;
325 return new ItbAcvFault(req->getVaddr());
326 }
327
328 req->setPaddr(req->getVaddr() & PAddrImplMask);
329
330#if !ALPHA_TLASER
331 // sign extend the physical address properly
332 if (req->getPaddr() & PAddrUncachedBit40)
333 req->setPaddr(req->getPaddr() | ULL(0xf0000000000));
334 else
335 req->setPaddr(req->getPaddr() & ULL(0xffffffffff));
336#endif
337
338 } else {
339 // not a physical address: need to look up pte
323 mode_kernel) {
324 acv++;
325 return new ItbAcvFault(req->getVaddr());
326 }
327
328 req->setPaddr(req->getVaddr() & PAddrImplMask);
329
330#if !ALPHA_TLASER
331 // sign extend the physical address properly
332 if (req->getPaddr() & PAddrUncachedBit40)
333 req->setPaddr(req->getPaddr() | ULL(0xf0000000000));
334 else
335 req->setPaddr(req->getPaddr() & ULL(0xffffffffff));
336#endif
337
338 } else {
339 // not a physical address: need to look up pte
340 int asn = DTB_ASN_ASN(tc->readMiscReg(IPR_DTB_ASN));
340 int asn = DTB_ASN_ASN(tc->readMiscRegNoEffect(IPR_DTB_ASN));
341 PTE *pte = lookup(VAddr(req->getVaddr()).vpn(),
342 asn);
343
344 if (!pte) {
345 misses++;
346 return new ItbPageFault(req->getVaddr());
347 }
348
349 req->setPaddr((pte->ppn << PageShift) +
350 (VAddr(req->getVaddr()).offset()
351 & ~3));
352
353 // check permissions for this access
354 if (!(pte->xre &
341 PTE *pte = lookup(VAddr(req->getVaddr()).vpn(),
342 asn);
343
344 if (!pte) {
345 misses++;
346 return new ItbPageFault(req->getVaddr());
347 }
348
349 req->setPaddr((pte->ppn << PageShift) +
350 (VAddr(req->getVaddr()).offset()
351 & ~3));
352
353 // check permissions for this access
354 if (!(pte->xre &
355 (1 << ICM_CM(tc->readMiscReg(IPR_ICM))))) {
355 (1 << ICM_CM(tc->readMiscRegNoEffect(IPR_ICM))))) {
356 // instruction access fault
357 acv++;
358 return new ItbAcvFault(req->getVaddr());
359 }
360
361 hits++;
362 }
363 }

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

448}
449
450Fault
451DTB::translate(RequestPtr &req, ThreadContext *tc, bool write) const
452{
453 Addr pc = tc->readPC();
454
455 mode_type mode =
356 // instruction access fault
357 acv++;
358 return new ItbAcvFault(req->getVaddr());
359 }
360
361 hits++;
362 }
363 }

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

448}
449
450Fault
451DTB::translate(RequestPtr &req, ThreadContext *tc, bool write) const
452{
453 Addr pc = tc->readPC();
454
455 mode_type mode =
456 (mode_type)DTB_CM_CM(tc->readMiscReg(IPR_DTB_CM));
456 (mode_type)DTB_CM_CM(tc->readMiscRegNoEffect(IPR_DTB_CM));
457
458
459 /**
460 * Check for alignment faults
461 */
462 if (req->getVaddr() & (req->getSize() - 1)) {
463 DPRINTF(TLB, "Alignment Fault on %#x, size = %d", req->getVaddr(),
464 req->getSize());
465 uint64_t flags = write ? MM_STAT_WR_MASK : 0;
466 return new DtbAlignmentFault(req->getVaddr(), req->getFlags(), flags);
467 }
468
469 if (PcPAL(pc)) {
470 mode = (req->getFlags() & ALTMODE) ?
471 (mode_type)ALT_MODE_AM(
457
458
459 /**
460 * Check for alignment faults
461 */
462 if (req->getVaddr() & (req->getSize() - 1)) {
463 DPRINTF(TLB, "Alignment Fault on %#x, size = %d", req->getVaddr(),
464 req->getSize());
465 uint64_t flags = write ? MM_STAT_WR_MASK : 0;
466 return new DtbAlignmentFault(req->getVaddr(), req->getFlags(), flags);
467 }
468
469 if (PcPAL(pc)) {
470 mode = (req->getFlags() & ALTMODE) ?
471 (mode_type)ALT_MODE_AM(
472 tc->readMiscReg(IPR_ALT_MODE))
472 tc->readMiscRegNoEffect(IPR_ALT_MODE))
473 : mode_kernel;
474 }
475
476 if (req->getFlags() & PHYSICAL) {
477 req->setPaddr(req->getVaddr());
478 } else {
479 // verify that this is a good virtual address
480 if (!validVirtualAddress(req->getVaddr())) {
481 if (write) { write_acv++; } else { read_acv++; }
482 uint64_t flags = (write ? MM_STAT_WR_MASK : 0) |
483 MM_STAT_BAD_VA_MASK |
484 MM_STAT_ACV_MASK;
485 return new DtbPageFault(req->getVaddr(), req->getFlags(), flags);
486 }
487
488 // Check for "superpage" mapping
489#if ALPHA_TLASER
473 : mode_kernel;
474 }
475
476 if (req->getFlags() & PHYSICAL) {
477 req->setPaddr(req->getVaddr());
478 } else {
479 // verify that this is a good virtual address
480 if (!validVirtualAddress(req->getVaddr())) {
481 if (write) { write_acv++; } else { read_acv++; }
482 uint64_t flags = (write ? MM_STAT_WR_MASK : 0) |
483 MM_STAT_BAD_VA_MASK |
484 MM_STAT_ACV_MASK;
485 return new DtbPageFault(req->getVaddr(), req->getFlags(), flags);
486 }
487
488 // Check for "superpage" mapping
489#if ALPHA_TLASER
490 if ((MCSR_SP(tc->readMiscReg(IPR_MCSR)) & 2) &&
490 if ((MCSR_SP(tc->readMiscRegNoEffect(IPR_MCSR)) & 2) &&
491 VAddrSpaceEV5(req->getVaddr()) == 2)
492#else
493 if (VAddrSpaceEV6(req->getVaddr()) == 0x7e)
494#endif
495 {
496
497 // only valid in kernel mode
491 VAddrSpaceEV5(req->getVaddr()) == 2)
492#else
493 if (VAddrSpaceEV6(req->getVaddr()) == 0x7e)
494#endif
495 {
496
497 // only valid in kernel mode
498 if (DTB_CM_CM(tc->readMiscReg(IPR_DTB_CM)) !=
498 if (DTB_CM_CM(tc->readMiscRegNoEffect(IPR_DTB_CM)) !=
499 mode_kernel) {
500 if (write) { write_acv++; } else { read_acv++; }
501 uint64_t flags = ((write ? MM_STAT_WR_MASK : 0) |
502 MM_STAT_ACV_MASK);
503 return new DtbAcvFault(req->getVaddr(), req->getFlags(), flags);
504 }
505
506 req->setPaddr(req->getVaddr() & PAddrImplMask);

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

514#endif
515
516 } else {
517 if (write)
518 write_accesses++;
519 else
520 read_accesses++;
521
499 mode_kernel) {
500 if (write) { write_acv++; } else { read_acv++; }
501 uint64_t flags = ((write ? MM_STAT_WR_MASK : 0) |
502 MM_STAT_ACV_MASK);
503 return new DtbAcvFault(req->getVaddr(), req->getFlags(), flags);
504 }
505
506 req->setPaddr(req->getVaddr() & PAddrImplMask);

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

514#endif
515
516 } else {
517 if (write)
518 write_accesses++;
519 else
520 read_accesses++;
521
522 int asn = DTB_ASN_ASN(tc->readMiscReg(IPR_DTB_ASN));
522 int asn = DTB_ASN_ASN(tc->readMiscRegNoEffect(IPR_DTB_ASN));
523
524 // not a physical address: need to look up pte
525 PTE *pte = lookup(VAddr(req->getVaddr()).vpn(),
526 asn);
527
528 if (!pte) {
529 // page fault
530 if (write) { write_misses++; } else { read_misses++; }

--- 109 unchanged lines hidden ---
523
524 // not a physical address: need to look up pte
525 PTE *pte = lookup(VAddr(req->getVaddr()).vpn(),
526 asn);
527
528 if (!pte) {
529 // page fault
530 if (write) { write_misses++; } else { read_misses++; }

--- 109 unchanged lines hidden ---