x86_traits.hh revision 5651
14134Sgblack@eecs.umich.edu/*
24134Sgblack@eecs.umich.edu * Copyright (c) 2007 The Hewlett-Packard Development Company
34134Sgblack@eecs.umich.edu * All rights reserved.
44134Sgblack@eecs.umich.edu *
54134Sgblack@eecs.umich.edu * Redistribution and use of this software in source and binary forms,
64134Sgblack@eecs.umich.edu * with or without modification, are permitted provided that the
74134Sgblack@eecs.umich.edu * following conditions are met:
84134Sgblack@eecs.umich.edu *
94134Sgblack@eecs.umich.edu * The software must be used only for Non-Commercial Use which means any
104134Sgblack@eecs.umich.edu * use which is NOT directed to receiving any direct monetary
114134Sgblack@eecs.umich.edu * compensation for, or commercial advantage from such use.  Illustrative
124134Sgblack@eecs.umich.edu * examples of non-commercial use are academic research, personal study,
134134Sgblack@eecs.umich.edu * teaching, education and corporate research & development.
144134Sgblack@eecs.umich.edu * Illustrative examples of commercial use are distributing products for
154134Sgblack@eecs.umich.edu * commercial advantage and providing services using the software for
164134Sgblack@eecs.umich.edu * commercial advantage.
174134Sgblack@eecs.umich.edu *
184134Sgblack@eecs.umich.edu * If you wish to use this software or functionality therein that may be
194134Sgblack@eecs.umich.edu * covered by patents for commercial use, please contact:
204134Sgblack@eecs.umich.edu *     Director of Intellectual Property Licensing
214134Sgblack@eecs.umich.edu *     Office of Strategy and Technology
224134Sgblack@eecs.umich.edu *     Hewlett-Packard Company
234134Sgblack@eecs.umich.edu *     1501 Page Mill Road
244134Sgblack@eecs.umich.edu *     Palo Alto, California  94304
254134Sgblack@eecs.umich.edu *
264134Sgblack@eecs.umich.edu * Redistributions of source code must retain the above copyright notice,
274134Sgblack@eecs.umich.edu * this list of conditions and the following disclaimer.  Redistributions
284134Sgblack@eecs.umich.edu * in binary form must reproduce the above copyright notice, this list of
294134Sgblack@eecs.umich.edu * conditions and the following disclaimer in the documentation and/or
304134Sgblack@eecs.umich.edu * other materials provided with the distribution.  Neither the name of
314134Sgblack@eecs.umich.edu * the COPYRIGHT HOLDER(s), HEWLETT-PACKARD COMPANY, nor the names of its
324134Sgblack@eecs.umich.edu * contributors may be used to endorse or promote products derived from
334134Sgblack@eecs.umich.edu * this software without specific prior written permission.  No right of
344134Sgblack@eecs.umich.edu * sublicense is granted herewith.  Derivatives of the software and
354134Sgblack@eecs.umich.edu * output created using the software may be prepared, but only for
364134Sgblack@eecs.umich.edu * Non-Commercial Uses.  Derivatives of the software may be shared with
374134Sgblack@eecs.umich.edu * others provided: (i) the others agree to abide by the list of
384134Sgblack@eecs.umich.edu * conditions herein which includes the Non-Commercial Use restrictions;
394134Sgblack@eecs.umich.edu * and (ii) such Derivatives of the software include the above copyright
404134Sgblack@eecs.umich.edu * notice to acknowledge the contribution from this software where
414134Sgblack@eecs.umich.edu * applicable, this list of conditions and the disclaimer below.
424134Sgblack@eecs.umich.edu *
434134Sgblack@eecs.umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
444134Sgblack@eecs.umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
454134Sgblack@eecs.umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
464134Sgblack@eecs.umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
474134Sgblack@eecs.umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
484134Sgblack@eecs.umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
494134Sgblack@eecs.umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
504134Sgblack@eecs.umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
514134Sgblack@eecs.umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
524134Sgblack@eecs.umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
534134Sgblack@eecs.umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
544134Sgblack@eecs.umich.edu *
554134Sgblack@eecs.umich.edu * Authors: Gabe Black
564134Sgblack@eecs.umich.edu */
574134Sgblack@eecs.umich.edu
584134Sgblack@eecs.umich.edu#ifndef __ARCH_X86_X86TRAITS_HH__
594134Sgblack@eecs.umich.edu#define __ARCH_X86_X86TRAITS_HH__
604134Sgblack@eecs.umich.edu
615648Sgblack@eecs.umich.edu#include <assert.h>
625648Sgblack@eecs.umich.edu
635648Sgblack@eecs.umich.edu#include "sim/host.hh"
645648Sgblack@eecs.umich.edu
654134Sgblack@eecs.umich.edunamespace X86ISA
664134Sgblack@eecs.umich.edu{
674578Sgblack@eecs.umich.edu    const int NumMicroIntRegs = 16;
685063Sgblack@eecs.umich.edu
694682Sgblack@eecs.umich.edu    const int NumPseudoIntRegs = 1;
705063Sgblack@eecs.umich.edu    //1. The condition code bits of the rflags register.
715075Sgblack@eecs.umich.edu    const int NumImplicitIntRegs = 5;
725063Sgblack@eecs.umich.edu    //1. The lower part of the result of multiplication.
735063Sgblack@eecs.umich.edu    //2. The upper part of the result of multiplication.
745063Sgblack@eecs.umich.edu    //3. The quotient from division
755063Sgblack@eecs.umich.edu    //4. The remainder from division
765075Sgblack@eecs.umich.edu    //5. The divisor for division
774134Sgblack@eecs.umich.edu
784134Sgblack@eecs.umich.edu    const int NumMMXRegs = 8;
794134Sgblack@eecs.umich.edu    const int NumXMMRegs = 16;
805045Sgblack@eecs.umich.edu    const int NumMicroFpRegs = 8;
815025Sgblack@eecs.umich.edu
825025Sgblack@eecs.umich.edu    const int NumCRegs = 16;
835025Sgblack@eecs.umich.edu    const int NumDRegs = 8;
845025Sgblack@eecs.umich.edu
855025Sgblack@eecs.umich.edu    const int NumSegments = 6;
865025Sgblack@eecs.umich.edu    const int NumSysSegments = 4;
875149Sgblack@eecs.umich.edu
885149Sgblack@eecs.umich.edu    const Addr IntAddrPrefixMask = ULL(0xffffffff00000000);
895149Sgblack@eecs.umich.edu    const Addr IntAddrPrefixCPUID = ULL(0x100000000);
905149Sgblack@eecs.umich.edu    const Addr IntAddrPrefixMSR = ULL(0x200000000);
915161Sgblack@eecs.umich.edu    const Addr IntAddrPrefixIO = ULL(0x300000000);
925323Sgblack@eecs.umich.edu
935357Sgblack@eecs.umich.edu    const Addr PhysAddrPrefixIO = ULL(0x8000000000000000);
945357Sgblack@eecs.umich.edu    const Addr PhysAddrPrefixPciConfig = ULL(0xC000000000000000);
955648Sgblack@eecs.umich.edu    const Addr PhysAddrPrefixLocalAPIC = ULL(0xA000000000000000);
965651Sgblack@eecs.umich.edu    const Addr PhysAddrPrefixInterrupts = ULL(0x2000000000000000);
975648Sgblack@eecs.umich.edu    // Each APIC gets two pages. One page is used for local apics to field
985648Sgblack@eecs.umich.edu    // accesses from the CPU, and the other is for all APICs to communicate.
995648Sgblack@eecs.umich.edu    const Addr PhysAddrAPICRangeSize = 1 << 12;
1005390Sgblack@eecs.umich.edu
1015390Sgblack@eecs.umich.edu    static inline Addr
1025390Sgblack@eecs.umich.edu    x86IOAddress(const uint32_t port)
1035390Sgblack@eecs.umich.edu    {
1045390Sgblack@eecs.umich.edu        return PhysAddrPrefixIO | port;
1055390Sgblack@eecs.umich.edu    }
1065390Sgblack@eecs.umich.edu
1075390Sgblack@eecs.umich.edu    static inline Addr
1085390Sgblack@eecs.umich.edu    x86PciConfigAddress(const uint32_t addr)
1095390Sgblack@eecs.umich.edu    {
1105390Sgblack@eecs.umich.edu        return PhysAddrPrefixPciConfig | addr;
1115390Sgblack@eecs.umich.edu    }
1125648Sgblack@eecs.umich.edu
1135648Sgblack@eecs.umich.edu    static inline Addr
1145648Sgblack@eecs.umich.edu    x86LocalAPICAddress(const uint8_t id, const uint16_t addr)
1155648Sgblack@eecs.umich.edu    {
1165648Sgblack@eecs.umich.edu        assert(addr < (1 << 12));
1175648Sgblack@eecs.umich.edu        return PhysAddrPrefixLocalAPIC | (id * (1 << 12)) | addr;
1185648Sgblack@eecs.umich.edu    }
1195651Sgblack@eecs.umich.edu
1205651Sgblack@eecs.umich.edu    static inline Addr
1215651Sgblack@eecs.umich.edu    x86InterruptAddress(const uint8_t id, const uint16_t addr)
1225651Sgblack@eecs.umich.edu    {
1235651Sgblack@eecs.umich.edu        assert(addr < PhysAddrAPICRangeSize);
1245651Sgblack@eecs.umich.edu        return PhysAddrPrefixInterrupts | (id * PhysAddrAPICRangeSize) | addr;
1255651Sgblack@eecs.umich.edu    }
1264134Sgblack@eecs.umich.edu}
1274134Sgblack@eecs.umich.edu
1284134Sgblack@eecs.umich.edu#endif //__ARCH_X86_X86TRAITS_HH__
129