ldstflags.hh revision 6622
111723Sar4jc@virginia.edu/*
211723Sar4jc@virginia.edu * Copyright (c) 2007 The Hewlett-Packard Development Company
311723Sar4jc@virginia.edu * All rights reserved.
411723Sar4jc@virginia.edu *
511723Sar4jc@virginia.edu * Redistribution and use of this software in source and binary forms,
611723Sar4jc@virginia.edu * with or without modification, are permitted provided that the
711723Sar4jc@virginia.edu * following conditions are met:
811723Sar4jc@virginia.edu *
911723Sar4jc@virginia.edu * The software must be used only for Non-Commercial Use which means any
1011723Sar4jc@virginia.edu * use which is NOT directed to receiving any direct monetary
1111723Sar4jc@virginia.edu * compensation for, or commercial advantage from such use.  Illustrative
1211723Sar4jc@virginia.edu * examples of non-commercial use are academic research, personal study,
1311723Sar4jc@virginia.edu * teaching, education and corporate research & development.
1411723Sar4jc@virginia.edu * Illustrative examples of commercial use are distributing products for
1512119Sar4jc@virginia.edu * commercial advantage and providing services using the software for
1611723Sar4jc@virginia.edu * commercial advantage.
1711723Sar4jc@virginia.edu *
1811723Sar4jc@virginia.edu * If you wish to use this software or functionality therein that may be
1911723Sar4jc@virginia.edu * covered by patents for commercial use, please contact:
2011723Sar4jc@virginia.edu *     Director of Intellectual Property Licensing
2111723Sar4jc@virginia.edu *     Office of Strategy and Technology
2211723Sar4jc@virginia.edu *     Hewlett-Packard Company
2311723Sar4jc@virginia.edu *     1501 Page Mill Road
2411723Sar4jc@virginia.edu *     Palo Alto, California  94304
2511723Sar4jc@virginia.edu *
2611723Sar4jc@virginia.edu * Redistributions of source code must retain the above copyright notice,
2711723Sar4jc@virginia.edu * this list of conditions and the following disclaimer.  Redistributions
2811723Sar4jc@virginia.edu * in binary form must reproduce the above copyright notice, this list of
2911723Sar4jc@virginia.edu * conditions and the following disclaimer in the documentation and/or
3011723Sar4jc@virginia.edu * other materials provided with the distribution.  Neither the name of
3111723Sar4jc@virginia.edu * the COPYRIGHT HOLDER(s), HEWLETT-PACKARD COMPANY, nor the names of its
3211723Sar4jc@virginia.edu * contributors may be used to endorse or promote products derived from
3311723Sar4jc@virginia.edu * this software without specific prior written permission.  No right of
3411723Sar4jc@virginia.edu * sublicense is granted herewith.  Derivatives of the software and
3511723Sar4jc@virginia.edu * output created using the software may be prepared, but only for
3611723Sar4jc@virginia.edu * Non-Commercial Uses.  Derivatives of the software may be shared with
3711723Sar4jc@virginia.edu * others provided: (i) the others agree to abide by the list of
3811723Sar4jc@virginia.edu * conditions herein which includes the Non-Commercial Use restrictions;
3911723Sar4jc@virginia.edu * and (ii) such Derivatives of the software include the above copyright
4011723Sar4jc@virginia.edu * notice to acknowledge the contribution from this software where
4111723Sar4jc@virginia.edu * applicable, this list of conditions and the disclaimer below.
4211723Sar4jc@virginia.edu *
4311723Sar4jc@virginia.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
4411723Sar4jc@virginia.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
4511723Sar4jc@virginia.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
4611723Sar4jc@virginia.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
4711723Sar4jc@virginia.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
4811723Sar4jc@virginia.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
4911723Sar4jc@virginia.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
5011723Sar4jc@virginia.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
5112119Sar4jc@virginia.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
5211723Sar4jc@virginia.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
5312119Sar4jc@virginia.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
5411723Sar4jc@virginia.edu *
5512119Sar4jc@virginia.edu * Authors: Gabe Black
5611723Sar4jc@virginia.edu */
5711723Sar4jc@virginia.edu
5811723Sar4jc@virginia.edu#ifndef __ARCH_X86_INSTS_MICROLDSTOP_HH__
5911723Sar4jc@virginia.edu#define __ARCH_X86_INSTS_MICROLDSTOP_HH__
6011723Sar4jc@virginia.edu
6111723Sar4jc@virginia.edu#include "arch/x86/insts/microop.hh"
6211725Sar4jc@virginia.edu#include "mem/packet.hh"
6311725Sar4jc@virginia.edu#include "mem/request.hh"
6411725Sar4jc@virginia.edu
6511725Sar4jc@virginia.edunamespace X86ISA
6611725Sar4jc@virginia.edu{
6711725Sar4jc@virginia.edu    const Request::FlagsType SegmentFlagMask = mask(4);
6811725Sar4jc@virginia.edu    const int FlagShift = 4;
6911725Sar4jc@virginia.edu    enum FlagBit {
7011725Sar4jc@virginia.edu        CPL0FlagBit = 1,
7111725Sar4jc@virginia.edu        AddrSizeFlagBit = 2,
7211725Sar4jc@virginia.edu        StoreCheck = 4
7311725Sar4jc@virginia.edu    };
7411725Sar4jc@virginia.edu
7511725Sar4jc@virginia.edu    /**
7611725Sar4jc@virginia.edu     * Base class for load and store ops
7711725Sar4jc@virginia.edu     */
7811725Sar4jc@virginia.edu    class LdStOp : public X86MicroopBase
7911725Sar4jc@virginia.edu    {
8011725Sar4jc@virginia.edu      protected:
8111725Sar4jc@virginia.edu        const uint8_t scale;
8211725Sar4jc@virginia.edu        const RegIndex index;
8311725Sar4jc@virginia.edu        const RegIndex base;
8411725Sar4jc@virginia.edu        const uint64_t disp;
8511725Sar4jc@virginia.edu        const uint8_t segment;
8611725Sar4jc@virginia.edu        const RegIndex data;
8711725Sar4jc@virginia.edu        const uint8_t dataSize;
8811725Sar4jc@virginia.edu        const uint8_t addressSize;
8911725Sar4jc@virginia.edu        const Request::FlagsType memFlags;
9011725Sar4jc@virginia.edu        RegIndex foldOBit, foldABit;
9111725Sar4jc@virginia.edu
9211725Sar4jc@virginia.edu        //Constructor
9311725Sar4jc@virginia.edu        LdStOp(ExtMachInst _machInst,
9411725Sar4jc@virginia.edu                const char * mnem, const char * _instMnem,
9511725Sar4jc@virginia.edu                bool isMicro, bool isDelayed, bool isFirst, bool isLast,
9611725Sar4jc@virginia.edu                uint8_t _scale, InstRegIndex _index, InstRegIndex _base,
9711725Sar4jc@virginia.edu                uint64_t _disp, InstRegIndex _segment,
9811725Sar4jc@virginia.edu                InstRegIndex _data,
9911725Sar4jc@virginia.edu                uint8_t _dataSize, uint8_t _addressSize,
10011725Sar4jc@virginia.edu                Request::FlagsType _memFlags,
10111725Sar4jc@virginia.edu                OpClass __opClass) :
10211723Sar4jc@virginia.edu        X86MicroopBase(machInst, mnem, _instMnem,
10311723Sar4jc@virginia.edu                isMicro, isDelayed, isFirst, isLast, __opClass),
10411723Sar4jc@virginia.edu                scale(_scale), index(_index.idx), base(_base.idx),
10511723Sar4jc@virginia.edu                disp(_disp), segment(_segment.idx),
10611723Sar4jc@virginia.edu                data(_data.idx),
10711723Sar4jc@virginia.edu                dataSize(_dataSize), addressSize(_addressSize),
10811723Sar4jc@virginia.edu                memFlags(_memFlags | _segment.idx)
10911723Sar4jc@virginia.edu        {
11011723Sar4jc@virginia.edu            assert(_segment.idx < NUM_SEGMENTREGS);
11111723Sar4jc@virginia.edu            foldOBit = (dataSize == 1 && !_machInst.rex.present) ? 1 << 6 : 0;
11211723Sar4jc@virginia.edu            foldABit =
11311723Sar4jc@virginia.edu                (addressSize == 1 && !_machInst.rex.present) ? 1 << 6 : 0;
11411723Sar4jc@virginia.edu        }
11511723Sar4jc@virginia.edu
11611723Sar4jc@virginia.edu        std::string generateDisassembly(Addr pc,
11711723Sar4jc@virginia.edu            const SymbolTable *symtab) const;
11811723Sar4jc@virginia.edu
11911723Sar4jc@virginia.edu        template<class Context, class MemType>
12011723Sar4jc@virginia.edu        Fault read(Context *xc, Addr EA, MemType & Mem, unsigned flags) const
12111723Sar4jc@virginia.edu        {
12211723Sar4jc@virginia.edu            Fault fault = NoFault;
12311723Sar4jc@virginia.edu            switch(dataSize)
12411723Sar4jc@virginia.edu            {
12511723Sar4jc@virginia.edu              case 1:
12611723Sar4jc@virginia.edu                fault = xc->read(EA, (uint8_t&)Mem, flags);
12711723Sar4jc@virginia.edu                break;
12811723Sar4jc@virginia.edu              case 2:
12911723Sar4jc@virginia.edu                fault = xc->read(EA, (uint16_t&)Mem, flags);
13011723Sar4jc@virginia.edu                break;
13111723Sar4jc@virginia.edu              case 4:
13212119Sar4jc@virginia.edu                fault = xc->read(EA, (uint32_t&)Mem, flags);
13312119Sar4jc@virginia.edu                break;
13412119Sar4jc@virginia.edu              case 8:
13512119Sar4jc@virginia.edu                fault = xc->read(EA, (uint64_t&)Mem, flags);
13612119Sar4jc@virginia.edu                break;
13712119Sar4jc@virginia.edu              default:
13812119Sar4jc@virginia.edu                panic("Bad operand size %d for read at %#x.\n", dataSize, EA);
13912119Sar4jc@virginia.edu            }
14012119Sar4jc@virginia.edu            return fault;
14112119Sar4jc@virginia.edu        }
14211723Sar4jc@virginia.edu
14311723Sar4jc@virginia.edu        template<class Context, class MemType>
14411723Sar4jc@virginia.edu        Fault write(Context *xc, MemType & Mem, Addr EA, unsigned flags) const
14511723Sar4jc@virginia.edu        {
14611723Sar4jc@virginia.edu            Fault fault = NoFault;
14711723Sar4jc@virginia.edu            switch(dataSize)
14811723Sar4jc@virginia.edu            {
14911723Sar4jc@virginia.edu              case 1:
15011723Sar4jc@virginia.edu                fault = xc->write((uint8_t&)Mem, EA, flags, 0);
15111723Sar4jc@virginia.edu                break;
15211723Sar4jc@virginia.edu              case 2:
15311723Sar4jc@virginia.edu                fault = xc->write((uint16_t&)Mem, EA, flags, 0);
15411723Sar4jc@virginia.edu                break;
15511723Sar4jc@virginia.edu              case 4:
15611723Sar4jc@virginia.edu                fault = xc->write((uint32_t&)Mem, EA, flags, 0);
15711723Sar4jc@virginia.edu                break;
15811723Sar4jc@virginia.edu              case 8:
15911723Sar4jc@virginia.edu                fault = xc->write((uint64_t&)Mem, EA, flags, 0);
16011723Sar4jc@virginia.edu                break;
16111723Sar4jc@virginia.edu              default:
16211723Sar4jc@virginia.edu                panic("Bad operand size %d for write at %#x.\n", dataSize, EA);
16311723Sar4jc@virginia.edu            }
16411723Sar4jc@virginia.edu            return fault;
16511723Sar4jc@virginia.edu        }
16611723Sar4jc@virginia.edu
16711723Sar4jc@virginia.edu        uint64_t
16811723Sar4jc@virginia.edu        get(PacketPtr pkt) const
16911723Sar4jc@virginia.edu        {
17011723Sar4jc@virginia.edu            switch(dataSize)
17111723Sar4jc@virginia.edu            {
17211723Sar4jc@virginia.edu              case 1:
17311723Sar4jc@virginia.edu                return pkt->get<uint8_t>();
17411723Sar4jc@virginia.edu              case 2:
175                return pkt->get<uint16_t>();
176              case 4:
177                return pkt->get<uint32_t>();
178              case 8:
179                return pkt->get<uint64_t>();
180              default:
181                panic("Bad operand size %d for read at %#x.\n",
182                        dataSize, pkt->getAddr());
183            }
184        }
185    };
186}
187
188#endif //__ARCH_X86_INSTS_MICROLDSTOP_HH__
189