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