1d57bc3c1SAlexander Graf /* 2d57bc3c1SAlexander Graf * QEMU Hypervisor.framework support 3d57bc3c1SAlexander Graf * 4d57bc3c1SAlexander Graf * This work is licensed under the terms of the GNU GPL, version 2. See 5d57bc3c1SAlexander Graf * the COPYING file in the top-level directory. 6d57bc3c1SAlexander Graf * 7d57bc3c1SAlexander Graf * Contributions after 2012-01-13 are licensed under the terms of the 8d57bc3c1SAlexander Graf * GNU GPL, version 2 or (at your option) any later version. 9d57bc3c1SAlexander Graf */ 10d57bc3c1SAlexander Graf 11d57bc3c1SAlexander Graf #include "qemu/osdep.h" 12d57bc3c1SAlexander Graf #include "qemu/error-report.h" 1332cad1ffSPhilippe Mathieu-Daudé #include "system/hvf.h" 1432cad1ffSPhilippe Mathieu-Daudé #include "system/hvf_int.h" 15*b3b3ad22SPhilippe Mathieu-Daudé #include "hw/core/cpu.h" 16d57bc3c1SAlexander Graf 17a3c67dfcSPhil Dennis-Jordan const char *hvf_return_string(hv_return_t ret) 18a3c67dfcSPhil Dennis-Jordan { 19a3c67dfcSPhil Dennis-Jordan switch (ret) { 20a3c67dfcSPhil Dennis-Jordan case HV_SUCCESS: return "HV_SUCCESS"; 21a3c67dfcSPhil Dennis-Jordan case HV_ERROR: return "HV_ERROR"; 22a3c67dfcSPhil Dennis-Jordan case HV_BUSY: return "HV_BUSY"; 23a3c67dfcSPhil Dennis-Jordan case HV_BAD_ARGUMENT: return "HV_BAD_ARGUMENT"; 24a3c67dfcSPhil Dennis-Jordan case HV_NO_RESOURCES: return "HV_NO_RESOURCES"; 25a3c67dfcSPhil Dennis-Jordan case HV_NO_DEVICE: return "HV_NO_DEVICE"; 26a3c67dfcSPhil Dennis-Jordan case HV_UNSUPPORTED: return "HV_UNSUPPORTED"; 27a3c67dfcSPhil Dennis-Jordan case HV_DENIED: return "HV_DENIED"; 28a3c67dfcSPhil Dennis-Jordan default: return "[unknown hv_return value]"; 29a3c67dfcSPhil Dennis-Jordan } 30a3c67dfcSPhil Dennis-Jordan } 31a3c67dfcSPhil Dennis-Jordan 32a3c67dfcSPhil Dennis-Jordan void assert_hvf_ok_impl(hv_return_t ret, const char *file, unsigned int line, 33a3c67dfcSPhil Dennis-Jordan const char *exp) 34d57bc3c1SAlexander Graf { 35d57bc3c1SAlexander Graf if (ret == HV_SUCCESS) { 36d57bc3c1SAlexander Graf return; 37d57bc3c1SAlexander Graf } 38d57bc3c1SAlexander Graf 39a3c67dfcSPhil Dennis-Jordan error_report("Error: %s = %s (0x%x, at %s:%u)", 40a3c67dfcSPhil Dennis-Jordan exp, hvf_return_string(ret), ret, file, line); 41d57bc3c1SAlexander Graf 42d57bc3c1SAlexander Graf abort(); 43d57bc3c1SAlexander Graf } 44f4152040SFrancesco Cagnin 45fcfe7616SAnton Johansson struct hvf_sw_breakpoint *hvf_find_sw_breakpoint(CPUState *cpu, vaddr pc) 46f4152040SFrancesco Cagnin { 47f4152040SFrancesco Cagnin struct hvf_sw_breakpoint *bp; 48f4152040SFrancesco Cagnin 49f4152040SFrancesco Cagnin QTAILQ_FOREACH(bp, &hvf_state->hvf_sw_breakpoints, entry) { 50f4152040SFrancesco Cagnin if (bp->pc == pc) { 51f4152040SFrancesco Cagnin return bp; 52f4152040SFrancesco Cagnin } 53f4152040SFrancesco Cagnin } 54f4152040SFrancesco Cagnin return NULL; 55f4152040SFrancesco Cagnin } 56f4152040SFrancesco Cagnin 57f4152040SFrancesco Cagnin int hvf_sw_breakpoints_active(CPUState *cpu) 58f4152040SFrancesco Cagnin { 59f4152040SFrancesco Cagnin return !QTAILQ_EMPTY(&hvf_state->hvf_sw_breakpoints); 60f4152040SFrancesco Cagnin } 61eb2edc42SFrancesco Cagnin 62d5bd8d82SMads Ynddal static void do_hvf_update_guest_debug(CPUState *cpu, run_on_cpu_data arg) 63eb2edc42SFrancesco Cagnin { 64eb2edc42SFrancesco Cagnin hvf_arch_update_guest_debug(cpu); 65d5bd8d82SMads Ynddal } 66d5bd8d82SMads Ynddal 67d5bd8d82SMads Ynddal int hvf_update_guest_debug(CPUState *cpu) 68d5bd8d82SMads Ynddal { 69d5bd8d82SMads Ynddal run_on_cpu(cpu, do_hvf_update_guest_debug, RUN_ON_CPU_NULL); 70eb2edc42SFrancesco Cagnin return 0; 71eb2edc42SFrancesco Cagnin } 72