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 |
46using namespace ArmISA; 47 48TableWalker::TableWalker(const Params *p) |
49 : MemObject(p), port(NULL), tlb(NULL), |
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); |
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); |
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{ |
569 currState = stateQueue.front(); |
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 |
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 |
587 stateQueue.pop_front(); |
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 |
598 stateQueue.pop_front(); |
599 } 600 currState = NULL; 601} 602 603void 604TableWalker::doL2DescriptorWrapper() 605{ |
606 currState = stateQueue.front(); |
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 |
628 stateQueue.pop_front(); |
629 currState = NULL; 630} 631 632ArmISA::TableWalker * 633ArmTableWalkerParams::create() 634{ 635 return new ArmISA::TableWalker(this); 636} 637 |