aboutsummaryrefslogtreecommitdiff
path: root/risu_i386.c
diff options
context:
space:
mode:
authorJan Bobek <jan.bobek@gmail.com>2019-05-23 16:44:03 -0400
committerPeter Maydell <peter.maydell@linaro.org>2019-06-07 14:28:22 +0100
commit582c13d2fecba8e97be6b2a390baafffbeed8e7f (patch)
tree0eb0d59cfada6fe7e364c4379520ef9dd39ab6c8 /risu_i386.c
parent82e0f282aba69ac9435162f75be206bd97bc24b2 (diff)
risu_i386: implement missing CPU-specific functions
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 and opcode "UD1 %xxx,%eax" for triggering RISU actions. Suggested-by: Richard Henderson <richard.henderson@linaro.org> Reviewed-by: Alex Bennée <alex.bennee@linaro.org> Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Signed-off-by: Jan Bobek <jan.bobek@gmail.com> Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
Diffstat (limited to 'risu_i386.c')
-rw-r--r--risu_i386.c35
1 files changed, 30 insertions, 5 deletions
diff --git a/risu_i386.c b/risu_i386.c
index 2d2f325..06d95e5 100644
--- a/risu_i386.c
+++ b/risu_i386.c
@@ -25,12 +25,37 @@ static int insn_is_ud2(uint32_t insn)
void advance_pc(void *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 = (ucontext_t *) vuc;
+
+ /*
+ * We assume that this is UD1 as per get_risuop below.
+ * This would need tweaking if we want to test expected undefs.
*/
- ucontext_t *uc = vuc;
- uc->uc_mcontext.gregs[REG_EIP] += 2;
+ uc->uc_mcontext.gregs[REG_E(IP)] += 3;
+}
+
+void set_ucontext_paramreg(void *vuc, uint64_t value)
+{
+ ucontext_t *uc = (ucontext_t *) vuc;
+ uc->uc_mcontext.gregs[REG_E(AX)] = value;
+}
+
+uint64_t get_reginfo_paramreg(struct reginfo *ri)
+{
+ return ri->gregs[REG_E(AX)];
+}
+
+int get_risuop(struct reginfo *ri)
+{
+ if ((ri->faulting_insn & 0xf8ffff) == 0xc0b90f) { /* UD1 %xxx,%eax */
+ return (ri->faulting_insn >> 16) & 7;
+ }
+ return -1;
+}
+
+uintptr_t get_pc(struct reginfo *ri)
+{
+ return ri->gregs[REG_E(IP)];
}
int send_register_info(int sock, void *uc)