|
@@ -208,4 +208,22 @@ static inline int insn_offset_immediate(struct insn *insn)
|
|
|
return insn_offset_displacement(insn) + insn->displacement.nbytes;
|
|
|
}
|
|
|
|
|
|
+#define POP_SS_OPCODE 0x1f
|
|
|
+#define MOV_SREG_OPCODE 0x8e
|
|
|
+
|
|
|
+/*
|
|
|
+ * Intel SDM Vol.3A 6.8.3 states;
|
|
|
+ * "Any single-step trap that would be delivered following the MOV to SS
|
|
|
+ * instruction or POP to SS instruction (because EFLAGS.TF is 1) is
|
|
|
+ * suppressed."
|
|
|
+ * This function returns true if @insn is MOV SS or POP SS. On these
|
|
|
+ * instructions, single stepping is suppressed.
|
|
|
+ */
|
|
|
+static inline int insn_masking_exception(struct insn *insn)
|
|
|
+{
|
|
|
+ return insn->opcode.bytes[0] == POP_SS_OPCODE ||
|
|
|
+ (insn->opcode.bytes[0] == MOV_SREG_OPCODE &&
|
|
|
+ X86_MODRM_REG(insn->modrm.bytes[0]) == 2);
|
|
|
+}
|
|
|
+
|
|
|
#endif /* _ASM_X86_INSN_H */
|