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