table_walker.cc (7576:4154f3e1edae) | table_walker.cc (7578:7ea651f34ae6) |
---|---|
1/* 2 * Copyright (c) 2010 ARM Limited 3 * All rights reserved 4 * 5 * The license below extends only to copyright in the software and shall 6 * not be construed as granting a license to any other intellectual 7 * property including but not limited to intellectual property relating 8 * to a hardware implementation of the functionality of the software --- 29 unchanged lines hidden (view full) --- 38 */ 39 40#include "arch/arm/faults.hh" 41#include "arch/arm/table_walker.hh" 42#include "arch/arm/tlb.hh" 43#include "dev/io_device.hh" 44#include "cpu/thread_context.hh" 45 | 1/* 2 * Copyright (c) 2010 ARM Limited 3 * All rights reserved 4 * 5 * The license below extends only to copyright in the software and shall 6 * not be construed as granting a license to any other intellectual 7 * property including but not limited to intellectual property relating 8 * to a hardware implementation of the functionality of the software --- 29 unchanged lines hidden (view full) --- 38 */ 39 40#include "arch/arm/faults.hh" 41#include "arch/arm/table_walker.hh" 42#include "arch/arm/tlb.hh" 43#include "dev/io_device.hh" 44#include "cpu/thread_context.hh" 45 |
46#define NUM_WALKERS 2 // 2 should be enough to handle crossing page boundaries 47 | |
48using namespace ArmISA; 49 50TableWalker::TableWalker(const Params *p) | 46using namespace ArmISA; 47 48TableWalker::TableWalker(const Params *p) |
51 : MemObject(p), stateQueue(NUM_WALKERS), port(NULL), tlb(NULL), | 49 : MemObject(p), port(NULL), tlb(NULL), |
52 currState(NULL), doL1DescEvent(this), doL2DescEvent(this) 53{ 54 sctlr = 0; 55} 56 57TableWalker::~TableWalker() 58{ 59 ; --- 90 unchanged lines hidden (view full) --- 150 currState->tc = NULL; 151 currState->req = NULL; 152 return f; 153 } 154 155 if (currState->timing) { 156 port->dmaAction(MemCmd::ReadReq, l1desc_addr, sizeof(uint32_t), 157 &doL1DescEvent, (uint8_t*)&currState->l1Desc.data, (Tick)0); | 50 currState(NULL), doL1DescEvent(this), doL2DescEvent(this) 51{ 52 sctlr = 0; 53} 54 55TableWalker::~TableWalker() 56{ 57 ; --- 90 unchanged lines hidden (view full) --- 148 currState->tc = NULL; 149 currState->req = NULL; 150 return f; 151 } 152 153 if (currState->timing) { 154 port->dmaAction(MemCmd::ReadReq, l1desc_addr, sizeof(uint32_t), 155 &doL1DescEvent, (uint8_t*)&currState->l1Desc.data, (Tick)0); |
158 DPRINTF(TLBVerbose, "Adding to walker fifo: %d free before adding\n", 159 stateQueue.free_slots()); 160 stateQueue.add(*currState); | 156 DPRINTF(TLBVerbose, "Adding to walker fifo: queue size before adding: %d\n", 157 stateQueue.size()); 158 stateQueue.push_back(currState); 159 assert(stateQueue.size() < 5); |
161 currState = NULL; 162 } else { 163 port->dmaAction(MemCmd::ReadReq, l1desc_addr, sizeof(uint32_t), 164 NULL, (uint8_t*)&currState->l1Desc.data, (Tick)0); 165 doL1Descriptor(); 166 f = currState->fault; 167 } 168 --- 393 unchanged lines hidden (view full) --- 562 currState->req = NULL; 563 } 564 tlb->insert(currState->vaddr, te); 565} 566 567void 568TableWalker::doL1DescriptorWrapper() 569{ | 160 currState = NULL; 161 } else { 162 port->dmaAction(MemCmd::ReadReq, l1desc_addr, sizeof(uint32_t), 163 NULL, (uint8_t*)&currState->l1Desc.data, (Tick)0); 164 doL1Descriptor(); 165 f = currState->fault; 166 } 167 --- 393 unchanged lines hidden (view full) --- 561 currState->req = NULL; 562 } 563 tlb->insert(currState->vaddr, te); 564} 565 566void 567TableWalker::doL1DescriptorWrapper() 568{ |
570 currState = stateQueue.peek(); | 569 currState = stateQueue.front(); |
571 currState->delayed = false; 572 | 570 currState->delayed = false; 571 |
572 DPRINTF(TLBVerbose, "L1 Desc object host addr: %p\n",&currState->l1Desc.data); 573 DPRINTF(TLBVerbose, "L1 Desc object data: %08x\n",currState->l1Desc.data); 574 |
|
573 DPRINTF(TLBVerbose, "calling doL1Descriptor for vaddr:%#x\n", currState->vaddr); 574 doL1Descriptor(); 575 576 // Check if fault was generated 577 if (currState->fault != NoFault) { 578 currState->transState->finish(currState->fault, currState->req, 579 currState->tc, currState->mode); 580 581 currState->req = NULL; 582 currState->tc = NULL; 583 currState->delayed = false; 584 | 575 DPRINTF(TLBVerbose, "calling doL1Descriptor for vaddr:%#x\n", currState->vaddr); 576 doL1Descriptor(); 577 578 // Check if fault was generated 579 if (currState->fault != NoFault) { 580 currState->transState->finish(currState->fault, currState->req, 581 currState->tc, currState->mode); 582 583 currState->req = NULL; 584 currState->tc = NULL; 585 currState->delayed = false; 586 |
585 stateQueue.remove(); | 587 stateQueue.pop_front(); |
586 } 587 else if (!currState->delayed) { 588 DPRINTF(TLBVerbose, "calling translateTiming again\n"); 589 currState->fault = tlb->translateTiming(currState->req, currState->tc, 590 currState->transState, currState->mode); 591 592 currState->req = NULL; 593 currState->tc = NULL; 594 currState->delayed = false; 595 | 588 } 589 else if (!currState->delayed) { 590 DPRINTF(TLBVerbose, "calling translateTiming again\n"); 591 currState->fault = tlb->translateTiming(currState->req, currState->tc, 592 currState->transState, currState->mode); 593 594 currState->req = NULL; 595 currState->tc = NULL; 596 currState->delayed = false; 597 |
596 stateQueue.remove(); | 598 stateQueue.pop_front(); |
597 } 598 currState = NULL; 599} 600 601void 602TableWalker::doL2DescriptorWrapper() 603{ | 599 } 600 currState = NULL; 601} 602 603void 604TableWalker::doL2DescriptorWrapper() 605{ |
604 currState = stateQueue.peek(); | 606 currState = stateQueue.front(); |
605 assert(currState->delayed); 606 607 DPRINTF(TLBVerbose, "calling doL2Descriptor for vaddr:%#x\n", 608 currState->vaddr); 609 doL2Descriptor(); 610 611 // Check if fault was generated 612 if (currState->fault != NoFault) { --- 5 unchanged lines hidden (view full) --- 618 currState->fault = tlb->translateTiming(currState->req, currState->tc, 619 currState->transState, currState->mode); 620 } 621 622 currState->req = NULL; 623 currState->tc = NULL; 624 currState->delayed = false; 625 | 607 assert(currState->delayed); 608 609 DPRINTF(TLBVerbose, "calling doL2Descriptor for vaddr:%#x\n", 610 currState->vaddr); 611 doL2Descriptor(); 612 613 // Check if fault was generated 614 if (currState->fault != NoFault) { --- 5 unchanged lines hidden (view full) --- 620 currState->fault = tlb->translateTiming(currState->req, currState->tc, 621 currState->transState, currState->mode); 622 } 623 624 currState->req = NULL; 625 currState->tc = NULL; 626 currState->delayed = false; 627 |
626 stateQueue.remove(); | 628 stateQueue.pop_front(); |
627 currState = NULL; 628} 629 630ArmISA::TableWalker * 631ArmTableWalkerParams::create() 632{ 633 return new ArmISA::TableWalker(this); 634} 635 | 629 currState = NULL; 630} 631 632ArmISA::TableWalker * 633ArmTableWalkerParams::create() 634{ 635 return new ArmISA::TableWalker(this); 636} 637 |