VirtualBox

Changeset 36768 in vbox


Ignore:
Timestamp:
Apr 20, 2011 6:33:29 PM (14 years ago)
Author:
vboxsync
Message:

IEM: Initial commit, work in progress.

Location:
trunk
Files:
9 added
11 edited

Legend:

Unmodified
Added
Removed
  • trunk/Makefile.kmk

    r35630 r36768  
    13841384vslick.h: include/VBox/cdefs.h include/iprt/cdefs.h $(MAKEFILE)
    13851385        $(RM) -f -- $@ [email protected] [email protected] [email protected]
    1386         $(APPEND) [email protected] '// autogenerated'
    13871386        @$(APPEND) [email protected] '#define IN_SLICKEDIT '
    13881387        @$(APPEND) [email protected] '#define RT_C_DECLS_BEGIN '
     
    15031502        @$(APPEND) [email protected] '#define PGM_BTH_DECL(type, name)        type PGM_BTH_NAME(name)'
    15041503
     1504        @$(APPEND) [email protected] '#define FNIEMOP_STUB(a_Name)            static VBOXSTRICTRC a_Name(PIEMCPU pIemCpu) { return VERR_NOT_IMPLEMENTED; }'
     1505        @$(APPEND) [email protected] '#define FNIEMOP_DEF(a_Name)             static VBOXSTRICTRC a_Name(PIEMCPU pIemCpu)'
     1506        @$(APPEND) [email protected] '#define FNIEMOP_DEF_1(a_Name, a_Type0, a_Name0) static VBOXSTRICTRC a_Name(PIEMCPU pIemCpu, a_Type0 a_Name0)'
     1507        @$(APPEND) [email protected] '#define FNIEMOP_DEF_2(a_Name, a_Type0, a_Name0, a_Type1, a_Name1) static VBOXSTRICTRC a_Name(PIEMCPU pIemCpu, a_Type0 a_Name0, a_Type1 a_Name1)'
     1508        @$(APPEND) [email protected] '#define IEM_CIMPL_DEF_0(a_Name)         static VBOXSTRICTRC a_Name(PIEMCPU pIemCpu)'
     1509        @$(APPEND) [email protected] '#define IEM_CIMPL_DEF_1(a_Name, a_Type0, a_Name0) static VBOXSTRICTRC a_Name(PIEMCPU pIemCpu, , a_Type0 a_Name0)'
     1510        @$(APPEND) [email protected] '#define IEM_CIMPL_DEF_2(a_Name, a_Type0, a_Name0, a_Type1, a_Name1) static VBOXSTRICTRC a_Name(PIEMCPU pIemCpu, , a_Type0 a_Name0, a_Type1 a_Name1)'
     1511        @$(APPEND) [email protected] '#define IEM_CIMPL_DEF_3(a_Name, a_Type0, a_Name0, a_Type1, a_Name1, a_Type2, a_Name2)  static VBOXSTRICTRC a_Name(PIEMCPU pIemCpu, , a_Type0 a_Name0, a_Type1 a_Name1, , a_Type2 a_Name2)'
     1512        @$(APPEND) [email protected] '#define IEM_MC_LOCAL(a_Type, a_Name)                       a_Type a_Name'
     1513        @$(APPEND) [email protected] '#define IEM_MC_ARG(a_Type, a_Name, a_iArg)                 a_Type a_Name'
     1514        @$(APPEND) [email protected] '#define IEM_MC_ARG_CONST(a_Type, a_Name, a_Value, a_iArg)  a_Type const a_Name = a_Value'
     1515
    15051516        $(SED)  -e '/__cdecl/d' \
    15061517                -e '/^ *# *define.*DECL/!d' \
     
    15321543                | $(SED_EXT) -e 's/\x1F/_/g' -e 's/\x1E/(/g' -e 's/\x1C/ /g' \
    15331544                | $(SED_EXT) -e 's/$$/\n/' --output [email protected]
    1534         $(MV) -f [email protected] $@
     1545        $(SED) -e '/#define/s/$$/ \/\/ vbox/' --output $@ [email protected]
    15351546        $(RM) -f [email protected] [email protected] [email protected]
    15361547ifeq ($(KBUILD_HOST),win)
  • trunk/include/VBox/vmm/vm.h

    r36448 r36768  
    150150    } em;
    151151
     152    /** IEM part. */
     153    union
     154    {
     155#ifdef ___IEMInternal_h
     156        struct IEMCPU       s;
     157#endif
     158        uint8_t             padding[1024];      /* multiple of 64 */
     159    } iem;
     160
    152161    /** TRPM part. */
    153162    union
     
    205214    } dbgf;
    206215
    207 #if 0
    208216    /** Align the following members on page boundary. */
    209     uint8_t                 abAlignment2[32];
    210 #endif
     217    uint8_t                 abAlignment2[3072];
    211218
    212219    /** PGM part. */
  • trunk/src/VBox/VMM/Makefile.kmk

    r36441 r36768  
    4646endif
    4747# VMM_COMMON_DEFS += VBOX_WITH_NS_ACCOUNTING_STATS
     48
     49# Special IEM debug mode which compares the result with REM.
     50ifdef IEM_VERIFICATION_MODE
     51 VMM_COMMON_DEFS += IEM_VERIFICATION_MODE
     52endif
    4853
    4954
     
    100105        VMMR3/EMHwaccm.cpp \
    101106        VMMR3/FTM.cpp \
     107        VMMR3/IEMR3.cpp \
    102108        VMMR3/IOM.cpp \
    103109        VMMR3/GMM.cpp \
     
    166172        VMMAll/EMAllA.asm \
    167173        VMMAll/FTMAll.cpp \
     174        VMMAll/IEMAll.cpp \
     175        VMMAll/IEMAllAImpl.asm \
     176        VMMAll/IEMAllAImplC.cpp \
    168177        VMMAll/TMAll.cpp \
    169178        VMMAll/TMAllCpu.cpp \
     
    570579PGMInline.o     PGMInline.obj:                  PGMDbg.o
    571580
     581# Alias the IEM templates to the object in which they are instantiated.
     582IEMInternal.o \
     583IEMAllInstructions.cpp.o  IEMAllInstructions.cpp.obj \
     584IEMAllCImplStrInstr.cpp.o IEMAllCImplStrInstr.cpp.obj: IEMAll.o
     585
  • trunk/src/VBox/VMM/VMMR3/DBGF.cpp

    r35466 r36768  
    244244#ifndef RT_OS_L4
    245245
    246 # if !defined(DEBUG) || defined(DEBUG_sandervl) || defined(DEBUG_frank)
     246# if !defined(DEBUG) || defined(DEBUG_sandervl) || defined(DEBUG_frank) || defined(IEM_VERIFICATION_MODE)
    247247    int cWait = 10;
    248248# else
  • trunk/src/VBox/VMM/VMMR3/EM.cpp

    r36054 r36768  
    55
    66/*
    7  * Copyright (C) 2006-2007 Oracle Corporation
     7 * Copyright (C) 2006-2011 Oracle Corporation
    88 *
    99 * This file is part of VirtualBox Open Source Edition (OSE), as
     
    5454#include <VBox/vmm/hwaccm.h>
    5555#include <VBox/vmm/patm.h>
     56#ifdef IEM_VERIFICATION_MODE
     57# include <VBox/vmm/iem.h>
     58#endif
    5659#include "EMInternal.h"
    5760#include "internal/em.h"
     
    10571060EMSTATE emR3Reschedule(PVM pVM, PVMCPU pVCpu, PCPUMCTX pCtx)
    10581061{
     1062#ifdef IEM_VERIFICATION_MODE
     1063    return EMSTATE_REM;
     1064#else
     1065
    10591066    /*
    10601067     * When forcing raw-mode execution, things are simple.
     
    11021109    }
    11031110
    1104 #ifndef VBOX_RAW_V86
     1111# ifndef VBOX_RAW_V86
    11051112    if (EFlags.u32 & X86_EFL_VM) {
    11061113        Log2(("raw mode refused: VM_MASK\n"));
    11071114        return EMSTATE_REM;
    11081115    }
    1109 #endif
     1116# endif
    11101117
    11111118    /** @todo check up the X86_CR0_AM flag in respect to raw mode!!! We're probably not emulating it right! */
     
    11791186        }
    11801187
    1181 #if !defined(VBOX_ALLOW_IF0) && !defined(VBOX_RUN_INTERRUPT_GATE_HANDLERS)
     1188# if !defined(VBOX_ALLOW_IF0) && !defined(VBOX_RUN_INTERRUPT_GATE_HANDLERS)
    11821189        if (!(EFlags.u32 & X86_EFL_IF))
    11831190        {
     
    11861193            return EMSTATE_REM;
    11871194        }
    1188 #endif
     1195# endif
    11891196
    11901197        /** @todo still necessary??? */
     
    11981205    Assert(PGMPhysIsA20Enabled(pVCpu));
    11991206    return EMSTATE_RAW;
     1207#endif /* !IEM_VERIFICATION_MODE */
     1208
    12001209}
    12011210
     
    19861995                 */
    19871996                case EMSTATE_RAW:
     1997#ifdef IEM_VERIFICATION_MODE /* remove later */
     1998                    AssertFailed();
     1999#endif
    19882000                    rc = emR3RawExecute(pVM, pVCpu, &fFFDone);
    19892001                    break;
     
    19932005                 */
    19942006                case EMSTATE_HWACC:
     2007#ifdef IEM_VERIFICATION_MODE /* remove later */
     2008                    AssertFailed();
     2009#endif
    19952010                    rc = emR3HwAccExecute(pVM, pVCpu, &fFFDone);
    19962011                    break;
     
    20002015                 */
    20012016                case EMSTATE_REM:
     2017#ifdef IEM_VERIFICATION_MODE
     2018                    rc = VBOXSTRICTRC_TODO(IEMExecOne(pVCpu)); fFFDone = false;
     2019#else
    20022020                    rc = emR3RemExecute(pVM, pVCpu, &fFFDone);
     2021#endif
    20032022                    Log2(("EMR3ExecuteVM: emR3RemExecute -> %Rrc\n", rc));
    20042023                    break;
  • trunk/src/VBox/VMM/VMMR3/VM.cpp

    r36441 r36768  
    5555#include <VBox/vmm/pdmcritsect.h>
    5656#include <VBox/vmm/em.h>
     57#include <VBox/vmm/iem.h>
    5758#include <VBox/vmm/rem.h>
    5859#include <VBox/vmm/tm.h>
     
    926927                                                        if (RT_SUCCESS(rc))
    927928                                                        {
    928                                                             rc = DBGFR3Init(pVM);
     929                                                            rc = IEMR3Init(pVM);
    929930                                                            if (RT_SUCCESS(rc))
    930931                                                            {
    931                                                                 rc = PDMR3Init(pVM);
     932                                                                rc = DBGFR3Init(pVM);
    932933                                                                if (RT_SUCCESS(rc))
    933934                                                                {
    934                                                                     rc = PGMR3InitDynMap(pVM);
    935                                                                     if (RT_SUCCESS(rc))
    936                                                                         rc = MMR3HyperInitFinalize(pVM);
    937                                                                     if (RT_SUCCESS(rc))
    938                                                                         rc = PATMR3InitFinalize(pVM);
    939                                                                     if (RT_SUCCESS(rc))
    940                                                                         rc = PGMR3InitFinalize(pVM);
    941                                                                     if (RT_SUCCESS(rc))
    942                                                                         rc = SELMR3InitFinalize(pVM);
    943                                                                     if (RT_SUCCESS(rc))
    944                                                                         rc = TMR3InitFinalize(pVM);
    945                                                                     if (RT_SUCCESS(rc))
    946                                                                         rc = REMR3InitFinalize(pVM);
    947                                                                     if (RT_SUCCESS(rc))
    948                                                                         rc = vmR3InitDoCompleted(pVM, VMINITCOMPLETED_RING3);
     935                                                                    rc = PDMR3Init(pVM);
    949936                                                                    if (RT_SUCCESS(rc))
    950937                                                                    {
    951                                                                         LogFlow(("vmR3InitRing3: returns %Rrc\n", VINF_SUCCESS));
    952                                                                         return VINF_SUCCESS;
     938                                                                        rc = PGMR3InitDynMap(pVM);
     939                                                                        if (RT_SUCCESS(rc))
     940                                                                            rc = MMR3HyperInitFinalize(pVM);
     941                                                                        if (RT_SUCCESS(rc))
     942                                                                            rc = PATMR3InitFinalize(pVM);
     943                                                                        if (RT_SUCCESS(rc))
     944                                                                            rc = PGMR3InitFinalize(pVM);
     945                                                                        if (RT_SUCCESS(rc))
     946                                                                            rc = SELMR3InitFinalize(pVM);
     947                                                                        if (RT_SUCCESS(rc))
     948                                                                            rc = TMR3InitFinalize(pVM);
     949                                                                        if (RT_SUCCESS(rc))
     950                                                                            rc = REMR3InitFinalize(pVM);
     951                                                                        if (RT_SUCCESS(rc))
     952                                                                            rc = vmR3InitDoCompleted(pVM, VMINITCOMPLETED_RING3);
     953                                                                        if (RT_SUCCESS(rc))
     954                                                                        {
     955                                                                            LogFlow(("vmR3InitRing3: returns %Rrc\n", VINF_SUCCESS));
     956                                                                            return VINF_SUCCESS;
     957                                                                        }
     958
     959                                                                        int rc2 = PDMR3Term(pVM);
     960                                                                        AssertRC(rc2);
    953961                                                                    }
    954                                                                     int rc2 = PDMR3Term(pVM);
     962                                                                    int rc2 = DBGFR3Term(pVM);
    955963                                                                    AssertRC(rc2);
    956964                                                                }
    957                                                                 int rc2 = DBGFR3Term(pVM);
     965                                                                int rc2 = IEMR3Term(pVM);
    958966                                                                AssertRC(rc2);
    959967                                                            }
     
    11571165    EMR3Relocate(pVM);
    11581166    TMR3Relocate(pVM, offDelta);
     1167    IEMR3Relocate(pVM);
    11591168    DBGFR3Relocate(pVM, offDelta);
    11601169    PDMR3Relocate(pVM, offDelta);
     
    23942403        rc = PDMR3Term(pVM);
    23952404        AssertRC(rc);
     2405        rc = IEMR3Term(pVM);
     2406        AssertRC(rc);
    23962407        rc = EMR3Term(pVM);
    23972408        AssertRC(rc);
  • trunk/src/VBox/VMM/testcase/Makefile.kmk

    r35346 r36768  
    4343        tstCompiler \
    4444        tstVMMR0CallHost-1 \
    45         tstVMMR0CallHost-2
     45        tstVMMR0CallHost-2 \
     46        tstX86-1
    4647  ifneq ($(KBUILD_TARGET),l4)
    4748   PROGRAMS += tstAnimate
     
    232233tstCompiler_SOURCES     = tstCompiler.cpp
    233234tstCompiler_LIBS        = $(LIB_VMM) $(LIB_REM) $(LIB_RUNTIME)
     235
     236tstX86-1_TEMPLATE       = VBOXR3TSTEXE
     237tstX86-1_SOURCES        = tstX86-1.cpp tstX86-1A.asm
     238tstX86-1_LIBS           = $(LIB_RUNTIME)
    234239
    235240ifdef VBOX_WITH_RAW_MODE
  • trunk/src/VBox/VMM/testcase/tstVMStructRC.cpp

    r36669 r36768  
    7777#include "CSAMInternal.h"
    7878#include "EMInternal.h"
     79#include "IEMInternal.h"
    7980#include "REMInternal.h"
    8081#include <VBox/vmm/vm.h>
     
    150151    GEN_CHECK_OFF(EMCPU, pStatsRC);
    151152    GEN_CHECK_OFF(EMCPU, pCliStatTree);
     153
     154    GEN_CHECK_SIZE(IEMCPU);
     155    GEN_CHECK_OFF(IEMCPU, pCtxR0);
     156    GEN_CHECK_OFF(IEMCPU, pCtxR3);
     157    GEN_CHECK_OFF(IEMCPU, pCtxRC);
     158    GEN_CHECK_OFF(IEMCPU, offVM);
     159    GEN_CHECK_OFF(IEMCPU, offVMCpu);
     160    GEN_CHECK_OFF(IEMCPU, enmCpuMode);
     161    GEN_CHECK_OFF(IEMCPU, fPrefixes);
     162    GEN_CHECK_OFF(IEMCPU, abOpcode);
     163    GEN_CHECK_OFF(IEMCPU, cActiveMappings);
     164    GEN_CHECK_OFF(IEMCPU, iNextMapping);
     165    GEN_CHECK_OFF(IEMCPU, aMemMappings);
     166    GEN_CHECK_OFF(IEMCPU, aMemMappings[1]);
     167    GEN_CHECK_OFF(IEMCPU, aBounceBuffers);
     168    GEN_CHECK_OFF(IEMCPU, aBounceBuffers[1]);
     169    GEN_CHECK_OFF(IEMCPU, aMemBbMappings);
     170    GEN_CHECK_OFF(IEMCPU, aMemBbMappings[1]);
    152171
    153172    GEN_CHECK_SIZE(IOM);
  • trunk/src/VBox/VMM/testcase/tstVMStructSize.cpp

    r35346 r36768  
    4949#include "CSAMInternal.h"
    5050#include "EMInternal.h"
     51#include "IEMInternal.h"
    5152#include "REMInternal.h"
    5253#include "../VMMR0/GMMR0Internal.h"
     
    211212    CHECK_PADDING_VM(64, csam);
    212213    CHECK_PADDING_VM(64, em);
     214    /*CHECK_PADDING_VM(64, iem);*/
    213215    CHECK_PADDING_VM(64, tm);
    214216    CHECK_PADDING_VM(64, dbgf);
     
    222224    CHECK_PADDING_VMCPU(64, hwaccm);
    223225    CHECK_PADDING_VMCPU(64, em);
     226    CHECK_PADDING_VMCPU(64, iem);
    224227    CHECK_PADDING_VMCPU(64, trpm);
    225228    CHECK_PADDING_VMCPU(64, tm);
  • trunk/src/recompiler/Makefile.kmk

    r36140 r36768  
    6565#VBoxRemPrimary_DEFS           += DEBUG_ALL_LOGGING DEBUG_DISAS DEBUG_PCALL DEBUG_EXEC DEBUG_FLUSH DEBUG_IOPORT DEBUG_SIGNAL DEBUG_TLB_CHECK DEBUG_TB_INVALIDATE DEBUG_TLB  # Enables huge amounts of debug logging.
    6666#VBoxRemPrimary_DEFS           += DEBUG_TMP_LOGGING # log qemu parts to "/tmp/vbox-qemu.log" - does not work with VBoxREM2.
     67ifdef IEM_VERIFICATION_MODE
     68 VBoxRemPrimary_DEFS          += IEM_VERIFICATION_MODE
     69endif
    6770VBoxRemPrimary_DEFS.linux      = _GNU_SOURCE
    6871ifdef VBOX_SOLARIS_10
  • trunk/src/recompiler/cpu-exec.c

    r36175 r36768  
    358358                        /* Clear CPU_INTERRUPT_SINGLE_INSTR and leave CPU_INTERRUPT_SINGLE_INSTR_IN_FLIGHT set. */
    359359                        ASMAtomicAndS32((int32_t volatile *)&env->interrupt_request, ~CPU_INTERRUPT_SINGLE_INSTR);
     360#ifdef IEM_VERIFICATION_MODE
     361                        env->exception_index = ret = EXCP_SINGLE_INSTR;
     362                        cpu_loop_exit();
     363#endif
    360364                    }
    361365
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette