tstInt.cpp revision 240f7d7012a5f64bcde850bcf048531a710d81cf
/** $Id$ */
/** @file
* Testcase: Test the interrupt gate feature of the support library.
*/
/*
* Copyright (C) 2006-2007 Sun Microsystems, Inc.
*
* This file is part of VirtualBox Open Source Edition (OSE), as
* available from http://www.virtualbox.org. This file is free software;
* General Public License (GPL) as published by the Free Software
* Foundation, in version 2 as it comes in the "COPYING" file of the
* VirtualBox OSE distribution. VirtualBox OSE is distributed in the
* hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
*
* The contents of this file may alternatively be used under the terms
* of the Common Development and Distribution License Version 1.0
* (CDDL) only, as it comes in the "COPYING.CDDL" file of the
* VirtualBox OSE distribution, in which case the provisions of the
* CDDL are applicable instead of those of the GPL.
*
* You may elect to license modified versions of this file under the
* terms and conditions of either the GPL or the CDDL or both.
*
* Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
* Clara, CA 95054 USA or visit http://www.sun.com if you need
* additional information or have any questions.
*/
/*******************************************************************************
* Header Files *
*******************************************************************************/
/**
* Makes a path to a file in the executable directory.
*/
{
char *psz;
char *psz2;
if (!psz)
if (!psz)
{
}
return pszFile;
}
{
int rcRet = 0;
int i;
int rc;
if (cIterations == 0)
cIterations = 64;
/*
* Init.
*/
RTR3Init();
if (!rc)
{
/*
* Load VMM code.
*/
char szFile[RTPATH_MAX];
if (!rc)
{
/*
* Create a fake 'VM'.
*/
if (paPages)
else
rc = VERR_NO_MEMORY;
if (RT_SUCCESS(rc))
{
if (!rc)
{
/*
* Call VMM code with invalid function.
*/
for (i = cIterations; i > 0; i--)
{
if (rc != VINF_SUCCESS)
{
rcRet++;
break;
}
}
/*
* The fast path.
*/
if (rc == VINF_SUCCESS)
{
RTTimeNanoTS();
for (i = 0; i < 1000000; i++)
{
{
rcRet++;
break;
}
}
RTPrintf("tstInt: SUPCallVMMR0Fast - %d iterations in %llu ns / %llu ticks. %llu ns / %#llu ticks per iteration. Min %llu ticks.\n",
#ifdef VBOX_WITH_IDT_PATCHING
/*
* The fast path.
*/
RTTimeNanoTS();
StartTS = RTTimeNanoTS();
StartTick = ASMReadTSC();
for (i = 0; i < 1000000; i++)
{
{
rcRet++;
break;
}
}
RTPrintf("tstInt: SUPCallVMMR0/idt - %d iterations in %llu ns / %llu ticks. %llu ns / %#llu ticks per iteration. Min %llu ticks.\n",
#endif /* VBOX_WITH_IDT_PATCHING */
/*
* The ordinary path.
*/
RTTimeNanoTS();
StartTS = RTTimeNanoTS();
StartTick = ASMReadTSC();
for (i = 0; i < 1000000; i++)
{
{
rcRet++;
break;
}
}
RTPrintf("tstInt: SUPCallVMMR0Ex - %d iterations in %llu ns / %llu ticks. %llu ns / %#llu ticks per iteration. Min %llu ticks.\n",
}
}
else
{
rcRet++;
}
}
else
{
rcRet++;
}
/*
* Unload VMM.
*/
rc = SUPUnloadVMM();
if (rc)
{
rcRet++;
}
}
else
{
rcRet++;
}
/*
* Terminate.
*/
}
return !!rc;
}