static void getSyscallArgsFromGuestState ( /*OUT*/SyscallArgs* canonical, /*IN*/ VexGuestArchState* gst_vanilla ) { VexGuestX86State* gst = (VexGuestX86State*)gst_vanilla; UWord *argv = (void *)(UWord)gst->guest_ESP; switch (gst->guest_EAX) { default: canonical->sysno = gst->guest_EAX; canonical->indir_sysno = -1; break; case 198: canonical->sysno = argv[1]; canonical->indir_sysno = 198; argv += 2; break; case 0: canonical->sysno = argv[1]; canonical->indir_sysno = 0; argv += 1; break; } canonical->nargs = sysargcount[canonical->sysno]; memset(&canonical->arg1, 0xfe, (char *)&canonical->indir_sysno - (char *)&canonical->arg1); memcpy(&canonical->arg1, &argv[1], canonical->nargs * sizeof(UWord)); } static void putSyscallArgsIntoGuestState ( /*IN*/ SyscallArgs* canonical, /*OUT*/VexGuestArchState* gst_vanilla ) { VexGuestX86State* gst = (VexGuestX86State*)gst_vanilla; UWord *argv = (void *)(UWord)gst->guest_ESP; switch (canonical->indir_sysno) { case -1: gst->guest_EAX = canonical->sysno; break; case 198: gst->guest_EAX = 198; argv[1] = 198; argv += 2; /* __syscall(2) has quad aligned args */ break; case 0: gst->guest_EAX = 0; argv[1] = 0; argv += 1; /* syscall(2) has int aligned args */ break; } memcpy(&argv[1], &canonical->arg1, canonical->nargs * sizeof(UWord)); } static void getSyscallStatusFromGuestState ( /*OUT*/SyscallStatus* canonical, /*IN*/ VexGuestArchState* gst_vanilla ) { VexGuestX86State* gst = (VexGuestX86State*)gst_vanilla; UInt efl = LibVEX_GuestX86_get_eflags( gst ); canonical->what = (efl & 1) ? SsFailure : SsSuccess; canonical->val = (UWord)gst->guest_EAX; canonical->val2 = (UWord)gst->guest_EDX; } static void putSyscallStatusIntoGuestState ( /*IN*/ SyscallStatus* canonical, /*OUT*/VexGuestArchState* gst_vanilla ) { VexGuestX86State* gst = (VexGuestX86State*)gst_vanilla; vg_assert(canonical->what == SsSuccess || canonical->what == SsFailure); gst->guest_EAX = canonical->val; gst->guest_EDX = canonical->val2; if (canonical->what == SsFailure) { LibVEX_GuestX86_put_eflag_c( 1, gst ); } else { LibVEX_GuestX86_put_eflag_c( 0, gst ); } }