From a02fe95b33a85f6fc632a9b17abe7f019bdd260b Mon Sep 17 00:00:00 2001 From: Theodore Dubois Date: Sun, 12 Aug 2018 18:56:26 -0700 Subject: [PATCH] Implement sahf --- jit/gadgets-x86/control.S | 19 +++++++++++++------ jit/gen.c | 2 +- 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/jit/gadgets-x86/control.S b/jit/gadgets-x86/control.S index 577cd9ba..17dc1d5a 100644 --- a/jit/gadgets-x86/control.S +++ b/jit/gadgets-x86/control.S @@ -75,14 +75,11 @@ .else; .ifc \cond,cz check_cf jnz \target - check_res - jz \target + res_or_flag z, ZF_RES, ZF_FLAG, \target .else; .ifc \cond,s - check_res - js \target + res_or_flag s, SF_RES, SF_FLAG, \target .else; .ifc \cond,p - check_res - jp \target + res_or_flag p, PF_RES, PF_FLAG, \target .else; .ifc \cond,sxo check_res sets %r14b @@ -165,3 +162,13 @@ call helper_expand_flags restore_c gret + +.gadget sahf + xchgb %ah, %al + movb %al, CPU_eflags(%_cpu) + xchgb %al, %ah + save_c + movq %_cpu, %rdi + call helper_expand_flags + restore_c + gret diff --git a/jit/gen.c b/jit/gen.c index 05fd19fd..3263b5b2 100644 --- a/jit/gen.c +++ b/jit/gen.c @@ -249,7 +249,7 @@ static inline bool gen_op(struct gen_state *state, gadget_t *gadgets, enum arg a #define PUSHF() g(pushf) #define POPF() g(popf) -#define SAHF UNDEFINED +#define SAHF g(sahf) #define CLD g(cld) #define STD g(std)