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
hvf_return_string(hv_return_t ret)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
assert_hvf_ok_impl(hv_return_t ret,const char * file,unsigned int line,const char * exp)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
hvf_find_sw_breakpoint(CPUState * cpu,vaddr pc)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
hvf_sw_breakpoints_active(CPUState * cpu)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
do_hvf_update_guest_debug(CPUState * cpu,run_on_cpu_data arg)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
hvf_update_guest_debug(CPUState * cpu)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