📄 vex_main.c
字号:
preciseMemExnsFn = guest_x86_state_requires_precise_mem_exns; disInstrFn = disInstr_X86; specHelper = guest_x86_spechelper; guest_sizeB = sizeof(VexGuestX86State); guest_word_type = Ity_I32; guest_layout = &x86guest_layout; offB_TISTART = offsetof(VexGuestX86State,guest_TISTART); offB_TILEN = offsetof(VexGuestX86State,guest_TILEN); vassert(archinfo_guest->subarch == VexSubArchX86_sse0 || archinfo_guest->subarch == VexSubArchX86_sse1 || archinfo_guest->subarch == VexSubArchX86_sse2); vassert(sizeof( ((VexGuestX86State*)0)->guest_TISTART ) == 4); vassert(sizeof( ((VexGuestX86State*)0)->guest_TILEN ) == 4); break; case VexArchAMD64: preciseMemExnsFn = guest_amd64_state_requires_precise_mem_exns; disInstrFn = disInstr_AMD64; specHelper = guest_amd64_spechelper; guest_sizeB = sizeof(VexGuestAMD64State); guest_word_type = Ity_I64; guest_layout = &amd64guest_layout; offB_TISTART = offsetof(VexGuestAMD64State,guest_TISTART); offB_TILEN = offsetof(VexGuestAMD64State,guest_TILEN); vassert(archinfo_guest->subarch == VexSubArch_NONE); vassert(sizeof( ((VexGuestAMD64State*)0)->guest_TISTART ) == 8); vassert(sizeof( ((VexGuestAMD64State*)0)->guest_TILEN ) == 8); break; case VexArchARM: preciseMemExnsFn = guest_arm_state_requires_precise_mem_exns; disInstrFn = NULL; /* HACK */ specHelper = guest_arm_spechelper; guest_sizeB = sizeof(VexGuestARMState); guest_word_type = Ity_I32; guest_layout = &armGuest_layout; offB_TISTART = 0; /* hack ... arm has bitrot */ offB_TILEN = 0; /* hack ... arm has bitrot */ vassert(archinfo_guest->subarch == VexSubArchARM_v4); break; case VexArchPPC32: preciseMemExnsFn = guest_ppc32_state_requires_precise_mem_exns; disInstrFn = disInstr_PPC32; specHelper = guest_ppc32_spechelper; guest_sizeB = sizeof(VexGuestPPC32State); guest_word_type = Ity_I32; guest_layout = &ppc32Guest_layout; offB_TISTART = offsetof(VexGuestPPC32State,guest_TISTART); offB_TILEN = offsetof(VexGuestPPC32State,guest_TILEN); vassert(archinfo_guest->subarch == VexSubArchPPC32_noAV || archinfo_guest->subarch == VexSubArchPPC32_AV); vassert(sizeof( ((VexGuestPPC32State*)0)->guest_TISTART ) == 4); vassert(sizeof( ((VexGuestPPC32State*)0)->guest_TILEN ) == 4); break; default: vpanic("LibVEX_Translate: unsupported guest insn set"); } /* yet more sanity checks ... */ if (arch_guest == 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(archinfo_guest->subarch == archinfo_host->subarch); } if (vex_traceflags & VEX_TRACE_FE) vex_printf("\n------------------------" " Front end " "------------------------\n\n"); irbb = bb_to_IR ( guest_extents, disInstrFn, guest_bytes, guest_bytes_addr, chase_into_ok, host_is_bigendian, archinfo_guest, guest_word_type, do_self_check, offB_TISTART, offB_TILEN ); if (irbb == NULL) { /* Access failure. */ vexClearTEMP(); vex_traceflags = 0; return VexTransAccessFail; } vassert(guest_extents->n_used >= 1 && guest_extents->n_used <= 3); vassert(guest_extents->base[0] == guest_bytes_addr); for (i = 0; i < guest_extents->n_used; i++) { vassert(guest_extents->len[i] < 10000); /* sanity */ } /* If debugging, show the raw guest bytes for this bb. */ if (0 || (vex_traceflags & VEX_TRACE_FE)) { if (guest_extents->n_used > 1) { vex_printf("can't show code due to extents > 1\n"); } else { /* HACK */ UChar* p = (UChar*)guest_bytes; UInt guest_bytes_read = (UInt)guest_extents->len[0]; vex_printf(". 0 %llx %u\n.", 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 ); /* Clean it up, hopefully a lot. */ irbb = do_iropt_BB ( irbb, specHelper, preciseMemExnsFn, 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"); } /* Get the thing instrumented. */ if (instrument1) irbb = (*instrument1)(irbb, guest_layout, guest_word_type, host_word_type); if (instrument2) irbb = (*instrument2)(irbb, guest_layout, 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 (instrument1 || instrument2) sanityCheckIRBB( irbb, "after instrumentation", True/*must be flat*/, guest_word_type ); /* Do a post-instrumentation cleanup pass. */ if (cleanup_after_instrumentation) { 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 ); } 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. */ do_deadcode_BB( irbb ); do_treebuild_BB( irbb ); if (vex_traceflags & VEX_TRACE_TREES) { vex_printf("\n------------------------" " After tree-building " "------------------------\n\n"); ppIRBB ( irbb ); vex_printf("\n"); } /* HACK */ if (0) { *host_bytes_used = 0; return VexTransOK; } /* end HACK */ if (vex_traceflags & VEX_TRACE_VCODE) vex_printf("\n------------------------" " Instruction selection " "------------------------\n"); vcode = iselBB ( irbb, archinfo_host ); 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]); 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 ); 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]); vex_printf("\n"); } vex_printf("\n"); } /* HACK */ if (0) { *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]); vex_printf("\n"); } j = (*emit)( insn_bytes, 32, rcode->arr[i] ); 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 > host_bytes_size) { vexClearTEMP(); vex_traceflags = 0; return VexTransOutputFull; } for (k = 0; k < j; k++) { host_bytes[out_used] = insn_bytes[k]; out_used++; } vassert(out_used <= host_bytes_size); } *host_bytes_used = out_used; vexClearTEMP(); 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_PPC32exns: return "Unmasking PPC32 FP exceptions"; default: vpanic("LibVEX_EmWarn_string: unknown warning"); }}/* --------- Arch/Subarch 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"; default: return "VexArch???"; }}const HChar* LibVEX_ppVexSubArch ( VexSubArch subarch ){ switch (subarch) { case VexSubArch_INVALID: return "INVALID"; case VexSubArch_NONE: return "NONE"; case VexSubArchX86_sse0: return "x86-sse0"; case VexSubArchX86_sse1: return "x86-sse1"; case VexSubArchX86_sse2: return "x86-sse2"; case VexSubArchARM_v4: return "arm-v4"; case VexSubArchPPC32_noAV: return "ppc32-noAltivec"; case VexSubArchPPC32_AV: return "ppc32-Altivec"; default: return "VexSubArch???"; }}/* Write default settings info *vai. */void LibVEX_default_VexArchInfo ( /*OUT*/VexArchInfo* vai ){ vai->subarch = VexSubArch_INVALID; vai->ppc32_cache_line_szB = 0;}/*---------------------------------------------------------------*//*--- end main/vex_main.c ---*//*---------------------------------------------------------------*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -