917f4ee9f101c9786cf09ea0fe7923a7f6dfe40cvboxsync/* $Id$ */
917f4ee9f101c9786cf09ea0fe7923a7f6dfe40cvboxsync/** @file
917f4ee9f101c9786cf09ea0fe7923a7f6dfe40cvboxsync * Instruction Test Environment - IPRT ring-3 driver.
917f4ee9f101c9786cf09ea0fe7923a7f6dfe40cvboxsync */
917f4ee9f101c9786cf09ea0fe7923a7f6dfe40cvboxsync
917f4ee9f101c9786cf09ea0fe7923a7f6dfe40cvboxsync/*
917f4ee9f101c9786cf09ea0fe7923a7f6dfe40cvboxsync * Copyright (C) 2006-2013 Oracle Corporation
917f4ee9f101c9786cf09ea0fe7923a7f6dfe40cvboxsync *
917f4ee9f101c9786cf09ea0fe7923a7f6dfe40cvboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
917f4ee9f101c9786cf09ea0fe7923a7f6dfe40cvboxsync * available from http://www.virtualbox.org. This file is free software;
917f4ee9f101c9786cf09ea0fe7923a7f6dfe40cvboxsync * you can redistribute it and/or modify it under the terms of the GNU
917f4ee9f101c9786cf09ea0fe7923a7f6dfe40cvboxsync * General Public License (GPL) as published by the Free Software
917f4ee9f101c9786cf09ea0fe7923a7f6dfe40cvboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
917f4ee9f101c9786cf09ea0fe7923a7f6dfe40cvboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
917f4ee9f101c9786cf09ea0fe7923a7f6dfe40cvboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
917f4ee9f101c9786cf09ea0fe7923a7f6dfe40cvboxsync */
917f4ee9f101c9786cf09ea0fe7923a7f6dfe40cvboxsync
917f4ee9f101c9786cf09ea0fe7923a7f6dfe40cvboxsync
917f4ee9f101c9786cf09ea0fe7923a7f6dfe40cvboxsync/*******************************************************************************
917f4ee9f101c9786cf09ea0fe7923a7f6dfe40cvboxsync* Header Files *
917f4ee9f101c9786cf09ea0fe7923a7f6dfe40cvboxsync*******************************************************************************/
270236340676d2385b27ea992e07fcb643bb78b6vboxsync#include <iprt/mem.h>
917f4ee9f101c9786cf09ea0fe7923a7f6dfe40cvboxsync#include <iprt/string.h>
917f4ee9f101c9786cf09ea0fe7923a7f6dfe40cvboxsync#include <iprt/test.h>
917f4ee9f101c9786cf09ea0fe7923a7f6dfe40cvboxsync
270236340676d2385b27ea992e07fcb643bb78b6vboxsync#ifdef RT_OS_WINDOWS
270236340676d2385b27ea992e07fcb643bb78b6vboxsync# define NO_LOW_MEM
270236340676d2385b27ea992e07fcb643bb78b6vboxsync#elif defined(RT_OS_OS2) || defined(RT_OS_HAIKU)
270236340676d2385b27ea992e07fcb643bb78b6vboxsync# define NO_LOW_MEM
270236340676d2385b27ea992e07fcb643bb78b6vboxsync#else
270236340676d2385b27ea992e07fcb643bb78b6vboxsync# include <sys/mman.h>
270236340676d2385b27ea992e07fcb643bb78b6vboxsync#endif
270236340676d2385b27ea992e07fcb643bb78b6vboxsync
917f4ee9f101c9786cf09ea0fe7923a7f6dfe40cvboxsync
917f4ee9f101c9786cf09ea0fe7923a7f6dfe40cvboxsync/*******************************************************************************
917f4ee9f101c9786cf09ea0fe7923a7f6dfe40cvboxsync* Structures and Typedefs *
917f4ee9f101c9786cf09ea0fe7923a7f6dfe40cvboxsync*******************************************************************************/
917f4ee9f101c9786cf09ea0fe7923a7f6dfe40cvboxsync#if HC_ARCH_BITS == 64
917f4ee9f101c9786cf09ea0fe7923a7f6dfe40cvboxsynctypedef uint64_t VBINSTSTREG;
917f4ee9f101c9786cf09ea0fe7923a7f6dfe40cvboxsync#else
917f4ee9f101c9786cf09ea0fe7923a7f6dfe40cvboxsynctypedef uint32_t VBINSTSTREG;
917f4ee9f101c9786cf09ea0fe7923a7f6dfe40cvboxsync#endif
917f4ee9f101c9786cf09ea0fe7923a7f6dfe40cvboxsync
917f4ee9f101c9786cf09ea0fe7923a7f6dfe40cvboxsync
917f4ee9f101c9786cf09ea0fe7923a7f6dfe40cvboxsync/*******************************************************************************
917f4ee9f101c9786cf09ea0fe7923a7f6dfe40cvboxsync* Global Variables *
917f4ee9f101c9786cf09ea0fe7923a7f6dfe40cvboxsync*******************************************************************************/
917f4ee9f101c9786cf09ea0fe7923a7f6dfe40cvboxsyncRTTEST g_hTest;
917f4ee9f101c9786cf09ea0fe7923a7f6dfe40cvboxsync
917f4ee9f101c9786cf09ea0fe7923a7f6dfe40cvboxsync
917f4ee9f101c9786cf09ea0fe7923a7f6dfe40cvboxsyncRT_C_DECLS_BEGIN
f372af8e6ee2a011213b11cc69f4a29530ff7ce5vboxsyncextern void *g_pvLow16Mem4K;
f372af8e6ee2a011213b11cc69f4a29530ff7ce5vboxsyncextern void *g_pvLow32Mem4K;
917f4ee9f101c9786cf09ea0fe7923a7f6dfe40cvboxsyncDECLASM(void) TestInstrMain(void);
917f4ee9f101c9786cf09ea0fe7923a7f6dfe40cvboxsync
917f4ee9f101c9786cf09ea0fe7923a7f6dfe40cvboxsyncDECLEXPORT(void) VBInsTstFailure(const char *pszMessage);
917f4ee9f101c9786cf09ea0fe7923a7f6dfe40cvboxsyncDECLEXPORT(void) VBInsTstFailure1(const char *pszFmt, VBINSTSTREG uArg1);
917f4ee9f101c9786cf09ea0fe7923a7f6dfe40cvboxsyncDECLEXPORT(void) VBInsTstFailure2(const char *pszFmt, VBINSTSTREG uArg1, VBINSTSTREG uArg2);
917f4ee9f101c9786cf09ea0fe7923a7f6dfe40cvboxsyncDECLEXPORT(void) VBInsTstFailure3(const char *pszFmt, VBINSTSTREG uArg1, VBINSTSTREG uArg2, VBINSTSTREG uArg3);
917f4ee9f101c9786cf09ea0fe7923a7f6dfe40cvboxsyncDECLEXPORT(void) VBInsTstFailure4(const char *pszFmt, VBINSTSTREG uArg1, VBINSTSTREG uArg2, VBINSTSTREG uArg3, VBINSTSTREG uArg4);
917f4ee9f101c9786cf09ea0fe7923a7f6dfe40cvboxsyncRT_C_DECLS_END
917f4ee9f101c9786cf09ea0fe7923a7f6dfe40cvboxsync
917f4ee9f101c9786cf09ea0fe7923a7f6dfe40cvboxsync
917f4ee9f101c9786cf09ea0fe7923a7f6dfe40cvboxsyncDECLEXPORT(void) VBInsTstFailure(const char *pszMessage)
917f4ee9f101c9786cf09ea0fe7923a7f6dfe40cvboxsync{
917f4ee9f101c9786cf09ea0fe7923a7f6dfe40cvboxsync RTTestFailed(g_hTest, "%s", pszMessage);
917f4ee9f101c9786cf09ea0fe7923a7f6dfe40cvboxsync}
917f4ee9f101c9786cf09ea0fe7923a7f6dfe40cvboxsync
917f4ee9f101c9786cf09ea0fe7923a7f6dfe40cvboxsyncDECLEXPORT(void) VBInsTstFailure1(const char *pszFmt, VBINSTSTREG uArg1)
917f4ee9f101c9786cf09ea0fe7923a7f6dfe40cvboxsync{
917f4ee9f101c9786cf09ea0fe7923a7f6dfe40cvboxsync RTTestFailed(g_hTest, pszFmt, uArg1);
917f4ee9f101c9786cf09ea0fe7923a7f6dfe40cvboxsync}
917f4ee9f101c9786cf09ea0fe7923a7f6dfe40cvboxsync
917f4ee9f101c9786cf09ea0fe7923a7f6dfe40cvboxsync
917f4ee9f101c9786cf09ea0fe7923a7f6dfe40cvboxsyncDECLEXPORT(void) VBInsTstFailure2(const char *pszFmt, VBINSTSTREG uArg1, VBINSTSTREG uArg2)
917f4ee9f101c9786cf09ea0fe7923a7f6dfe40cvboxsync{
917f4ee9f101c9786cf09ea0fe7923a7f6dfe40cvboxsync RTTestFailed(g_hTest, pszFmt, uArg1, uArg2);
917f4ee9f101c9786cf09ea0fe7923a7f6dfe40cvboxsync}
917f4ee9f101c9786cf09ea0fe7923a7f6dfe40cvboxsync
917f4ee9f101c9786cf09ea0fe7923a7f6dfe40cvboxsync
917f4ee9f101c9786cf09ea0fe7923a7f6dfe40cvboxsyncDECLEXPORT(void) VBInsTstFailure3(const char *pszFmt, VBINSTSTREG uArg1, VBINSTSTREG uArg2, VBINSTSTREG uArg3)
917f4ee9f101c9786cf09ea0fe7923a7f6dfe40cvboxsync{
917f4ee9f101c9786cf09ea0fe7923a7f6dfe40cvboxsync RTTestFailed(g_hTest, pszFmt, uArg1, uArg2, uArg3);
917f4ee9f101c9786cf09ea0fe7923a7f6dfe40cvboxsync}
917f4ee9f101c9786cf09ea0fe7923a7f6dfe40cvboxsync
917f4ee9f101c9786cf09ea0fe7923a7f6dfe40cvboxsync
917f4ee9f101c9786cf09ea0fe7923a7f6dfe40cvboxsyncDECLEXPORT(void) VBInsTstFailure4(const char *pszFmt, VBINSTSTREG uArg1, VBINSTSTREG uArg2, VBINSTSTREG uArg3, VBINSTSTREG uArg4)
917f4ee9f101c9786cf09ea0fe7923a7f6dfe40cvboxsync{
917f4ee9f101c9786cf09ea0fe7923a7f6dfe40cvboxsync RTTestFailed(g_hTest, pszFmt, uArg1, uArg2, uArg3, uArg4);
917f4ee9f101c9786cf09ea0fe7923a7f6dfe40cvboxsync}
917f4ee9f101c9786cf09ea0fe7923a7f6dfe40cvboxsync
917f4ee9f101c9786cf09ea0fe7923a7f6dfe40cvboxsync
917f4ee9f101c9786cf09ea0fe7923a7f6dfe40cvboxsync
917f4ee9f101c9786cf09ea0fe7923a7f6dfe40cvboxsync
917f4ee9f101c9786cf09ea0fe7923a7f6dfe40cvboxsyncint main()
917f4ee9f101c9786cf09ea0fe7923a7f6dfe40cvboxsync{
917f4ee9f101c9786cf09ea0fe7923a7f6dfe40cvboxsync RTEXITCODE rcExit = RTTestInitAndCreate("VBInsTstR3", &g_hTest);
917f4ee9f101c9786cf09ea0fe7923a7f6dfe40cvboxsync if (rcExit != RTEXITCODE_SUCCESS)
917f4ee9f101c9786cf09ea0fe7923a7f6dfe40cvboxsync return rcExit;
917f4ee9f101c9786cf09ea0fe7923a7f6dfe40cvboxsync RTTestBanner(g_hTest);
270236340676d2385b27ea992e07fcb643bb78b6vboxsync
f372af8e6ee2a011213b11cc69f4a29530ff7ce5vboxsync int rc = RTMemAllocEx(_4K, 0, RTMEMALLOCEX_FLAGS_16BIT_REACH, &g_pvLow16Mem4K);
270236340676d2385b27ea992e07fcb643bb78b6vboxsync if (RT_FAILURE(rc))
270236340676d2385b27ea992e07fcb643bb78b6vboxsync {
f372af8e6ee2a011213b11cc69f4a29530ff7ce5vboxsync RTTestPrintf(g_hTest, RTTESTLVL_ALWAYS, "Could not allocate low 16-bit memory (%Rrc)\n", rc);
f372af8e6ee2a011213b11cc69f4a29530ff7ce5vboxsync g_pvLow16Mem4K = NULL;
f372af8e6ee2a011213b11cc69f4a29530ff7ce5vboxsync }
f372af8e6ee2a011213b11cc69f4a29530ff7ce5vboxsync
f372af8e6ee2a011213b11cc69f4a29530ff7ce5vboxsync rc = RTMemAllocEx(_4K, 0, RTMEMALLOCEX_FLAGS_32BIT_REACH, &g_pvLow32Mem4K);
f372af8e6ee2a011213b11cc69f4a29530ff7ce5vboxsync if (RT_FAILURE(rc))
f372af8e6ee2a011213b11cc69f4a29530ff7ce5vboxsync {
f372af8e6ee2a011213b11cc69f4a29530ff7ce5vboxsync RTTestPrintf(g_hTest, RTTESTLVL_ALWAYS, "Could not allocate low 32-bit memory (%Rrc)\n", rc);
f372af8e6ee2a011213b11cc69f4a29530ff7ce5vboxsync g_pvLow32Mem4K = NULL;
270236340676d2385b27ea992e07fcb643bb78b6vboxsync }
270236340676d2385b27ea992e07fcb643bb78b6vboxsync
917f4ee9f101c9786cf09ea0fe7923a7f6dfe40cvboxsync TestInstrMain();
270236340676d2385b27ea992e07fcb643bb78b6vboxsync
917f4ee9f101c9786cf09ea0fe7923a7f6dfe40cvboxsync return RTTestSummaryAndDestroy(g_hTest);
917f4ee9f101c9786cf09ea0fe7923a7f6dfe40cvboxsync}
917f4ee9f101c9786cf09ea0fe7923a7f6dfe40cvboxsync