microldstop.hh revision 6622:aff9a522956a
112726Snikos.nikoleris@arm.com/* 212726Snikos.nikoleris@arm.com * Copyright (c) 2007 The Hewlett-Packard Development Company 312726Snikos.nikoleris@arm.com * All rights reserved. 412726Snikos.nikoleris@arm.com * 512726Snikos.nikoleris@arm.com * Redistribution and use of this software in source and binary forms, 612726Snikos.nikoleris@arm.com * with or without modification, are permitted provided that the 712726Snikos.nikoleris@arm.com * following conditions are met: 812726Snikos.nikoleris@arm.com * 912726Snikos.nikoleris@arm.com * The software must be used only for Non-Commercial Use which means any 1012726Snikos.nikoleris@arm.com * use which is NOT directed to receiving any direct monetary 1112726Snikos.nikoleris@arm.com * compensation for, or commercial advantage from such use. Illustrative 1212726Snikos.nikoleris@arm.com * examples of non-commercial use are academic research, personal study, 1312726Snikos.nikoleris@arm.com * teaching, education and corporate research & development. 1412726Snikos.nikoleris@arm.com * Illustrative examples of commercial use are distributing products for 1512726Snikos.nikoleris@arm.com * commercial advantage and providing services using the software for 1612726Snikos.nikoleris@arm.com * commercial advantage. 1712726Snikos.nikoleris@arm.com * 1812726Snikos.nikoleris@arm.com * If you wish to use this software or functionality therein that may be 1912726Snikos.nikoleris@arm.com * covered by patents for commercial use, please contact: 2012726Snikos.nikoleris@arm.com * Director of Intellectual Property Licensing 2112726Snikos.nikoleris@arm.com * Office of Strategy and Technology 2212726Snikos.nikoleris@arm.com * Hewlett-Packard Company 2312726Snikos.nikoleris@arm.com * 1501 Page Mill Road 2412726Snikos.nikoleris@arm.com * Palo Alto, California 94304 2512726Snikos.nikoleris@arm.com * 2612726Snikos.nikoleris@arm.com * Redistributions of source code must retain the above copyright notice, 2712726Snikos.nikoleris@arm.com * this list of conditions and the following disclaimer. Redistributions 2812726Snikos.nikoleris@arm.com * in binary form must reproduce the above copyright notice, this list of 2912726Snikos.nikoleris@arm.com * conditions and the following disclaimer in the documentation and/or 3012726Snikos.nikoleris@arm.com * other materials provided with the distribution. Neither the name of 3112726Snikos.nikoleris@arm.com * the COPYRIGHT HOLDER(s), HEWLETT-PACKARD COMPANY, nor the names of its 3212726Snikos.nikoleris@arm.com * contributors may be used to endorse or promote products derived from 3312726Snikos.nikoleris@arm.com * this software without specific prior written permission. No right of 3412726Snikos.nikoleris@arm.com * sublicense is granted herewith. Derivatives of the software and 3512726Snikos.nikoleris@arm.com * output created using the software may be prepared, but only for 3612726Snikos.nikoleris@arm.com * Non-Commercial Uses. Derivatives of the software may be shared with 3712726Snikos.nikoleris@arm.com * others provided: (i) the others agree to abide by the list of 3812726Snikos.nikoleris@arm.com * conditions herein which includes the Non-Commercial Use restrictions; 3912726Snikos.nikoleris@arm.com * and (ii) such Derivatives of the software include the above copyright 4012726Snikos.nikoleris@arm.com * notice to acknowledge the contribution from this software where 4112726Snikos.nikoleris@arm.com * applicable, this list of conditions and the disclaimer below. 4212726Snikos.nikoleris@arm.com * 4312726Snikos.nikoleris@arm.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 4412726Snikos.nikoleris@arm.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 4512726Snikos.nikoleris@arm.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 4612726Snikos.nikoleris@arm.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 4712726Snikos.nikoleris@arm.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 4812726Snikos.nikoleris@arm.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 4912726Snikos.nikoleris@arm.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 5012726Snikos.nikoleris@arm.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 5112726Snikos.nikoleris@arm.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 5212726Snikos.nikoleris@arm.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 5312726Snikos.nikoleris@arm.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 5412726Snikos.nikoleris@arm.com * 5512726Snikos.nikoleris@arm.com * Authors: Gabe Black 5612726Snikos.nikoleris@arm.com */ 5712726Snikos.nikoleris@arm.com 5812726Snikos.nikoleris@arm.com#ifndef __ARCH_X86_INSTS_MICROLDSTOP_HH__ 5912726Snikos.nikoleris@arm.com#define __ARCH_X86_INSTS_MICROLDSTOP_HH__ 6012726Snikos.nikoleris@arm.com 6112726Snikos.nikoleris@arm.com#include "arch/x86/insts/microop.hh" 6212726Snikos.nikoleris@arm.com#include "mem/packet.hh" 6312726Snikos.nikoleris@arm.com#include "mem/request.hh" 6412726Snikos.nikoleris@arm.com 6512726Snikos.nikoleris@arm.comnamespace X86ISA 6612726Snikos.nikoleris@arm.com{ 6712726Snikos.nikoleris@arm.com const Request::FlagsType SegmentFlagMask = mask(4); 6812726Snikos.nikoleris@arm.com const int FlagShift = 4; 6912726Snikos.nikoleris@arm.com enum FlagBit { 7012726Snikos.nikoleris@arm.com CPL0FlagBit = 1, 7112726Snikos.nikoleris@arm.com AddrSizeFlagBit = 2, 7212726Snikos.nikoleris@arm.com StoreCheck = 4 7312726Snikos.nikoleris@arm.com }; 7412726Snikos.nikoleris@arm.com 7512726Snikos.nikoleris@arm.com /** 7612726Snikos.nikoleris@arm.com * Base class for load and store ops 7712726Snikos.nikoleris@arm.com */ 7812726Snikos.nikoleris@arm.com class LdStOp : public X86MicroopBase 7912726Snikos.nikoleris@arm.com { 8012726Snikos.nikoleris@arm.com protected: 8112726Snikos.nikoleris@arm.com const uint8_t scale; 8212726Snikos.nikoleris@arm.com const RegIndex index; 8312726Snikos.nikoleris@arm.com const RegIndex base; 8412726Snikos.nikoleris@arm.com const uint64_t disp; 8512726Snikos.nikoleris@arm.com const uint8_t segment; 8612726Snikos.nikoleris@arm.com const RegIndex data; 8712726Snikos.nikoleris@arm.com const uint8_t dataSize; 8812726Snikos.nikoleris@arm.com const uint8_t addressSize; 8912726Snikos.nikoleris@arm.com const Request::FlagsType memFlags; 9012726Snikos.nikoleris@arm.com RegIndex foldOBit, foldABit; 9112726Snikos.nikoleris@arm.com 9212726Snikos.nikoleris@arm.com //Constructor 9312726Snikos.nikoleris@arm.com LdStOp(ExtMachInst _machInst, 9412726Snikos.nikoleris@arm.com const char * mnem, const char * _instMnem, 9512726Snikos.nikoleris@arm.com bool isMicro, bool isDelayed, bool isFirst, bool isLast, 9612726Snikos.nikoleris@arm.com uint8_t _scale, InstRegIndex _index, InstRegIndex _base, 9712726Snikos.nikoleris@arm.com uint64_t _disp, InstRegIndex _segment, 9812726Snikos.nikoleris@arm.com InstRegIndex _data, 9912726Snikos.nikoleris@arm.com uint8_t _dataSize, uint8_t _addressSize, 10012726Snikos.nikoleris@arm.com Request::FlagsType _memFlags, 10112726Snikos.nikoleris@arm.com OpClass __opClass) : 10212726Snikos.nikoleris@arm.com X86MicroopBase(machInst, mnem, _instMnem, 10312726Snikos.nikoleris@arm.com isMicro, isDelayed, isFirst, isLast, __opClass), 10412726Snikos.nikoleris@arm.com scale(_scale), index(_index.idx), base(_base.idx), 10512726Snikos.nikoleris@arm.com disp(_disp), segment(_segment.idx), 10612726Snikos.nikoleris@arm.com data(_data.idx), 10712726Snikos.nikoleris@arm.com dataSize(_dataSize), addressSize(_addressSize), 10812726Snikos.nikoleris@arm.com memFlags(_memFlags | _segment.idx) 10912726Snikos.nikoleris@arm.com { 11012726Snikos.nikoleris@arm.com assert(_segment.idx < NUM_SEGMENTREGS); 11112726Snikos.nikoleris@arm.com foldOBit = (dataSize == 1 && !_machInst.rex.present) ? 1 << 6 : 0; 11212726Snikos.nikoleris@arm.com foldABit = 11312726Snikos.nikoleris@arm.com (addressSize == 1 && !_machInst.rex.present) ? 1 << 6 : 0; 11412726Snikos.nikoleris@arm.com } 11512726Snikos.nikoleris@arm.com 11612726Snikos.nikoleris@arm.com std::string generateDisassembly(Addr pc, 11712726Snikos.nikoleris@arm.com const SymbolTable *symtab) const; 11812726Snikos.nikoleris@arm.com 11912726Snikos.nikoleris@arm.com template<class Context, class MemType> 12012726Snikos.nikoleris@arm.com Fault read(Context *xc, Addr EA, MemType & Mem, unsigned flags) const 12112726Snikos.nikoleris@arm.com { 12212726Snikos.nikoleris@arm.com Fault fault = NoFault; 12312726Snikos.nikoleris@arm.com switch(dataSize) 12412726Snikos.nikoleris@arm.com { 12512726Snikos.nikoleris@arm.com case 1: 12612726Snikos.nikoleris@arm.com fault = xc->read(EA, (uint8_t&)Mem, flags); 12712726Snikos.nikoleris@arm.com break; 12812726Snikos.nikoleris@arm.com case 2: 12912726Snikos.nikoleris@arm.com fault = xc->read(EA, (uint16_t&)Mem, flags); 13012726Snikos.nikoleris@arm.com break; 13112726Snikos.nikoleris@arm.com case 4: 13212726Snikos.nikoleris@arm.com fault = xc->read(EA, (uint32_t&)Mem, flags); 13312726Snikos.nikoleris@arm.com break; 13412726Snikos.nikoleris@arm.com case 8: 13512726Snikos.nikoleris@arm.com fault = xc->read(EA, (uint64_t&)Mem, flags); 13612726Snikos.nikoleris@arm.com break; 13712726Snikos.nikoleris@arm.com default: 13812726Snikos.nikoleris@arm.com panic("Bad operand size %d for read at %#x.\n", dataSize, EA); 13912726Snikos.nikoleris@arm.com } 14012726Snikos.nikoleris@arm.com return fault; 14112726Snikos.nikoleris@arm.com } 14212726Snikos.nikoleris@arm.com 14312726Snikos.nikoleris@arm.com template<class Context, class MemType> 14412726Snikos.nikoleris@arm.com Fault write(Context *xc, MemType & Mem, Addr EA, unsigned flags) const 14512726Snikos.nikoleris@arm.com { 14612726Snikos.nikoleris@arm.com Fault fault = NoFault; 14712726Snikos.nikoleris@arm.com switch(dataSize) 14812726Snikos.nikoleris@arm.com { 14912726Snikos.nikoleris@arm.com case 1: 15012726Snikos.nikoleris@arm.com fault = xc->write((uint8_t&)Mem, EA, flags, 0); 15112726Snikos.nikoleris@arm.com break; 15212726Snikos.nikoleris@arm.com case 2: 15312726Snikos.nikoleris@arm.com fault = xc->write((uint16_t&)Mem, EA, flags, 0); 15412726Snikos.nikoleris@arm.com break; 15512726Snikos.nikoleris@arm.com case 4: 15612726Snikos.nikoleris@arm.com fault = xc->write((uint32_t&)Mem, EA, flags, 0); 15712726Snikos.nikoleris@arm.com break; 15812726Snikos.nikoleris@arm.com case 8: 15912726Snikos.nikoleris@arm.com fault = xc->write((uint64_t&)Mem, EA, flags, 0); 16012726Snikos.nikoleris@arm.com break; 16112726Snikos.nikoleris@arm.com default: 16212726Snikos.nikoleris@arm.com panic("Bad operand size %d for write at %#x.\n", dataSize, EA); 16312726Snikos.nikoleris@arm.com } 16412726Snikos.nikoleris@arm.com return fault; 16512726Snikos.nikoleris@arm.com } 16612726Snikos.nikoleris@arm.com 16712726Snikos.nikoleris@arm.com uint64_t 16812726Snikos.nikoleris@arm.com get(PacketPtr pkt) const 16912726Snikos.nikoleris@arm.com { 17012726Snikos.nikoleris@arm.com switch(dataSize) 17112726Snikos.nikoleris@arm.com { 17212726Snikos.nikoleris@arm.com case 1: 17312726Snikos.nikoleris@arm.com return pkt->get<uint8_t>(); 17412726Snikos.nikoleris@arm.com case 2: 17512726Snikos.nikoleris@arm.com return pkt->get<uint16_t>(); 17612726Snikos.nikoleris@arm.com case 4: 17712726Snikos.nikoleris@arm.com return pkt->get<uint32_t>(); 17812726Snikos.nikoleris@arm.com case 8: 17912726Snikos.nikoleris@arm.com return pkt->get<uint64_t>(); 18012726Snikos.nikoleris@arm.com default: 18112726Snikos.nikoleris@arm.com panic("Bad operand size %d for read at %#x.\n", 18212726Snikos.nikoleris@arm.com dataSize, pkt->getAddr()); 18312726Snikos.nikoleris@arm.com } 18412726Snikos.nikoleris@arm.com } 18512726Snikos.nikoleris@arm.com }; 18612726Snikos.nikoleris@arm.com} 18712726Snikos.nikoleris@arm.com 18812726Snikos.nikoleris@arm.com#endif //__ARCH_X86_INSTS_MICROLDSTOP_HH__ 18912726Snikos.nikoleris@arm.com