aboutsummaryrefslogtreecommitdiffstats
path: root/executor/common_kvm_amd64.h
diff options
context:
space:
mode:
Diffstat (limited to 'executor/common_kvm_amd64.h')
-rw-r--r--executor/common_kvm_amd64.h62
1 files changed, 55 insertions, 7 deletions
diff --git a/executor/common_kvm_amd64.h b/executor/common_kvm_amd64.h
index 0c49f07a0..170d658da 100644
--- a/executor/common_kvm_amd64.h
+++ b/executor/common_kvm_amd64.h
@@ -1202,18 +1202,66 @@ static long syz_kvm_add_vcpu(volatile long a0, volatile long a1)
}
#endif
-#if SYZ_EXECUTOR || __NR_syz_kvm_assert_syzos_uexit
-static long syz_kvm_assert_syzos_uexit(volatile long a0, volatile long a1)
+#if !SYZ_EXECUTOR && __NR_syz_kvm_assert_syzos_uexit
+static void dump_vcpu_state(int cpufd, struct kvm_run* run)
{
- struct kvm_run* run = (struct kvm_run*)a0;
- uint64 expect = a1;
+ struct kvm_regs regs;
+ ioctl(cpufd, KVM_GET_REGS, &regs);
+ struct kvm_sregs sregs;
+ ioctl(cpufd, KVM_GET_SREGS, &sregs);
+ fprintf(stderr, "KVM_RUN structure:\n");
+ fprintf(stderr, " exit_reason: %d\n", run->exit_reason);
+ fprintf(stderr, " hardware_entry_failure_reason: 0x%llx\n",
+ run->fail_entry.hardware_entry_failure_reason);
+ fprintf(stderr, "VCPU registers:\n");
+ fprintf(stderr, " rip: 0x%llx, rsp: 0x%llx, rflags: 0x%llx\n", regs.rip,
+ regs.rsp, regs.rflags);
+ fprintf(stderr, "VCPU sregs:\n");
+ fprintf(stderr, " cr0: 0x%llx, cr2: 0x%llx, cr3: 0x%llx, cr4: 0x%llx\n",
+ sregs.cr0, sregs.cr2, sregs.cr3, sregs.cr4);
+ fprintf(stderr, " efer: 0x%llx (LME=%d)\n", sregs.efer,
+ (sregs.efer & X86_EFER_LME) ? 1 : 0);
+ fprintf(stderr, " cs: s=0x%x, b=0x%llx, limit=0x%x, type=%d, l=%d, db=%d\n",
+ sregs.cs.selector, sregs.cs.base, sregs.cs.limit, sregs.cs.type,
+ sregs.cs.l, sregs.cs.db);
+ fprintf(stderr, " ds: s=0x%x, b=0x%llx, limit=0x%x, type=%d, db=%d\n",
+ sregs.ds.selector, sregs.ds.base, sregs.ds.limit, sregs.ds.type,
+ sregs.ds.db);
+ fprintf(stderr, " tr: s=0x%x, b=0x%llx, limit=0x%x, type=%d, db=%d\n",
+ sregs.tr.selector, sregs.tr.base, sregs.tr.limit, sregs.tr.type,
+ sregs.tr.db);
+ fprintf(stderr, " idt: b=0x%llx, limit=0x%x\n", sregs.idt.base,
+ sregs.idt.limit);
+}
+#endif
- if (!run || (run->exit_reason != KVM_EXIT_MMIO) || (run->mmio.phys_addr != X86_SYZOS_ADDR_UEXIT)) {
+#if SYZ_EXECUTOR || __NR_syz_kvm_assert_syzos_uexit
+static long syz_kvm_assert_syzos_uexit(volatile long a0, volatile long a1, volatile long a2)
+{
+#if !SYZ_EXECUTOR
+ int cpufd = (int)a0;
+#endif
+ struct kvm_run* run = (struct kvm_run*)a1;
+ uint64 expect = a2;
+
+ if (!run || (run->exit_reason != KVM_EXIT_MMIO) ||
+ (run->mmio.phys_addr != X86_SYZOS_ADDR_UEXIT)) {
+#if !SYZ_EXECUTOR
+ fprintf(stderr, "[SYZOS-DEBUG] Assertion Triggered on VCPU %d\n", cpufd);
+ dump_vcpu_state(cpufd, run);
+#endif
errno = EINVAL;
return -1;
}
- if ((((uint64*)(run->mmio.data))[0]) != expect) {
+ uint64 actual_code = ((uint64*)(run->mmio.data))[0];
+ if (actual_code != expect) {
+#if !SYZ_EXECUTOR
+ fprintf(stderr, "[SYZOS-DEBUG] Exit Code Mismatch on VCPU %d\n", cpufd);
+ fprintf(stderr, " Expected: 0x%lx\n", (unsigned long)expect);
+ fprintf(stderr, " Actual: 0x%lx\n", (unsigned long)actual_code);
+ dump_vcpu_state(cpufd, run);
+#endif
errno = EDOM;
return -1;
}
@@ -1221,4 +1269,4 @@ static long syz_kvm_assert_syzos_uexit(volatile long a0, volatile long a1)
}
#endif
-#endif // EXECUTOR_COMMON_KVM_AMD64_H \ No newline at end of file
+#endif // EXECUTOR_COMMON_KVM_AMD64_H