/* This will contain function pointers that provide OS services */
struct v3_os_hooks {
- void (*print_info)(const char * format, ...);
- // __attribute__ ((format (printf, 1, 2)));
- void (*print_debug)(const char * format, ...);
- // __attribute__ ((format (printf, 1, 2)));
- void (*print_trace)(const char * format, ...);
- // __attribute__ ((format (printf, 1, 2)));
+ void (*print_info)(const char * format, ...)
+ __attribute__ ((format (printf, 1, 2)));
+ void (*print_debug)(const char * format, ...)
+ __attribute__ ((format (printf, 1, 2)));
+ void (*print_trace)(const char * format, ...)
+ __attribute__ ((format (printf, 1, 2)));
void *(*allocate_pages)(int numPages);
void (*free_page)(void * page);
break;
case PROTECTED:
return 0xffffffff;
+ case LONG:
+ case LONG_32_COMPAT:
+ case LONG_16_COMPAT:
default:
- V3_ASSERT(0);
- return 0;
+ PrintError("Unsupported Address Mode\n");
+ return -1;
}
}
case PROTECTED:
return addr + seg->base;
break;
+
+ case LONG:
+ // In long mode the segment bases are disregarded (forced to 0), unless using
+ // FS or GS, then the base addresses are added
+ return addr + seg->base;
+ case LONG_32_COMPAT:
+ case LONG_16_COMPAT:
default:
- V3_ASSERT(0);
- return 0;
+ PrintError("Unsupported Address Mode\n");
+ return -1;
}
}
#ifdef DEBUG_INTERRUPTS
PrintDebug("Injecting Interrupt %d (EIP=%p)\n",
guest_ctrl->guest_ctrl.V_INTR_VECTOR,
- (void *)info->rip);
+ (void *)(addr_t)info->rip);
#endif
v3_injecting_intr(info, irq, EXTERNAL_IRQ);
#ifdef DEBUG_INTERRUPTS
PrintDebug("Injecting Interrupt %d (EIP=%p)\n",
guest_ctrl->EVENTINJ.vector,
- (void *)info->rip);
+ (void *)(addr_t)info->rip);
#endif
v3_injecting_intr(info, excp, EXCEPTION);
break;
mask = get_gpr_mask(info);
PrintDebug("INS io_info invalid address size, mask=0x%p, io_info=0x%p\n",
- (void *)mask, (void *)(io_info));
+ (void *)(addr_t)mask, (void *)(addr_t)(io_info));
// PrintDebug("INS Aborted... Check implementation\n");
//return -1;
}
mask = get_gpr_mask(info);
PrintDebug("OUTS io_info invalid address size, mask=0%p, io_info=0x%p\n",
- (void *)mask, (void *)io_info);
+ (void *)(addr_t)mask, (void *)(addr_t)io_info);
// PrintDebug("INS Aborted... Check implementation\n");
//return -1;
// should never happen
shadow_pt = v3_create_new_shadow_pt32();
shadow_cr3->pdt_base_addr = (addr_t)V3_PAddr((void *)(addr_t)PD32_BASE_ADDR(shadow_pt));
- PrintDebug( "Created new shadow page table %p\n", shadow_cr3->pdt_base_addr );
+ PrintDebug( "Created new shadow page table %p\n", (void *)(addr_t)shadow_cr3->pdt_base_addr );
//PrintDebugPageTables( (pde32_t *)CR3_TO_PDE32(*(uint_t*)shadow_cr3) );
PrintDebug("IO Hooks(%d) for Device: %s\n", dev->num_io_hooks, dev->name);
list_for_each_entry(hook, &(dev->io_hooks), dev_list) {
- PrintDebug("\tPort: 0x%x (read=0x%x), (write=0x%x)\n", hook->port, hook->read, hook->write);
+ PrintDebug("\tPort: 0x%x (read=0x%p), (write=0x%p)\n", hook->port,
+ (void *)(addr_t)(hook->read),
+ (void *)(addr_t)(hook->write));
}
return;
}
#ifdef DEBUG_EMULATOR
- PrintDebug("Instr (15 bytes) at %x:\n", instr);
+ PrintDebug("Instr (15 bytes) at %p:\n", (void *)(addr_t)instr);
PrintTraceMemDump(instr, 15);
#endif
pte32_t saved_pte;
int i;
- PrintDebug("Emulating Write for instruction at 0x%x\n",info->rip);
+ PrintDebug("Emulating Write for instruction at 0x%p\n", (void *)(addr_t)(info->rip));
if (info->mem_mode == PHYSICAL_MEM) {
ret = read_guest_pa_memory(info, get_addr_linear(info, info->rip, &(info->segments.cs)), 15, instr);
list_for_each_entry_safe(empg, p_empg, &(info->emulator.emulated_pages), page_list) {
pte32_t empte32_t;
- PrintDebug("wiping page %x\n", empg->va);
+ PrintDebug("wiping page %p\n", (void *)(addr_t)(empg->va));
v3_replace_shdw_page32(info, empg->va, &dummy_pte, &empte32_t);
V3_FreePage((void *)(V3_PAddr((void *)(empg->page_addr))));
list_for_each_entry_safe(svpg, p_svpg, &(info->emulator.saved_pages), page_list) {
- PrintDebug("Setting Saved page %x back\n", svpg->va);
+ PrintDebug("Setting Saved page %p back\n", (void *)(addr_t)(svpg->va));
v3_replace_shdw_page32(info, empg->va, &(svpg->pte), &dummy_pte);
list_del(&(svpg->page_list));
//info->rip += info->emulator.instr_length;
- PrintDebug("Returning to rip: 0x%x\n", info->rip);
+ PrintDebug("Returning to rip: 0x%p\n", (void *)(addr_t)(info->rip));
info->emulator.instr_length = 0;
return 0;
}
- PrintDebug("Returning end of PDE function (rip=%p)\n", (void *)(info->rip));
+ PrintDebug("Returning end of PDE function (rip=%p)\n", (void *)(addr_t)(info->rip));
return 0;
}