summaryrefslogtreecommitdiff
path: root/sys/src/cmd/vmx/exith.c
diff options
context:
space:
mode:
authoraiju <devnull@localhost>2017-08-24 08:06:41 +0000
committeraiju <devnull@localhost>2017-08-24 08:06:41 +0000
commit8968426327c93f47ff0d8123941b7d1d2077d6c7 (patch)
treef36f589c3a2dad2dbcf24ad9f72b2c1df98def38 /sys/src/cmd/vmx/exith.c
parent9616f6187202900fa8d86d197d5b7bc56f83609b (diff)
vmx(1): memory map improvements, x86 simulator for MMIO
Diffstat (limited to 'sys/src/cmd/vmx/exith.c')
-rw-r--r--sys/src/cmd/vmx/exith.c84
1 files changed, 6 insertions, 78 deletions
diff --git a/sys/src/cmd/vmx/exith.c b/sys/src/cmd/vmx/exith.c
index ff1bcdf1d..48f054c01 100644
--- a/sys/src/cmd/vmx/exith.c
+++ b/sys/src/cmd/vmx/exith.c
@@ -16,12 +16,15 @@ struct ExitInfo {
u32int ilen, iinfo;
};
-static char *x86reg[16] = {
+char *x86reg[16] = {
RAX, RCX, RDX, RBX,
RSP, RBP, RSI, RDI,
R8, R9, R10, R11,
R12, R13, R14, R15
};
+char *x86segreg[8] = {
+ "cs", "ds", "es", "fs", "gs", "ss",
+};
static void
skipinstr(ExitInfo *ei)
@@ -29,44 +32,6 @@ skipinstr(ExitInfo *ei)
rset(RPC, rget(RPC) + ei->ilen);
}
-static int
-stepmmio(uvlong pa, uvlong *val, int size, ExitInfo *ei)
-{
- extern uchar *tmp;
- extern uvlong tmpoff;
- void *targ;
- uvlong pc;
- char buf[ERRMAX];
- extern int getexit;
-
- memset(tmp, 0, BY2PG);
- targ = tmp + (pa & 0xfff);
- switch(size){
- case 1: *(u8int*)targ = *val; break;
- case 2: *(u16int*)targ = *val; break;
- case 4: *(u32int*)targ = *val; break;
- case 8: *(u64int*)targ = *val; break;
- }
- pc = rget(RPC);
- rcflush(0);
- if(ctl("step -map %#ullx vm %#ullx", pa & ~0xfff, tmpoff) < 0){
- rerrstr(buf, sizeof(buf));
- if(strcmp(buf, "step failed") == 0){
- vmerror("vmx step failure (old pc=%#ullx, new pc=%#ullx, cause=%#q)", pc, rget(RPC), ei->raw);
- getexit++;
- return -1;
- }
- sysfatal("ctl(stepmmio): %r");
- }
- switch(size){
- case 1: *val = *(u8int*)targ; break;
- case 2: *val = *(u16int*)targ; break;
- case 4: *val = *(u32int*)targ; break;
- case 8: *val = *(u64int*)targ; break;
- }
- return 0;
-}
-
static void
iohandler(ExitInfo *ei)
{
@@ -130,15 +95,6 @@ err:
rsetsz(RSI, addr, asz);
}
-typedef struct MemHandler MemHandler;
-struct MemHandler {
- uvlong lo, hi;
- uvlong (*f)(int, uvlong, uvlong);
-};
-
-MemHandler memh[32];
-int nmemh;
-
static uvlong
defaultmmio(int op, uvlong addr, uvlong val)
{
@@ -156,36 +112,8 @@ defaultmmio(int op, uvlong addr, uvlong val)
static void
eptfault(ExitInfo *ei)
{
- MemHandler *h;
- static MemHandler def = {.f defaultmmio};
- int size;
- uvlong val;
-
- for(h = memh; h < memh + nmemh; h++)
- if(ei->pa >= h->lo && ei->pa <= h->hi)
- break;
- if(h == memh + nmemh)
- h = &def;
- size = 8;
- if((ei->qual & 5) != 0){
- val = h->f(MMIORD, ei->pa, 0);
- stepmmio(ei->pa, &val, size, ei);
- }else{
- val = h->f(MMIOWRP, ei->pa, 0);
- if(stepmmio(ei->pa, &val, size, ei) < 0)
- return;
- h->f(MMIOWR, ei->pa, val);
- }
-}
-
-void
-registermmio(uvlong lo, uvlong hi, uvlong (*f)(int, uvlong, uvlong))
-{
- assert(nmemh < nelem(memh));
- memh[nmemh].lo = lo;
- memh[nmemh].hi = hi;
- memh[nmemh].f = f;
- nmemh++;
+ if(x86step() > 0)
+ skipinstr(ei);
}
typedef struct CPUID CPUID;