DisasmTest.cpp revision c5d43ad1264c4b88b4316c42d2abcd16e039d972
77b1a2d8b5dbe2c0b5200794914239fee3c8ee5dvboxsync/** @file
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync *
77b1a2d8b5dbe2c0b5200794914239fee3c8ee5dvboxsync * VBox disassembler:
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync * Test application
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync */
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync
bbede9c189def47a9880f0ffb03c0c230c774185vboxsync/*
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync * Copyright (C) 2006-2007 Sun Microsystems, Inc.
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync *
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync * available from http://www.virtualbox.org. This file is free software;
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * you can redistribute it and/or modify it under the terms of the GNU
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * General Public License (GPL) as published by the Free Software
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
a16eb14ad7a4b5ef91ddc22d3e8e92d930f736fcvboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
1c94c0a63ba68be1a7b2c640e70d7a06464e4fcavboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
1c94c0a63ba68be1a7b2c640e70d7a06464e4fcavboxsync *
1c94c0a63ba68be1a7b2c640e70d7a06464e4fcavboxsync * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
1c94c0a63ba68be1a7b2c640e70d7a06464e4fcavboxsync * Clara, CA 95054 USA or visit http://www.sun.com if you need
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync * additional information or have any questions.
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync */
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync/*******************************************************************************
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync* Header Files *
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync*******************************************************************************/
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync#include <VBox/dis.h>
662d52947eeb3fc8fca3b23991a5eee47077f896vboxsync#include <VBox/err.h>
da957c069c2a3c582fe265ff88170ce4c42b499dvboxsync#include <stdio.h>
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync#include <iprt/string.h>
16a9adc14900ca18e6909679a579f6833425e030vboxsync
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsyncDECLASM(int) TestProc();
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync#ifndef RT_OS_OS2
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsyncDECLASM(int) TestProc64();
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync#endif
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync//uint8_t aCode16[] = { 0x66, 0x67, 0x89, 0x07 };
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsyncint main(int argc, char **argv)
a9f41cb889f53e8407561a6155052c441eb0fc5fvboxsync{
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync printf("VBox Disassembler Test\n");
efff36b306e370346025647a158689021df2e1d1vboxsync if (argc != 1)
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync {
590bfe12ce22cd3716448fbb9f4dc51664bfe5e2vboxsync //printf("DisasmBlock on printf:\n");
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync //DisasmBlock((uint8_t *)printf, 256);
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync }
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync else
590bfe12ce22cd3716448fbb9f4dc51664bfe5e2vboxsync {
efff36b306e370346025647a158689021df2e1d1vboxsync RTUINTPTR pInstr = (RTUINTPTR)TestProc;
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync for (int i=0;i<50;i++)
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync {
efff36b306e370346025647a158689021df2e1d1vboxsync unsigned cb;
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync DISCPUSTATE cpu;
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync char szOutput[256];
efff36b306e370346025647a158689021df2e1d1vboxsync
51fe8789a74f6c118894aaa12eb69ec155386dbdvboxsync memset(&cpu, 0, sizeof(cpu));
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync cpu.mode = CPUMODE_32BIT;
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync if (VBOX_SUCCESS(DISInstr(&cpu, pInstr, 0, &cb, szOutput)))
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync printf(szOutput);
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync else
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync {
1bf495e3eec00dd79cecb6b36ef2a97f422c3737vboxsync printf("DISOne failed!\n");
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync return 1;
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync }
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync pInstr += cb;
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync }
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync#ifndef RT_OS_OS2
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync printf("\n64 bits disassembly\n");
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync pInstr = (RTUINTPTR)TestProc64;
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync
0abd77741a608f6c41c8dfcd4781b8b84adf1044vboxsync for (int i=0;i<50;i++)
a0240ff4f7663045c848fdbc192ea3d4d9f70a11vboxsync {
9496f2d398b49813176939d7a339ae513d5175efvboxsync unsigned cb;
9496f2d398b49813176939d7a339ae513d5175efvboxsync DISCPUSTATE cpu;
9496f2d398b49813176939d7a339ae513d5175efvboxsync char szOutput[256];
9496f2d398b49813176939d7a339ae513d5175efvboxsync
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync memset(&cpu, 0, sizeof(cpu));
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync cpu.mode = CPUMODE_64BIT;
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync__debugbreak();
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync if (VBOX_SUCCESS(DISInstr(&cpu, pInstr, 0, &cb, szOutput)))
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync printf(szOutput);
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync else
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync {
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync printf("DISOne failed!\n");
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync return 1;
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync }
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync pInstr += cb;
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync }
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync#endif
d80c85a1bc7317da7d0cd1254fae6a20db039c8cvboxsync }
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync return 0;
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync}
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync
5341459ca931b65de60b5af2a4cba6836b6b45cavboxsync