65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/* $Id$ */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/** @file
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync * X86 instruction set exploration/testcase #1.
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/*
64904cbef7c0fd8bdd56c7b992f7649870c37ba8vboxsync * Copyright (C) 2011-2012 Oracle Corporation
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync *
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync * available from http://www.virtualbox.org. This file is free software;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync * you can redistribute it and/or modify it under the terms of the GNU
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync * General Public License (GPL) as published by the Free Software
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/*******************************************************************************
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync* Header Files *
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync*******************************************************************************/
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync#include <iprt/test.h>
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync#include <iprt/param.h>
78f04b74aefa851f2b51815a7260b47d5be8c776vboxsync#include <iprt/mem.h>
78f04b74aefa851f2b51815a7260b47d5be8c776vboxsync#include <iprt/err.h>
78f04b74aefa851f2b51815a7260b47d5be8c776vboxsync#include <iprt/assert.h>
1f9898006130eea293505db4e7ff762c5dde2f3avboxsync#include <iprt/x86.h>
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync#ifdef RT_OS_WINDOWS
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync# include <Windows.h>
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync#else
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync# ifdef RT_OS_DARWIN
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync# define _XOPEN_SOURCE
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync# endif
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync# include <signal.h>
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync# include <ucontext.h>
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync# define USE_SIGNAL
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync#endif
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/*******************************************************************************
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync* Structures and Typedefs *
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync*******************************************************************************/
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsynctypedef struct TRAPINFO
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync uintptr_t uTrapPC;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync uintptr_t uResumePC;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync uint8_t u8Trap;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync uint8_t cbInstr;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync uint8_t auAlignment[sizeof(uintptr_t) * 2 - 2];
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync} TRAPINFO;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsynctypedef TRAPINFO const *PCTRAPINFO;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
41f8cc7fbc412262dc183a6fc8349f1169edd3d0vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/*******************************************************************************
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync* Global Variables *
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync*******************************************************************************/
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncRT_C_DECLS_BEGIN
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncuint8_t *g_pbEfPage = NULL;
78f04b74aefa851f2b51815a7260b47d5be8c776vboxsyncuint8_t *g_pbEfExecPage = NULL;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncextern TRAPINFO g_aTrapInfo[];
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncRT_C_DECLS_END
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync/*******************************************************************************
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync* Internal Functions *
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync*******************************************************************************/
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncDECLASM(int32_t) x861_Test1(void);
9d6ec5298306cff889de1374fc0c714f42a63307vboxsyncDECLASM(int32_t) x861_Test2(void);
b891b477f403c0a8a1eea185f9bc4ef9c99caf2dvboxsyncDECLASM(int32_t) x861_Test3(void);
324e9d5fe84f23a35c4feb6853ed3ee9b3b1fad9vboxsyncDECLASM(int32_t) x861_Test4(void);
60468377ea17fdce430870d87a375af4019293bcvboxsyncDECLASM(int32_t) x861_Test5(void);
45c462a65387ada09a80826a8413c53e229b15f6vboxsyncDECLASM(int32_t) x861_Test6(void);
7dfd3f41f200bede0714c89735d9cc8d310e3f1cvboxsyncDECLASM(int32_t) x861_Test7(void);
4338d1606b19c219ef8f200aae7558a8ea7cb796vboxsyncDECLASM(int32_t) x861_TestFPUInstr1(void);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
78f04b74aefa851f2b51815a7260b47d5be8c776vboxsyncstatic PCTRAPINFO findTrapInfo(uintptr_t uTrapPC, uintptr_t uTrapSP)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
78f04b74aefa851f2b51815a7260b47d5be8c776vboxsync /* Search by trap program counter. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync for (unsigned i = 0; g_aTrapInfo[i].uTrapPC; i++)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync if (g_aTrapInfo[i].uTrapPC == uTrapPC)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return &g_aTrapInfo[i];
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
78f04b74aefa851f2b51815a7260b47d5be8c776vboxsync /* Search by return address. */
78f04b74aefa851f2b51815a7260b47d5be8c776vboxsync uintptr_t uReturn = *(uintptr_t *)uTrapSP;
78f04b74aefa851f2b51815a7260b47d5be8c776vboxsync for (unsigned i = 0; g_aTrapInfo[i].uTrapPC; i++)
78f04b74aefa851f2b51815a7260b47d5be8c776vboxsync if (g_aTrapInfo[i].uTrapPC + g_aTrapInfo[i].cbInstr == uReturn)
78f04b74aefa851f2b51815a7260b47d5be8c776vboxsync return &g_aTrapInfo[i];
78f04b74aefa851f2b51815a7260b47d5be8c776vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return NULL;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync#ifdef USE_SIGNAL
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncstatic void sigHandler(int iSig, siginfo_t *pSigInfo, void *pvSigCtx)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync ucontext_t *pCtx = (ucontext_t *)pvSigCtx;
54211a0f33e1613ca0f749141ee8ec6fc0ea5c68vboxsync NOREF(pSigInfo);
78f04b74aefa851f2b51815a7260b47d5be8c776vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync# if defined(RT_ARCH_AMD64) && defined(RT_OS_DARWIN)
78f04b74aefa851f2b51815a7260b47d5be8c776vboxsync uintptr_t *puPC = (uintptr_t *)&pCtx->uc_mcontext->__ss.__rip;
41f8cc7fbc412262dc183a6fc8349f1169edd3d0vboxsync uintptr_t *puSP = (uintptr_t *)&pCtx->uc_mcontext->__ss.__rsp;
41f8cc7fbc412262dc183a6fc8349f1169edd3d0vboxsync uintptr_t uTrapNo = pCtx->uc_mcontext->__es.__trapno;
41f8cc7fbc412262dc183a6fc8349f1169edd3d0vboxsync uintptr_t uErr = pCtx->uc_mcontext->__es.__err;
1f9898006130eea293505db4e7ff762c5dde2f3avboxsync uintptr_t uCr2 = pCtx->uc_mcontext->__es.__faultvaddr;
78f04b74aefa851f2b51815a7260b47d5be8c776vboxsync
e39e9ca944f684a8b310c320b54aa43bbaa072davboxsync# elif defined(RT_ARCH_AMD64) && defined(RT_OS_FREEBSD)
78f04b74aefa851f2b51815a7260b47d5be8c776vboxsync uintptr_t *puPC = (uintptr_t *)&pCtx->uc_mcontext.mc_rip;
41f8cc7fbc412262dc183a6fc8349f1169edd3d0vboxsync uintptr_t *puSP = (uintptr_t *)&pCtx->uc_mcontext.mc_rsp;
78f04b74aefa851f2b51815a7260b47d5be8c776vboxsync uintptr_t uTrapNo = ~(uintptr_t)0;
78f04b74aefa851f2b51815a7260b47d5be8c776vboxsync uintptr_t uErr = ~(uintptr_t)0;
1f9898006130eea293505db4e7ff762c5dde2f3avboxsync uintptr_t uCr2 = ~(uintptr_t)0;
78f04b74aefa851f2b51815a7260b47d5be8c776vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync# elif defined(RT_ARCH_AMD64)
78f04b74aefa851f2b51815a7260b47d5be8c776vboxsync uintptr_t *puPC = (uintptr_t *)&pCtx->uc_mcontext.gregs[REG_RIP];
ed19769af08e55577841c14043bf70dfee870556vboxsync uintptr_t *puSP = (uintptr_t *)&pCtx->uc_mcontext.gregs[REG_RSP];
78f04b74aefa851f2b51815a7260b47d5be8c776vboxsync uintptr_t uTrapNo = pCtx->uc_mcontext.gregs[REG_TRAPNO];
78f04b74aefa851f2b51815a7260b47d5be8c776vboxsync uintptr_t uErr = pCtx->uc_mcontext.gregs[REG_ERR];
1f9898006130eea293505db4e7ff762c5dde2f3avboxsync uintptr_t uCr2 = pCtx->uc_mcontext.gregs[REG_CR2];
78f04b74aefa851f2b51815a7260b47d5be8c776vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync# elif defined(RT_ARCH_X86) && defined(RT_OS_DARWIN)
78f04b74aefa851f2b51815a7260b47d5be8c776vboxsync uintptr_t *puPC = (uintptr_t *)&pCtx->uc_mcontext->__ss.__eip;
41f8cc7fbc412262dc183a6fc8349f1169edd3d0vboxsync uintptr_t *puSP = (uintptr_t *)&pCtx->uc_mcontext->__ss.__esp;
41f8cc7fbc412262dc183a6fc8349f1169edd3d0vboxsync uintptr_t uTrapNo = pCtx->uc_mcontext->__es.__trapno;
41f8cc7fbc412262dc183a6fc8349f1169edd3d0vboxsync uintptr_t uErr = pCtx->uc_mcontext->__es.__err;
1f9898006130eea293505db4e7ff762c5dde2f3avboxsync uintptr_t uCr2 = pCtx->uc_mcontext->__es.__faultvaddr;
78f04b74aefa851f2b51815a7260b47d5be8c776vboxsync
e39e9ca944f684a8b310c320b54aa43bbaa072davboxsync# elif defined(RT_ARCH_X86) && defined(RT_OS_FREEBSD)
78f04b74aefa851f2b51815a7260b47d5be8c776vboxsync uintptr_t *puPC = (uintptr_t *)&pCtx->uc_mcontext.mc_eip;
41f8cc7fbc412262dc183a6fc8349f1169edd3d0vboxsync uintptr_t *puSP = (uintptr_t *)&pCtx->uc_mcontext.mc_esp;
78f04b74aefa851f2b51815a7260b47d5be8c776vboxsync uintptr_t uTrapNo = ~(uintptr_t)0;
78f04b74aefa851f2b51815a7260b47d5be8c776vboxsync uintptr_t uErr = ~(uintptr_t)0;
1f9898006130eea293505db4e7ff762c5dde2f3avboxsync uintptr_t uCr2 = ~(uintptr_t)0;
78f04b74aefa851f2b51815a7260b47d5be8c776vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync# elif defined(RT_ARCH_X86)
78f04b74aefa851f2b51815a7260b47d5be8c776vboxsync uintptr_t *puPC = (uintptr_t *)&pCtx->uc_mcontext.gregs[REG_EIP];
41f8cc7fbc412262dc183a6fc8349f1169edd3d0vboxsync uintptr_t *puSP = (uintptr_t *)&pCtx->uc_mcontext.gregs[REG_ESP];
78f04b74aefa851f2b51815a7260b47d5be8c776vboxsync uintptr_t uTrapNo = pCtx->uc_mcontext.gregs[REG_TRAPNO];
78f04b74aefa851f2b51815a7260b47d5be8c776vboxsync uintptr_t uErr = pCtx->uc_mcontext.gregs[REG_ERR];
d62febb39dd135fb36e4a6cc8347a8fbb32740davboxsync# ifdef REG_CR2 /** @todo ... */
1f9898006130eea293505db4e7ff762c5dde2f3avboxsync uintptr_t uCr2 = pCtx->uc_mcontext.gregs[REG_CR2];
d62febb39dd135fb36e4a6cc8347a8fbb32740davboxsync# else
d62febb39dd135fb36e4a6cc8347a8fbb32740davboxsync uintptr_t uCr2 = ~(uintptr_t)0;
d62febb39dd135fb36e4a6cc8347a8fbb32740davboxsync# endif
78f04b74aefa851f2b51815a7260b47d5be8c776vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync# else
78f04b74aefa851f2b51815a7260b47d5be8c776vboxsync uintptr_t *puPC = NULL;
41f8cc7fbc412262dc183a6fc8349f1169edd3d0vboxsync uintptr_t *puSP = NULL;
78f04b74aefa851f2b51815a7260b47d5be8c776vboxsync uintptr_t uTrapNo = ~(uintptr_t)0;
78f04b74aefa851f2b51815a7260b47d5be8c776vboxsync uintptr_t uErr = ~(uintptr_t)0;
1f9898006130eea293505db4e7ff762c5dde2f3avboxsync uintptr_t uCr2 = ~(uintptr_t)0;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync# endif
1f9898006130eea293505db4e7ff762c5dde2f3avboxsync if (uTrapNo == X86_XCPT_PF)
1f9898006130eea293505db4e7ff762c5dde2f3avboxsync RTAssertMsg2("tstX86-1: Trap #%#04x err=%#06x at %p / %p\n", uTrapNo, uErr, *puPC, uCr2);
1f9898006130eea293505db4e7ff762c5dde2f3avboxsync else
1f9898006130eea293505db4e7ff762c5dde2f3avboxsync RTAssertMsg2("tstX86-1: Trap #%#04x err=%#06x at %p\n", uTrapNo, uErr, *puPC);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
41f8cc7fbc412262dc183a6fc8349f1169edd3d0vboxsync PCTRAPINFO pTrapInfo = findTrapInfo(*puPC, *puSP);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync if (pTrapInfo)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
41f8cc7fbc412262dc183a6fc8349f1169edd3d0vboxsync if (pTrapInfo->u8Trap != uTrapNo && uTrapNo != ~(uintptr_t)0)
41f8cc7fbc412262dc183a6fc8349f1169edd3d0vboxsync RTAssertMsg2("tstX86-1: Expected #%#04x, got #%#04x\n", pTrapInfo->u8Trap, uTrapNo);
41f8cc7fbc412262dc183a6fc8349f1169edd3d0vboxsync else
41f8cc7fbc412262dc183a6fc8349f1169edd3d0vboxsync {
41f8cc7fbc412262dc183a6fc8349f1169edd3d0vboxsync if (*puPC != pTrapInfo->uTrapPC)
41f8cc7fbc412262dc183a6fc8349f1169edd3d0vboxsync *puSP += sizeof(uintptr_t);
41f8cc7fbc412262dc183a6fc8349f1169edd3d0vboxsync *puPC = pTrapInfo->uResumePC;
41f8cc7fbc412262dc183a6fc8349f1169edd3d0vboxsync return;
41f8cc7fbc412262dc183a6fc8349f1169edd3d0vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
41f8cc7fbc412262dc183a6fc8349f1169edd3d0vboxsync else
41f8cc7fbc412262dc183a6fc8349f1169edd3d0vboxsync RTAssertMsg2("tstX86-1: Unexpected trap!\n");
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /* die */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync signal(iSig, SIG_IGN);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync#else
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync#endif
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
b891b477f403c0a8a1eea185f9bc4ef9c99caf2dvboxsync
4338d1606b19c219ef8f200aae7558a8ea7cb796vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsyncint main()
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync{
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /*
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync * Set up the test environment.
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync RTTEST hTest;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync RTEXITCODE rcExit = RTTestInitAndCreate("tstX86-1", &hTest);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync if (rcExit != RTEXITCODE_SUCCESS)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return rcExit;
78f04b74aefa851f2b51815a7260b47d5be8c776vboxsync RTTestBanner(hTest);
78f04b74aefa851f2b51815a7260b47d5be8c776vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync g_pbEfPage = (uint8_t *)RTTestGuardedAllocTail(hTest, PAGE_SIZE);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync RTTESTI_CHECK(g_pbEfPage != NULL);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
78f04b74aefa851f2b51815a7260b47d5be8c776vboxsync g_pbEfExecPage = (uint8_t *)RTMemExecAlloc(PAGE_SIZE*2);
78f04b74aefa851f2b51815a7260b47d5be8c776vboxsync RTTESTI_CHECK(g_pbEfExecPage != NULL);
78f04b74aefa851f2b51815a7260b47d5be8c776vboxsync RTTESTI_CHECK(!((uintptr_t)g_pbEfExecPage & PAGE_OFFSET_MASK));
78f04b74aefa851f2b51815a7260b47d5be8c776vboxsync RTTESTI_CHECK_RC(RTMemProtect(g_pbEfExecPage + PAGE_SIZE, PAGE_SIZE, RTMEM_PROT_NONE), VINF_SUCCESS);
78f04b74aefa851f2b51815a7260b47d5be8c776vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync#ifdef USE_SIGNAL
78f04b74aefa851f2b51815a7260b47d5be8c776vboxsync static int const s_aiSigs[] = { SIGBUS, SIGSEGV, SIGFPE, SIGILL };
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync for (unsigned i = 0; i < RT_ELEMENTS(s_aiSigs); i++)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync struct sigaction SigAct;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync RTTESTI_CHECK_BREAK(sigaction(s_aiSigs[i], NULL, &SigAct) == 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync SigAct.sa_sigaction = sigHandler;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync SigAct.sa_flags |= SA_SIGINFO;
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync RTTESTI_CHECK(sigaction(s_aiSigs[i], &SigAct, NULL) == 0);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync#else
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /** @todo implement me. */
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync#endif
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync if (!RTTestErrorCount(hTest))
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync {
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync /*
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync * Do the testing.
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync */
b891b477f403c0a8a1eea185f9bc4ef9c99caf2dvboxsync int32_t rc;
60468377ea17fdce430870d87a375af4019293bcvboxsync#if 0
b891b477f403c0a8a1eea185f9bc4ef9c99caf2dvboxsync RTTestSub(hTest, "Misc 1");
b891b477f403c0a8a1eea185f9bc4ef9c99caf2dvboxsync rc = x861_Test1();
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync if (rc != 0)
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync RTTestFailed(hTest, "x861_Test1 -> %d", rc);
9d6ec5298306cff889de1374fc0c714f42a63307vboxsync
b891b477f403c0a8a1eea185f9bc4ef9c99caf2dvboxsync RTTestSub(hTest, "Prefixes and groups");
9d6ec5298306cff889de1374fc0c714f42a63307vboxsync rc = x861_Test2();
9d6ec5298306cff889de1374fc0c714f42a63307vboxsync if (rc != 0)
9d6ec5298306cff889de1374fc0c714f42a63307vboxsync RTTestFailed(hTest, "x861_Test2 -> %d", rc);
b891b477f403c0a8a1eea185f9bc4ef9c99caf2dvboxsync
b891b477f403c0a8a1eea185f9bc4ef9c99caf2dvboxsync RTTestSub(hTest, "fxsave / fxrstor and #PFs");
b891b477f403c0a8a1eea185f9bc4ef9c99caf2dvboxsync rc = x861_Test3();
b891b477f403c0a8a1eea185f9bc4ef9c99caf2dvboxsync if (rc != 0)
b891b477f403c0a8a1eea185f9bc4ef9c99caf2dvboxsync RTTestFailed(hTest, "x861_Test3 -> %d", rc);
45c462a65387ada09a80826a8413c53e229b15f6vboxsync
324e9d5fe84f23a35c4feb6853ed3ee9b3b1fad9vboxsync RTTestSub(hTest, "Multibyte NOPs");
324e9d5fe84f23a35c4feb6853ed3ee9b3b1fad9vboxsync rc = x861_Test4();
324e9d5fe84f23a35c4feb6853ed3ee9b3b1fad9vboxsync if (rc != 0)
324e9d5fe84f23a35c4feb6853ed3ee9b3b1fad9vboxsync RTTestFailed(hTest, "x861_Test4 -> %d", rc);
7962cf168afeef286d876738dae7131c2c79ece8vboxsync//#endif
45c462a65387ada09a80826a8413c53e229b15f6vboxsync
7dfd3f41f200bede0714c89735d9cc8d310e3f1cvboxsync RTTestSub(hTest, "Odd encodings and odd ends");
60468377ea17fdce430870d87a375af4019293bcvboxsync rc = x861_Test5();
60468377ea17fdce430870d87a375af4019293bcvboxsync if (rc != 0)
60468377ea17fdce430870d87a375af4019293bcvboxsync RTTestFailed(hTest, "x861_Test5 -> %d", rc);
45c462a65387ada09a80826a8413c53e229b15f6vboxsync
7962cf168afeef286d876738dae7131c2c79ece8vboxsync//#if 0
7dfd3f41f200bede0714c89735d9cc8d310e3f1cvboxsync RTTestSub(hTest, "Odd floating point encodings");
45c462a65387ada09a80826a8413c53e229b15f6vboxsync rc = x861_Test6();
7dfd3f41f200bede0714c89735d9cc8d310e3f1cvboxsync if (rc != 0)
7dfd3f41f200bede0714c89735d9cc8d310e3f1cvboxsync RTTestFailed(hTest, "x861_Test5 -> %d", rc);
7dfd3f41f200bede0714c89735d9cc8d310e3f1cvboxsync
7dfd3f41f200bede0714c89735d9cc8d310e3f1cvboxsync RTTestSub(hTest, "Floating point exceptions ++");
7dfd3f41f200bede0714c89735d9cc8d310e3f1cvboxsync rc = x861_Test7();
45c462a65387ada09a80826a8413c53e229b15f6vboxsync if (rc != 0)
45c462a65387ada09a80826a8413c53e229b15f6vboxsync RTTestFailed(hTest, "x861_Test6 -> %d", rc);
1bdc710f98c4004b2b449c82cf550224b5372f70vboxsync#endif
4338d1606b19c219ef8f200aae7558a8ea7cb796vboxsync
4338d1606b19c219ef8f200aae7558a8ea7cb796vboxsync rc = x861_TestFPUInstr1();
4338d1606b19c219ef8f200aae7558a8ea7cb796vboxsync if (rc != 0)
4338d1606b19c219ef8f200aae7558a8ea7cb796vboxsync RTTestFailed(hTest, "x861_TestFPUInstr1 -> %d", rc);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync }
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync return RTTestSummaryAndDestroy(hTest);
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync}
65c72795ab90d3daefa759b716fbb5c6352c7a56vboxsync