xref: /qemu/accel/hvf/hvf-all.c (revision 32cad1ffb81dcecf6f4a8af56d6e5892682839b1)
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"
13*32cad1ffSPhilippe Mathieu-Daudé #include "system/hvf.h"
14*32cad1ffSPhilippe Mathieu-Daudé #include "system/hvf_int.h"
15d57bc3c1SAlexander Graf 
16a3c67dfcSPhil Dennis-Jordan const char *hvf_return_string(hv_return_t ret)
17a3c67dfcSPhil Dennis-Jordan {
18a3c67dfcSPhil Dennis-Jordan     switch (ret) {
19a3c67dfcSPhil Dennis-Jordan     case HV_SUCCESS:      return "HV_SUCCESS";
20a3c67dfcSPhil Dennis-Jordan     case HV_ERROR:        return "HV_ERROR";
21a3c67dfcSPhil Dennis-Jordan     case HV_BUSY:         return "HV_BUSY";
22a3c67dfcSPhil Dennis-Jordan     case HV_BAD_ARGUMENT: return "HV_BAD_ARGUMENT";
23a3c67dfcSPhil Dennis-Jordan     case HV_NO_RESOURCES: return "HV_NO_RESOURCES";
24a3c67dfcSPhil Dennis-Jordan     case HV_NO_DEVICE:    return "HV_NO_DEVICE";
25a3c67dfcSPhil Dennis-Jordan     case HV_UNSUPPORTED:  return "HV_UNSUPPORTED";
26a3c67dfcSPhil Dennis-Jordan     case HV_DENIED:       return "HV_DENIED";
27a3c67dfcSPhil Dennis-Jordan     default:              return "[unknown hv_return value]";
28a3c67dfcSPhil Dennis-Jordan     }
29a3c67dfcSPhil Dennis-Jordan }
30a3c67dfcSPhil Dennis-Jordan 
31a3c67dfcSPhil Dennis-Jordan void assert_hvf_ok_impl(hv_return_t ret, const char *file, unsigned int line,
32a3c67dfcSPhil Dennis-Jordan                         const char *exp)
33d57bc3c1SAlexander Graf {
34d57bc3c1SAlexander Graf     if (ret == HV_SUCCESS) {
35d57bc3c1SAlexander Graf         return;
36d57bc3c1SAlexander Graf     }
37d57bc3c1SAlexander Graf 
38a3c67dfcSPhil Dennis-Jordan     error_report("Error: %s = %s (0x%x, at %s:%u)",
39a3c67dfcSPhil Dennis-Jordan         exp, hvf_return_string(ret), ret, file, line);
40d57bc3c1SAlexander Graf 
41d57bc3c1SAlexander Graf     abort();
42d57bc3c1SAlexander Graf }
43f4152040SFrancesco Cagnin 
44fcfe7616SAnton Johansson struct hvf_sw_breakpoint *hvf_find_sw_breakpoint(CPUState *cpu, vaddr pc)
45f4152040SFrancesco Cagnin {
46f4152040SFrancesco Cagnin     struct hvf_sw_breakpoint *bp;
47f4152040SFrancesco Cagnin 
48f4152040SFrancesco Cagnin     QTAILQ_FOREACH(bp, &hvf_state->hvf_sw_breakpoints, entry) {
49f4152040SFrancesco Cagnin         if (bp->pc == pc) {
50f4152040SFrancesco Cagnin             return bp;
51f4152040SFrancesco Cagnin         }
52f4152040SFrancesco Cagnin     }
53f4152040SFrancesco Cagnin     return NULL;
54f4152040SFrancesco Cagnin }
55f4152040SFrancesco Cagnin 
56f4152040SFrancesco Cagnin int hvf_sw_breakpoints_active(CPUState *cpu)
57f4152040SFrancesco Cagnin {
58f4152040SFrancesco Cagnin     return !QTAILQ_EMPTY(&hvf_state->hvf_sw_breakpoints);
59f4152040SFrancesco Cagnin }
60eb2edc42SFrancesco Cagnin 
61eb2edc42SFrancesco Cagnin int hvf_update_guest_debug(CPUState *cpu)
62eb2edc42SFrancesco Cagnin {
63eb2edc42SFrancesco Cagnin     hvf_arch_update_guest_debug(cpu);
64eb2edc42SFrancesco Cagnin     return 0;
65eb2edc42SFrancesco Cagnin }
66