1*05927e9dSPhilippe Mathieu-Daudé /* 2*05927e9dSPhilippe Mathieu-Daudé * Accelerator per-vCPU handlers 3*05927e9dSPhilippe Mathieu-Daudé * 4*05927e9dSPhilippe Mathieu-Daudé * Copyright 2021 SUSE LLC 5*05927e9dSPhilippe Mathieu-Daudé * 6*05927e9dSPhilippe Mathieu-Daudé * This work is licensed under the terms of the GNU GPL, version 2 or later. 7*05927e9dSPhilippe Mathieu-Daudé * See the COPYING file in the top-level directory. 8*05927e9dSPhilippe Mathieu-Daudé */ 9*05927e9dSPhilippe Mathieu-Daudé 10*05927e9dSPhilippe Mathieu-Daudé #ifndef QEMU_ACCEL_CPU_OPS_H 11*05927e9dSPhilippe Mathieu-Daudé #define QEMU_ACCEL_CPU_OPS_H 12*05927e9dSPhilippe Mathieu-Daudé 13*05927e9dSPhilippe Mathieu-Daudé #include "qemu/accel.h" 14*05927e9dSPhilippe Mathieu-Daudé #include "exec/vaddr.h" 15*05927e9dSPhilippe Mathieu-Daudé #include "qom/object.h" 16*05927e9dSPhilippe Mathieu-Daudé 17*05927e9dSPhilippe Mathieu-Daudé #define ACCEL_OPS_SUFFIX "-ops" 18*05927e9dSPhilippe Mathieu-Daudé #define TYPE_ACCEL_OPS "accel" ACCEL_OPS_SUFFIX 19*05927e9dSPhilippe Mathieu-Daudé #define ACCEL_OPS_NAME(name) (name "-" TYPE_ACCEL_OPS) 20*05927e9dSPhilippe Mathieu-Daudé 21*05927e9dSPhilippe Mathieu-Daudé DECLARE_CLASS_CHECKERS(AccelOpsClass, ACCEL_OPS, TYPE_ACCEL_OPS) 22*05927e9dSPhilippe Mathieu-Daudé 23*05927e9dSPhilippe Mathieu-Daudé /** 24*05927e9dSPhilippe Mathieu-Daudé * struct AccelOpsClass - accelerator interfaces 25*05927e9dSPhilippe Mathieu-Daudé * 26*05927e9dSPhilippe Mathieu-Daudé * This structure is used to abstract accelerator differences from the 27*05927e9dSPhilippe Mathieu-Daudé * core CPU code. Not all have to be implemented. 28*05927e9dSPhilippe Mathieu-Daudé */ 29*05927e9dSPhilippe Mathieu-Daudé struct AccelOpsClass { 30*05927e9dSPhilippe Mathieu-Daudé /*< private >*/ 31*05927e9dSPhilippe Mathieu-Daudé ObjectClass parent_class; 32*05927e9dSPhilippe Mathieu-Daudé /*< public >*/ 33*05927e9dSPhilippe Mathieu-Daudé 34*05927e9dSPhilippe Mathieu-Daudé /* initialization function called when accel is chosen */ 35*05927e9dSPhilippe Mathieu-Daudé void (*ops_init)(AccelClass *ac); 36*05927e9dSPhilippe Mathieu-Daudé 37*05927e9dSPhilippe Mathieu-Daudé bool (*cpus_are_resettable)(void); 38*05927e9dSPhilippe Mathieu-Daudé void (*cpu_reset_hold)(CPUState *cpu); 39*05927e9dSPhilippe Mathieu-Daudé 40*05927e9dSPhilippe Mathieu-Daudé void (*create_vcpu_thread)(CPUState *cpu); /* MANDATORY NON-NULL */ 41*05927e9dSPhilippe Mathieu-Daudé void (*kick_vcpu_thread)(CPUState *cpu); 42*05927e9dSPhilippe Mathieu-Daudé bool (*cpu_thread_is_idle)(CPUState *cpu); 43*05927e9dSPhilippe Mathieu-Daudé 44*05927e9dSPhilippe Mathieu-Daudé /** 45*05927e9dSPhilippe Mathieu-Daudé * synchronize_post_reset: 46*05927e9dSPhilippe Mathieu-Daudé * synchronize_post_init: 47*05927e9dSPhilippe Mathieu-Daudé * @cpu: The vCPU to synchronize. 48*05927e9dSPhilippe Mathieu-Daudé * 49*05927e9dSPhilippe Mathieu-Daudé * Request to synchronize QEMU vCPU registers to the hardware accelerator 50*05927e9dSPhilippe Mathieu-Daudé * (QEMU is the reference). 51*05927e9dSPhilippe Mathieu-Daudé */ 52*05927e9dSPhilippe Mathieu-Daudé void (*synchronize_post_reset)(CPUState *cpu); 53*05927e9dSPhilippe Mathieu-Daudé void (*synchronize_post_init)(CPUState *cpu); 54*05927e9dSPhilippe Mathieu-Daudé /** 55*05927e9dSPhilippe Mathieu-Daudé * synchronize_state: 56*05927e9dSPhilippe Mathieu-Daudé * synchronize_pre_loadvm: 57*05927e9dSPhilippe Mathieu-Daudé * @cpu: The vCPU to synchronize. 58*05927e9dSPhilippe Mathieu-Daudé * 59*05927e9dSPhilippe Mathieu-Daudé * Request to synchronize QEMU vCPU registers from the hardware accelerator 60*05927e9dSPhilippe Mathieu-Daudé * (the hardware accelerator is the reference). 61*05927e9dSPhilippe Mathieu-Daudé */ 62*05927e9dSPhilippe Mathieu-Daudé void (*synchronize_state)(CPUState *cpu); 63*05927e9dSPhilippe Mathieu-Daudé void (*synchronize_pre_loadvm)(CPUState *cpu); 64*05927e9dSPhilippe Mathieu-Daudé 65*05927e9dSPhilippe Mathieu-Daudé /* handle_interrupt is mandatory. */ 66*05927e9dSPhilippe Mathieu-Daudé void (*handle_interrupt)(CPUState *cpu, int mask); 67*05927e9dSPhilippe Mathieu-Daudé 68*05927e9dSPhilippe Mathieu-Daudé /** 69*05927e9dSPhilippe Mathieu-Daudé * @get_virtual_clock: fetch virtual clock 70*05927e9dSPhilippe Mathieu-Daudé * @set_virtual_clock: set virtual clock 71*05927e9dSPhilippe Mathieu-Daudé * 72*05927e9dSPhilippe Mathieu-Daudé * These allow the timer subsystem to defer to the accelerator to 73*05927e9dSPhilippe Mathieu-Daudé * fetch time. The set function is needed if the accelerator wants 74*05927e9dSPhilippe Mathieu-Daudé * to track the changes to time as the timer is warped through 75*05927e9dSPhilippe Mathieu-Daudé * various timer events. 76*05927e9dSPhilippe Mathieu-Daudé */ 77*05927e9dSPhilippe Mathieu-Daudé int64_t (*get_virtual_clock)(void); 78*05927e9dSPhilippe Mathieu-Daudé void (*set_virtual_clock)(int64_t time); 79*05927e9dSPhilippe Mathieu-Daudé 80*05927e9dSPhilippe Mathieu-Daudé int64_t (*get_elapsed_ticks)(void); 81*05927e9dSPhilippe Mathieu-Daudé 82*05927e9dSPhilippe Mathieu-Daudé /* gdbstub hooks */ 83*05927e9dSPhilippe Mathieu-Daudé bool (*supports_guest_debug)(void); 84*05927e9dSPhilippe Mathieu-Daudé int (*update_guest_debug)(CPUState *cpu); 85*05927e9dSPhilippe Mathieu-Daudé int (*insert_breakpoint)(CPUState *cpu, int type, vaddr addr, vaddr len); 86*05927e9dSPhilippe Mathieu-Daudé int (*remove_breakpoint)(CPUState *cpu, int type, vaddr addr, vaddr len); 87*05927e9dSPhilippe Mathieu-Daudé void (*remove_all_breakpoints)(CPUState *cpu); 88*05927e9dSPhilippe Mathieu-Daudé }; 89*05927e9dSPhilippe Mathieu-Daudé 90*05927e9dSPhilippe Mathieu-Daudé void generic_handle_interrupt(CPUState *cpu, int mask); 91*05927e9dSPhilippe Mathieu-Daudé 92*05927e9dSPhilippe Mathieu-Daudé #endif /* QEMU_ACCEL_CPU_OPS_H */ 93