1/*
2 * Copyright 2019, Data61, CSIRO (ABN 41 687 119 230)
3 *
4 * SPDX-License-Identifier: GPL-2.0-only
5 */
6
7/* Debugging helper functions used by VMM lib.
8 *     Authors:
9 *         Qian Ge
10 */
11
12#include <stdio.h>
13#include <stdlib.h>
14
15#include <sel4/sel4.h>
16
17#include <sel4vm/guest_vm.h>
18#include <sel4vm/arch/guest_x86_context.h>
19
20#include "debug.h"
21#include "guest_state.h"
22#include "vmcs.h"
23
24/* Print out the context of a guest OS thread. */
25void vm_print_guest_context(vm_vcpu_t *vcpu)
26{
27    unsigned int data_exit_info, data_exit_error;
28    if (vm_vmcs_read(vcpu->vcpu.cptr, VMX_DATA_EXIT_INTERRUPT_INFO, &data_exit_info) ||
29        vm_vmcs_read(vcpu->vcpu.cptr, VMX_DATA_EXIT_INTERRUPT_ERROR, &data_exit_error)) {
30        return;
31    }
32    printf("================== GUEST OS CONTEXT =================\n");
33
34    printf("exit info : reason 0x%x    qualification 0x%x   instruction len 0x%x interrupt info 0x%x interrupt error 0x%x\n",
35           vm_guest_exit_get_reason(vcpu->vcpu_arch.guest_state), vm_guest_exit_get_qualification(vcpu->vcpu_arch.guest_state),
36           vm_guest_exit_get_int_len(vcpu->vcpu_arch.guest_state), data_exit_info, data_exit_error);
37    printf("            guest physical 0x%x     rflags 0x%x \n",
38           vm_guest_exit_get_physical(vcpu->vcpu_arch.guest_state), vm_guest_state_get_rflags(vcpu->vcpu_arch.guest_state,
39                                                                                              vcpu->vcpu.cptr));
40    printf("            guest interruptibility 0x%x   control entry 0x%x\n",
41           vm_guest_state_get_interruptibility(vcpu->vcpu_arch.guest_state, vcpu->vcpu.cptr),
42           vm_guest_state_get_control_entry(vcpu->vcpu_arch.guest_state));
43
44    printf("eip 0x%8x\n",
45           vm_guest_state_get_eip(vcpu->vcpu_arch.guest_state));
46    unsigned int eax, ebx, ecx;
47    vm_get_thread_context_reg(vcpu, VCPU_CONTEXT_EAX, &eax);
48    vm_get_thread_context_reg(vcpu, VCPU_CONTEXT_EBX, &ebx);
49    vm_get_thread_context_reg(vcpu, VCPU_CONTEXT_ECX, &ecx);
50    printf("eax 0x%8x         ebx 0x%8x      ecx 0x%8x\n", eax, ebx, ecx);
51    unsigned int edx, esi, edi;
52    vm_get_thread_context_reg(vcpu, VCPU_CONTEXT_EDX, &edx);
53    vm_get_thread_context_reg(vcpu, VCPU_CONTEXT_ESI, &esi);
54    vm_get_thread_context_reg(vcpu, VCPU_CONTEXT_EDI, &edi);
55    printf("edx 0x%8x         esi 0x%8x      edi 0x%8x\n", edx, esi, edi);
56    unsigned int ebp;
57    vm_get_thread_context_reg(vcpu, VCPU_CONTEXT_EBP, &ebp);
58    printf("ebp 0x%8x\n", ebp);
59
60    printf("cr0 0x%x      cr3 0x%x   cr4 0x%x\n", vm_guest_state_get_cr0(vcpu->vcpu_arch.guest_state, vcpu->vcpu.cptr),
61           vm_guest_state_get_cr3(vcpu->vcpu_arch.guest_state, vcpu->vcpu.cptr),
62           vm_guest_state_get_cr4(vcpu->vcpu_arch.guest_state, vcpu->vcpu.cptr));
63}
64