int v3_init_svm_io_map(struct v3_vm_info * vm) {
+ void *temp;
+
vm->io_map.update_map = update_map;
- vm->io_map.arch_data = V3_VAddr(V3_AllocPages(3));
+ temp = V3_AllocPages(3); // need not be shadow-safe, not exposed to guest
+
+ if (!temp) {
+ PrintError(vm, VCORE_NONE, "Cannot allocate io bitmap\n");
+ return -1;
+ }
+
+ vm->io_map.arch_data = V3_VAddr(temp);
+
memset(vm->io_map.arch_data, 0xff, PAGE_SIZE_4KB * 3);
read_size = 4;
}
- PrintDebug("IN of %d bytes on port %d (0x%x)\n", read_size, io_info->port, io_info->port);
+ PrintDebug(core->vm_info, core, "IN of %d bytes on port %d (0x%x)\n", read_size, io_info->port, io_info->port);
if (hook == NULL) {
- PrintDebug("IN operation on unhooked IO port 0x%x - returning zero\n", io_info->port);
+ PrintDebug(core->vm_info, core, "IN operation on unhooked IO port 0x%x - returning zero\n", io_info->port);
core->vm_regs.rax >>= 8*read_size;
core->vm_regs.rax <<= 8*read_size;
} else {
if (hook->read(core, io_info->port, &(core->vm_regs.rax), read_size, hook->priv_data) != read_size) {
// not sure how we handle errors.....
- PrintError("Read Failure for in on port 0x%x\n", io_info->port);
+ PrintError(core->vm_info, core, "Read Failure for in on port 0x%x\n", io_info->port);
return -1;
}
}
if (v3_gva_to_hva(core, get_addr_linear(core, core->rip, &(core->segments.cs)), &inst_ptr) == -1) {
- PrintError("Can't access instruction\n");
+ PrintError(core->vm_info, core, "Can't access instruction\n");
return -1;
}
}
- PrintDebug("INS on port %d (0x%x)\n", io_info->port, io_info->port);
+ PrintDebug(core->vm_info, core, "INS on port %d (0x%x)\n", io_info->port, io_info->port);
if (io_info->sz8) {
read_size = 1;
} else if (io_info->sz32) {
read_size = 4;
} else {
- PrintError("io_info Invalid Size\n");
+ PrintError(core->vm_info, core, "io_info Invalid Size\n");
return -1;
}
// This value should be set depending on the host register size...
mask = get_gpr_mask(core);
- PrintDebug("INS io_info invalid address size, mask=0x%p, io_info=0x%p\n",
+ PrintDebug(core->vm_info, core, "INS io_info invalid address size, mask=0x%p, io_info=0x%p\n",
(void *)(addr_t)mask, (void *)(addr_t)(io_info));
- // PrintDebug("INS Aborted... Check implementation\n");
+ // PrintDebug(core->vm_info, core, "INS Aborted... Check implementation\n");
//return -1;
}
//rep_num = info->vm_regs.rcx;
}
- PrintDebug("INS size=%d for %d steps\n", read_size, rep_num);
+ PrintDebug(core->vm_info, core, "INS size=%d for %d steps\n", read_size, rep_num);
while (rep_num > 0) {
addr_t host_addr;
dst_addr = get_addr_linear(core, (core->vm_regs.rdi & mask), theseg);
- // PrintDebug("Writing 0x%p\n", (void *)dst_addr);
+ // PrintDebug(core->vm_info, core, "Writing 0x%p\n", (void *)dst_addr);
if (v3_gva_to_hva(core, dst_addr, &host_addr) == -1) {
// either page fault or gpf...
- PrintError("Could not convert Guest VA to host VA\n");
+ PrintError(core->vm_info, core, "Could not convert Guest VA to host VA\n");
return -1;
}
if (hook == NULL) {
- PrintDebug("INS operation on unhooked IO port 0x%x - returning zeros\n", io_info->port);
+ PrintDebug(core->vm_info, core, "INS operation on unhooked IO port 0x%x - returning zeros\n", io_info->port);
memset((char*)host_addr,0,read_size);
} else {
if (hook->read(core, io_info->port, (char *)host_addr, read_size, hook->priv_data) != read_size) {
// not sure how we handle errors.....
- PrintError("Read Failure for ins on port 0x%x\n", io_info->port);
+ PrintError(core->vm_info, core, "Read Failure for ins on port 0x%x\n", io_info->port);
return -1;
}
}
write_size = 4;
}
- PrintDebug("OUT of %d bytes on port %d (0x%x)\n", write_size, io_info->port, io_info->port);
+ PrintDebug(core->vm_info, core, "OUT of %d bytes on port %d (0x%x)\n", write_size, io_info->port, io_info->port);
if (hook == NULL) {
- PrintDebug("OUT operation on unhooked IO port 0x%x - ignored\n", io_info->port);
+ PrintDebug(core->vm_info, core, "OUT operation on unhooked IO port 0x%x - ignored\n", io_info->port);
} else {
if (hook->write(core, io_info->port, &(core->vm_regs.rax), write_size, hook->priv_data) != write_size) {
// not sure how we handle errors.....
- PrintError("Write Failure for out on port 0x%x\n", io_info->port);
+ PrintError(core->vm_info, core, "Write Failure for out on port 0x%x\n", io_info->port);
return -1;
}
}
direction = -1;
}
- PrintDebug("OUTS on port %d (0x%x)\n", io_info->port, io_info->port);
+ PrintDebug(core->vm_info, core, "OUTS on port %d (0x%x)\n", io_info->port, io_info->port);
if (io_info->sz8) {
write_size = 1;
// This value should be set depending on the host register size...
mask = get_gpr_mask(core);
- PrintDebug("OUTS io_info invalid address size, mask=0%p, io_info=0x%p\n",
+ PrintDebug(core->vm_info, core, "OUTS io_info invalid address size, mask=0%p, io_info=0x%p\n",
(void *)(addr_t)mask, (void *)(addr_t)io_info);
- // PrintDebug("INS Aborted... Check implementation\n");
+ // PrintDebug(core->vm_info, core, "INS Aborted... Check implementation\n");
//return -1;
// should never happen
- //PrintDebug("Invalid Address length\n");
+ //PrintDebug(core->vm_info, core, "Invalid Address length\n");
//return -1;
}
if (v3_gva_to_hva(core, get_addr_linear(core, core->rip, &(core->segments.cs)), &inst_ptr) == -1) {
- PrintError("Can't access instruction\n");
+ PrintError(core->vm_info, core, "Can't access instruction\n");
return -1;
}
inst_ptr++;
}
- PrintDebug("OUTS size=%d for %d steps\n", write_size, rep_num);
+ PrintDebug(core->vm_info, core, "OUTS size=%d for %d steps\n", write_size, rep_num);
while (rep_num > 0) {
addr_t host_addr = 0;
dst_addr = get_addr_linear(core, (core->vm_regs.rsi & mask), theseg);
if (v3_gva_to_hva(core, dst_addr, &host_addr) == -1) {
- PrintError("Could not translate outs dest addr, either page fault or gpf...\n");
+ PrintError(core->vm_info, core, "Could not translate outs dest addr, either page fault or gpf...\n");
return -1;
}
if (hook == NULL) {
- PrintDebug("OUTS operation on unhooked IO port 0x%x - ignored\n", io_info->port);
+ PrintDebug(core->vm_info, core, "OUTS operation on unhooked IO port 0x%x - ignored\n", io_info->port);
} else {
if (hook->write(core, io_info->port, (char*)host_addr, write_size, hook->priv_data) != write_size) {
// not sure how we handle errors.....
- PrintError("Write Failure for outs on port 0x%x\n", io_info->port);
+ PrintError(core->vm_info, core, "Write Failure for outs on port 0x%x\n", io_info->port);
return -1;
}
}