@@ -25,14 +25,43 @@ static int insn_is_ud2(uint32_t insn)
void advance_pc(void *vuc)
{
+ ucontext_t *uc = (ucontext_t *) vuc;
+
/* We assume that this is either UD1 or UD2.
* This would need tweaking if we want to test
* expected undefs on x86.
*/
- ucontext_t *uc = vuc;
uc->uc_mcontext.gregs[REG_EIP] += 2;
}
+void set_ucontext_paramreg(void *vuc, uint64_t value)
+{
+ ucontext_t *uc = (ucontext_t *) vuc;
+ uc->uc_mcontext.gregs[REG_EAX] = (uint32_t) value;
+}
+
+uint64_t get_reginfo_paramreg(struct reginfo *ri)
+{
+ return ri->gregs[REG_EAX];
+}
+
+int get_risuop(struct reginfo *ri)
+{
+ switch (ri->faulting_insn & 0xffff) {
+ case 0xb90f: /* UD1 */
+ return OP_COMPARE;
+ case 0x0b0f: /* UD2 */
+ return OP_TESTEND;
+ default: /* unexpected */
+ return -1;
+ }
+}
+
+uintptr_t get_pc(struct reginfo *ri)
+{
+ return ri->gregs[REG_EIP];
+}
+
int send_register_info(int sock, void *uc)
{
struct reginfo ri;
@@ -28,6 +28,7 @@ struct reginfo {
# define REG_ES 2
# define REG_DS 3
# define REG_ESP 7
+# define REG_EAX 11
# define REG_TRAPNO 12
# define REG_EIP 14
# define REG_EFL 16
risu_i386.c is expected to implement the following functions: - advance_pc - get_reginfo_paramreg, set_ucontext_paramreg - get_risuop - get_pc This patch adds the necessary code. (We use EAX as the parameter register.) Signed-off-by: Jan Bobek <jan.bobek@gmail.com> --- risu_i386.c | 31 ++++++++++++++++++++++++++++++- risu_reginfo_i386.h | 1 + 2 files changed, 31 insertions(+), 1 deletion(-)