-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathVirtualCpuX86Test.cpp
75 lines (56 loc) · 1.82 KB
/
VirtualCpuX86Test.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
#include <stdio.h>
#include <stdlib.h>
#include <OS.h>
#include "Loader.h"
#include "VirtualCpuX86Native.h"
area_id vm32_create_area(const char *name, void **address, uint32 addressSpec, size_t size, uint32 lock, uint32 protection);
void WritePC(uint64 pc);
static bool TrapHandler(VirtualCpuX86Native &cpu)
{
uint32 op = *((uint32*)cpu.Regs()[4] + 1);
//printf("op: %#" B_PRIx32 "\n", op);
switch (op) {
case 1:
return true;
break;
case 2:
printf("%s", (const char *)(*((uint32*)cpu.Regs()[4] + 2)));
break;
default:
abort();
}
return false;
}
void VirtualCpuX86Test()
{
for (int i = 0; i < 1; i++) {
printf("+VirtualCpuX86Test\n");
ObjectDeleter<ElfImage> image(ElfImage::Load("../TestX86"));
size_t stackSize = 0x100000;
uint8 *stack;
AreaDeleter stackArea(vm32_create_area("thread", (void**)&stack, B_ANY_ADDRESS, stackSize, B_NO_LOCK, B_READ_AREA | B_WRITE_AREA));
VirtualCpuX86Native cpu;
printf("image.GetImageBase(): %p\n", image->GetImageBase());
printf("cpu.RetProcAdr(): %#" B_PRIx32 "\n", cpu.RetProcAdr());
printf("cpu.RetProcArg(): %#" B_PRIx32 "\n", cpu.RetProcArg());
void *symAdr;
if (!image->FindSymbol("gRetProc", &symAdr, NULL)) abort();
*(uint32*)symAdr = cpu.RetProcAdr();
if (!image->FindSymbol("gRetProcArg", &symAdr, NULL)) abort();
*(uint32*)symAdr = cpu.RetProcArg();
uint32 *sp = (uint32*)(stack + stackSize);
cpu.Ip() = (uint32)(addr_t)image->GetEntry();
cpu.Regs()[4] = (uint32)(addr_t)sp;
printf("IP: "); WritePC(cpu.Ip()); printf("\n");
printf("SP: %#" B_PRIx32 "\n", cpu.Regs()[4]);
printf("+Run()\n");
while (true) {
cpu.Run();
if (TrapHandler(cpu)) break;
}
printf("-Run()\n");
printf("IP: "); WritePC(cpu.Ip()); printf("\n");
printf("SP: %#" B_PRIx32 "\n", cpu.Regs()[4]);
printf("-VirtualCpuX86Test\n");
}
}