cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync/* $Id$ */
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync/** @file
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * exceptionsR3 - Tests various ring-3 CPU exceptions.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync */
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync/*
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * Copyright (C) 2009-2014 Oracle Corporation
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync *
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * available from http://www.virtualbox.org. This file is free software;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * you can redistribute it and/or modify it under the terms of the GNU
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * General Public License (GPL) as published by the Free Software
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync *
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * The contents of this file may alternatively be used under the terms
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * of the Common Development and Distribution License Version 1.0
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * VirtualBox OSE distribution, in which case the provisions of the
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * CDDL are applicable instead of those of the GPL.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync *
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * You may elect to license modified versions of this file under the
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * terms and conditions of either the GPL or the CDDL or both.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync */
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync/*******************************************************************************
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync* Header Files *
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync*******************************************************************************/
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync#include <iprt/cdefs.h>
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync#include <iprt/ctype.h>
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync#include <iprt/getopt.h>
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync#include <iprt/stream.h>
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync#include <iprt/string.h>
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync#include <iprt/test.h>
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync#include <iprt/x86.h>
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync#include <setjmp.h>
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync#ifndef RT_OS_WINDOWS
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync# define USE_SIGNALS
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync# include <signal.h>
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync# include <stdlib.h>
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync#endif
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync/*******************************************************************************
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync* Defined Constants And Macros *
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync*******************************************************************************/
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync/** Executes a simple test. */
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync#define TST_XCPT(Trapper, iTrap, uErr) \
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync do \
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync { \
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync RTTestISub(#Trapper); \
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync tstXcptReset(); \
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if (!setjmp(g_JmpBuf)) \
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync { \
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync tstXcptAsm##Trapper(); \
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync RTTestIFailed("%s didn't trap (line no %u)", #Trapper, __LINE__); \
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync } \
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync else if ( (iTrap) != tstXcptCurTrap() \
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync || (uErr) != tstXcptCurErr() ) \
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync RTTestIFailed("%s trapped with %#x/%#x, expected %#x/%#x (line no %u)", \
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync #Trapper, tstXcptCurTrap(), tstXcptCurErr(), (iTrap), (uErr), __LINE__); \
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync else \
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync RTTestISubDone(); \
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync } while (0)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync/*******************************************************************************
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync* Global Variables *
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync*******************************************************************************/
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync/** Where to longjmp to when getting a signal/exception. */
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncjmp_buf g_JmpBuf;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync#ifdef USE_SIGNALS
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync/** Pending signal.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * -1 if no signal is pending. */
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncint32_t volatile g_iSignal;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync/** Pending signal info. */
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncsiginfo_t volatile g_SigInfo;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync#endif
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync/*******************************************************************************
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync* Internal Functions *
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync*******************************************************************************/
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncDECLASM(void) tstXcptAsmNullPtrRead(void);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncDECLASM(void) tstXcptAsmNullPtrWrite(void);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncDECLASM(void) tstXcptAsmSysEnter(void);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncDECLASM(void) tstXcptAsmSysCall(void);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync#ifdef USE_SIGNALS
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync/**
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * Generic signal handler.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync */
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncstatic void tstXcptSigHandler(int iSignal, siginfo_t *pSigInfo, void *pvCtx)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync{
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync#if 1
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync RTStrmPrintf(g_pStdErr, "signal %d pSigInfo=%p pvCtx=%p", iSignal, pSigInfo, pvCtx);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if (pSigInfo)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync RTStrmPrintf(g_pStdErr, " si_addr=%p si_code=%#x sival_ptr=%p sival_int=%d",
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync pSigInfo->si_addr, pSigInfo->si_code, pSigInfo->si_value.sival_ptr, pSigInfo->si_value.sival_int);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync RTStrmPrintf(g_pStdErr, "\n");
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync#endif
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if (g_iSignal == -1)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync {
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync g_iSignal = iSignal;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if (pSigInfo)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync memcpy((void *)&g_SigInfo, pSigInfo, sizeof(g_SigInfo));
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync longjmp(g_JmpBuf, 1);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync }
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync else
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync {
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync /* we're up the infamous creek... */
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync _Exit(2);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync }
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync}
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync#elif defined(RT_OS_WINDOWS)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync/** @todo */
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync//# error "PORTME"
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync#else
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync# error "PORTME"
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync#endif
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync/** Reset the current exception state and get ready for a new trap. */
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncstatic void tstXcptReset(void)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync{
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync#ifdef USE_SIGNALS
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync g_iSignal = -1;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync memset((void *)&g_SigInfo, 0, sizeof(g_SigInfo));
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync#endif
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync}
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync/** Get the current intel trap number. Returns -1 if none. */
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncstatic int tstXcptCurTrap(void)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync{
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync#ifdef USE_SIGNALS
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync /** @todo this is just a quick sketch. */
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync switch (g_iSignal)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync {
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync case SIGBUS:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync# ifdef RT_OS_DARWIN
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if (g_SigInfo.si_code == 2 /*KERN_PROTECTION_FAILURE*/)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return X86_XCPT_PF;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync# endif
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return X86_XCPT_GP;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync case SIGSEGV:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return X86_XCPT_GP;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync }
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync#endif
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return -1;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync}
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync/** Get the exception error code if applicable. */
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncstatic uint32_t tstXcptCurErr(void)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync{
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync#ifdef USE_SIGNALS
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync /** @todo this is just a quick sketch. */
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync switch (g_iSignal)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync {
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync case SIGBUS:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync# ifdef RT_OS_DARWIN
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if (g_SigInfo.si_code == 2 /*KERN_PROTECTION_FAILURE*/)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return 0;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync# endif
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync break;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync case SIGSEGV:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync break;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync }
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync#endif
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return UINT32_MAX;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync}
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsyncint main(int argc, char **argv)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync{
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync /*
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * Prolog.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync */
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync RTTEST hTest;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync int rc = RTTestInitAndCreate("exceptionsR3", &hTest);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if (rc)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return rc;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync /*
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * Parse options.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync */
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync bool volatile fRawMode = false;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync static const RTGETOPTDEF s_aOptions[] =
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync {
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync { "--raw-mode", 'r', RTGETOPT_REQ_NOTHING },
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync };
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync RTGETOPTUNION ValUnion;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync RTGETOPTSTATE GetState;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync RTGetOptInit(&GetState, argc, argv, s_aOptions, RT_ELEMENTS(s_aOptions), 1, 0);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync while ((rc = RTGetOpt(&GetState, &ValUnion)))
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync {
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync switch (rc)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync {
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync case 'r':
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync fRawMode = true;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync break;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync default:
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return RTGetOptPrintError(rc, &ValUnion);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync }
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync }
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync /*
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * Test setup.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync */
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync#ifdef USE_SIGNALS
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync struct sigaction Act;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync RT_ZERO(Act);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync Act.sa_sigaction = tstXcptSigHandler;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync Act.sa_flags = SA_SIGINFO;
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sigfillset(&Act.sa_mask);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sigaction(SIGILL, &Act, NULL);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sigaction(SIGTRAP, &Act, NULL);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync# ifdef SIGEMT
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sigaction(SIGEMT, &Act, NULL);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync# endif
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sigaction(SIGFPE, &Act, NULL);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sigaction(SIGBUS, &Act, NULL);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync sigaction(SIGSEGV, &Act, NULL);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync#else
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync /** @todo Implement this using structured exception handling on Windows and
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * OS/2. */
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync#endif
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync /*
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * The tests.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync */
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync RTTestBanner(hTest);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync TST_XCPT(NullPtrRead, X86_XCPT_PF, 0);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync TST_XCPT(NullPtrWrite, X86_XCPT_PF, 0);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync if (fRawMode)
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync {
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync TST_XCPT(SysEnter, X86_XCPT_GP, 0);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync TST_XCPT(SysCall, X86_XCPT_UD, 0);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync }
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync /*
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync * Epilog.
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync */
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync return RTTestSummaryAndDestroy(hTest);
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync}
cf22150eaeeb72431bf1cf65c309a431454fb22bvboxsync