📄 vex_main.c
字号:
vassert(sizeof( ((VexGuestPPC64State*)0)->guest_NRADDR_GPR2) == 8); break; default: vpanic("LibVEX_Translate: unsupported guest insn set"); } /* yet more sanity checks ... */ if (vta->arch_guest == vta->arch_host) { /* doesn't necessarily have to be true, but if it isn't it means we are simulating one flavour of an architecture a different flavour of the same architecture, which is pretty strange. */ vassert(vta->archinfo_guest.hwcaps == vta->archinfo_host.hwcaps); } vexAllocSanityCheck(); if (vex_traceflags & VEX_TRACE_FE) vex_printf("\n------------------------" " Front end " "------------------------\n\n"); irbb = bb_to_IR ( vta->guest_extents, vta->callback_opaque, disInstrFn, vta->guest_bytes, vta->guest_bytes_addr, vta->chase_into_ok, host_is_bigendian, vta->arch_guest, &vta->archinfo_guest, guest_word_type, vta->do_self_check, vta->preamble_function, offB_TISTART, offB_TILEN ); vexAllocSanityCheck(); if (irbb == NULL) { /* Access failure. */ vexSetAllocModeTEMP_and_clear(); vex_traceflags = 0; return VexTransAccessFail; } vassert(vta->guest_extents->n_used >= 1 && vta->guest_extents->n_used <= 3); vassert(vta->guest_extents->base[0] == vta->guest_bytes_addr); for (i = 0; i < vta->guest_extents->n_used; i++) { vassert(vta->guest_extents->len[i] < 10000); /* sanity */ } /* If debugging, show the raw guest bytes for this bb. */ if (0 || (vex_traceflags & VEX_TRACE_FE)) { if (vta->guest_extents->n_used > 1) { vex_printf("can't show code due to extents > 1\n"); } else { /* HACK */ UChar* p = (UChar*)vta->guest_bytes; UInt guest_bytes_read = (UInt)vta->guest_extents->len[0]; vex_printf(". 0 %llx %u\n.", vta->guest_bytes_addr, guest_bytes_read ); for (i = 0; i < guest_bytes_read; i++) vex_printf(" %02x", (Int)p[i] ); vex_printf("\n\n"); } } /* Sanity check the initial IR. */ sanityCheckIRBB( irbb, "initial IR", False/*can be non-flat*/, guest_word_type ); vexAllocSanityCheck(); /* Clean it up, hopefully a lot. */ irbb = do_iropt_BB ( irbb, specHelper, preciseMemExnsFn, vta->guest_bytes_addr ); sanityCheckIRBB( irbb, "after initial iropt", True/*must be flat*/, guest_word_type ); if (vex_traceflags & VEX_TRACE_OPT1) { vex_printf("\n------------------------" " After pre-instr IR optimisation " "------------------------\n\n"); ppIRBB ( irbb ); vex_printf("\n"); } vexAllocSanityCheck(); /* Get the thing instrumented. */ if (vta->instrument1) irbb = vta->instrument1(vta->callback_opaque, irbb, guest_layout, vta->guest_extents, guest_word_type, host_word_type); vexAllocSanityCheck(); if (vta->instrument2) irbb = vta->instrument2(vta->callback_opaque, irbb, guest_layout, vta->guest_extents, guest_word_type, host_word_type); if (vex_traceflags & VEX_TRACE_INST) { vex_printf("\n------------------------" " After instrumentation " "------------------------\n\n"); ppIRBB ( irbb ); vex_printf("\n"); } if (vta->instrument1 || vta->instrument2) sanityCheckIRBB( irbb, "after instrumentation", True/*must be flat*/, guest_word_type ); /* Do a post-instrumentation cleanup pass. */ if (vta->instrument1 || vta->instrument2) { do_deadcode_BB( irbb ); irbb = cprop_BB( irbb ); do_deadcode_BB( irbb ); sanityCheckIRBB( irbb, "after post-instrumentation cleanup", True/*must be flat*/, guest_word_type ); } vexAllocSanityCheck(); if (vex_traceflags & VEX_TRACE_OPT2) { vex_printf("\n------------------------" " After post-instr IR optimisation " "------------------------\n\n"); ppIRBB ( irbb ); vex_printf("\n"); } /* Turn it into virtual-registerised code. Build trees -- this also throws away any dead bindings. */ ado_treebuild_BB( irbb ); vexAllocSanityCheck(); if (vex_traceflags & VEX_TRACE_TREES) { vex_printf("\n------------------------" " After tree-building " "------------------------\n\n"); ppIRBB ( irbb ); vex_printf("\n"); } /* HACK */ if (0) { *(vta->host_bytes_used) = 0; return VexTransOK; } /* end HACK */ if (vex_traceflags & VEX_TRACE_VCODE) vex_printf("\n------------------------" " Instruction selection " "------------------------\n"); vcode = iselBB ( irbb, vta->arch_host, &vta->archinfo_host ); vexAllocSanityCheck(); if (vex_traceflags & VEX_TRACE_VCODE) vex_printf("\n"); if (vex_traceflags & VEX_TRACE_VCODE) { for (i = 0; i < vcode->arr_used; i++) { vex_printf("%3d ", i); ppInstr(vcode->arr[i], mode64); vex_printf("\n"); } vex_printf("\n"); } /* Register allocate. */ rcode = doRegisterAllocation ( vcode, available_real_regs, n_available_real_regs, isMove, getRegUsage, mapRegs, genSpill, genReload, guest_sizeB, ppInstr, ppReg, mode64 ); vexAllocSanityCheck(); if (vex_traceflags & VEX_TRACE_RCODE) { vex_printf("\n------------------------" " Register-allocated code " "------------------------\n\n"); for (i = 0; i < rcode->arr_used; i++) { vex_printf("%3d ", i); ppInstr(rcode->arr[i], mode64); vex_printf("\n"); } vex_printf("\n"); } /* HACK */ if (0) { *(vta->host_bytes_used) = 0; return VexTransOK; } /* end HACK */ /* Assemble */ if (vex_traceflags & VEX_TRACE_ASM) { vex_printf("\n------------------------" " Assembly " "------------------------\n\n"); } out_used = 0; /* tracks along the host_bytes array */ for (i = 0; i < rcode->arr_used; i++) { if (vex_traceflags & VEX_TRACE_ASM) { ppInstr(rcode->arr[i], mode64); vex_printf("\n"); } j = (*emit)( insn_bytes, 32, rcode->arr[i], mode64, vta->dispatch ); if (vex_traceflags & VEX_TRACE_ASM) { for (k = 0; k < j; k++) if (insn_bytes[k] < 16) vex_printf("0%x ", (UInt)insn_bytes[k]); else vex_printf("%x ", (UInt)insn_bytes[k]); vex_printf("\n\n"); } if (out_used + j > vta->host_bytes_size) { vexSetAllocModeTEMP_and_clear(); vex_traceflags = 0; return VexTransOutputFull; } for (k = 0; k < j; k++) { vta->host_bytes[out_used] = insn_bytes[k]; out_used++; } vassert(out_used <= vta->host_bytes_size); } *(vta->host_bytes_used) = out_used; vexAllocSanityCheck(); vexSetAllocModeTEMP_and_clear(); vex_traceflags = 0; return VexTransOK;}/* --------- Emulation warnings. --------- */HChar* LibVEX_EmWarn_string ( VexEmWarn ew ){ switch (ew) { case EmWarn_NONE: return "none"; case EmWarn_X86_x87exns: return "Unmasking x87 FP exceptions"; case EmWarn_X86_x87precision: return "Selection of non-80-bit x87 FP precision"; case EmWarn_X86_sseExns: return "Unmasking SSE FP exceptions"; case EmWarn_X86_fz: return "Setting %mxcsr.fz (SSE flush-underflows-to-zero mode)"; case EmWarn_X86_daz: return "Setting %mxcsr.daz (SSE treat-denormals-as-zero mode)"; case EmWarn_X86_acFlag: return "Setting %eflags.ac (setting noted but ignored)"; case EmWarn_PPCexns: return "Unmasking PPC32/64 FP exceptions"; case EmWarn_PPC64_redir_overflow: return "PPC64 function redirection stack overflow"; case EmWarn_PPC64_redir_underflow: return "PPC64 function redirection stack underflow"; default: vpanic("LibVEX_EmWarn_string: unknown warning"); }}/* ------------------ Arch/HwCaps stuff. ------------------ */const HChar* LibVEX_ppVexArch ( VexArch arch ){ switch (arch) { case VexArch_INVALID: return "INVALID"; case VexArchX86: return "X86"; case VexArchAMD64: return "AMD64"; case VexArchARM: return "ARM"; case VexArchPPC32: return "PPC32"; case VexArchPPC64: return "PPC64"; default: return "VexArch???"; }}const HChar* LibVEX_ppVexHwCaps ( VexArch arch, UInt hwcaps ){ HChar* str = show_hwcaps(arch,hwcaps); return str ? str : "INVALID";}/* Write default settings info *vai. */void LibVEX_default_VexArchInfo ( /*OUT*/VexArchInfo* vai ){ vai->hwcaps = 0; vai->ppc_cache_line_szB = 0;}/* Return a string showing the hwcaps in a nice way. The string will be NULL for invalid combinations of flags, so these functions also serve as a way to validate hwcaps values. */static HChar* show_hwcaps_x86 ( UInt hwcaps ) { /* Monotonic, SSE3 > SSE2 > SSE1 > baseline. */ if (hwcaps == 0) return "x86-sse0"; if (hwcaps == VEX_HWCAPS_X86_SSE1) return "x86-sse1"; if (hwcaps == (VEX_HWCAPS_X86_SSE1 | VEX_HWCAPS_X86_SSE2)) return "x86-sse1-sse2"; if (hwcaps == (VEX_HWCAPS_X86_SSE1 | VEX_HWCAPS_X86_SSE2 | VEX_HWCAPS_X86_SSE3)) return "x86-sse1-sse2-sse3"; return False;}static HChar* show_hwcaps_amd64 ( UInt hwcaps ){ /* Monotonic, SSE3 > baseline. */ if (hwcaps == 0) return "amd64-sse2"; if (hwcaps == VEX_HWCAPS_AMD64_SSE3) return "amd64-sse3"; return False;}static HChar* show_hwcaps_ppc32 ( UInt hwcaps ){ /* Monotonic with complications. Basically V > F > baseline, but once you have F then you can have FX or GX too. */ const UInt F = VEX_HWCAPS_PPC32_F; const UInt V = VEX_HWCAPS_PPC32_V; const UInt FX = VEX_HWCAPS_PPC32_FX; const UInt GX = VEX_HWCAPS_PPC32_GX; UInt c = hwcaps; if (c == 0) return "ppc32-int"; if (c == F) return "ppc32-int-flt"; if (c == (F|FX)) return "ppc32-int-flt-FX"; if (c == (F|GX)) return "ppc32-int-flt-GX"; if (c == (F|FX|GX)) return "ppc32-int-flt-FX-GX"; if (c == (F|V)) return "ppc32-int-flt-vmx"; if (c == (F|V|FX)) return "ppc32-int-flt-vmx-FX"; if (c == (F|V|GX)) return "ppc32-int-flt-vmx-GX"; if (c == (F|V|FX|GX)) return "ppc32-int-flt-vmx-FX-GX"; return NULL;}static HChar* show_hwcaps_ppc64 ( UInt hwcaps ){ /* Monotonic with complications. Basically V > baseline(==F), but once you have F then you can have FX or GX too. */ const UInt V = VEX_HWCAPS_PPC64_V; const UInt FX = VEX_HWCAPS_PPC64_FX; const UInt GX = VEX_HWCAPS_PPC64_GX; UInt c = hwcaps; if (c == 0) return "ppc64-int-flt"; if (c == FX) return "ppc64-int-flt-FX"; if (c == GX) return "ppc64-int-flt-GX"; if (c == (FX|GX)) return "ppc64-int-flt-FX-GX"; if (c == V) return "ppc64-int-flt-vmx"; if (c == (V|FX)) return "ppc64-int-flt-vmx-FX"; if (c == (V|GX)) return "ppc64-int-flt-vmx-GX"; if (c == (V|FX|GX)) return "ppc64-int-flt-vmx-FX-GX"; return NULL;}static HChar* show_hwcaps_arm ( UInt hwcaps ){ if (hwcaps == 0) return "arm-baseline"; return NULL;}/* ---- */static HChar* show_hwcaps ( VexArch arch, UInt hwcaps ){ switch (arch) { case VexArchX86: return show_hwcaps_x86(hwcaps); case VexArchAMD64: return show_hwcaps_amd64(hwcaps); case VexArchPPC32: return show_hwcaps_ppc32(hwcaps); case VexArchPPC64: return show_hwcaps_ppc64(hwcaps); case VexArchARM: return show_hwcaps_arm(hwcaps); default: return NULL; }}static Bool are_valid_hwcaps ( VexArch arch, UInt hwcaps ){ return show_hwcaps(arch,hwcaps) != NULL;}/*---------------------------------------------------------------*//*--- end main/vex_main.c ---*//*---------------------------------------------------------------*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -