xref: /openbmc/qemu/include/accel/accel-cpu-ops.h (revision f96b157ebb93f94cd56ebbc99bc20982b8fd86ef)
105927e9dSPhilippe Mathieu-Daudé /*
205927e9dSPhilippe Mathieu-Daudé  * Accelerator per-vCPU handlers
305927e9dSPhilippe Mathieu-Daudé  *
405927e9dSPhilippe Mathieu-Daudé  * Copyright 2021 SUSE LLC
505927e9dSPhilippe Mathieu-Daudé  *
605927e9dSPhilippe Mathieu-Daudé  * This work is licensed under the terms of the GNU GPL, version 2 or later.
705927e9dSPhilippe Mathieu-Daudé  * See the COPYING file in the top-level directory.
805927e9dSPhilippe Mathieu-Daudé  */
905927e9dSPhilippe Mathieu-Daudé 
1005927e9dSPhilippe Mathieu-Daudé #ifndef QEMU_ACCEL_CPU_OPS_H
1105927e9dSPhilippe Mathieu-Daudé #define QEMU_ACCEL_CPU_OPS_H
1205927e9dSPhilippe Mathieu-Daudé 
1305927e9dSPhilippe Mathieu-Daudé #include "qemu/accel.h"
1405927e9dSPhilippe Mathieu-Daudé #include "exec/vaddr.h"
1505927e9dSPhilippe Mathieu-Daudé #include "qom/object.h"
1605927e9dSPhilippe Mathieu-Daudé 
1705927e9dSPhilippe Mathieu-Daudé #define ACCEL_OPS_SUFFIX "-ops"
1805927e9dSPhilippe Mathieu-Daudé #define TYPE_ACCEL_OPS "accel" ACCEL_OPS_SUFFIX
1905927e9dSPhilippe Mathieu-Daudé #define ACCEL_OPS_NAME(name) (name "-" TYPE_ACCEL_OPS)
2005927e9dSPhilippe Mathieu-Daudé 
2105927e9dSPhilippe Mathieu-Daudé DECLARE_CLASS_CHECKERS(AccelOpsClass, ACCEL_OPS, TYPE_ACCEL_OPS)
2205927e9dSPhilippe Mathieu-Daudé 
2305927e9dSPhilippe Mathieu-Daudé /**
2405927e9dSPhilippe Mathieu-Daudé  * struct AccelOpsClass - accelerator interfaces
2505927e9dSPhilippe Mathieu-Daudé  *
2605927e9dSPhilippe Mathieu-Daudé  * This structure is used to abstract accelerator differences from the
2705927e9dSPhilippe Mathieu-Daudé  * core CPU code. Not all have to be implemented.
2805927e9dSPhilippe Mathieu-Daudé  */
2905927e9dSPhilippe Mathieu-Daudé struct AccelOpsClass {
3005927e9dSPhilippe Mathieu-Daudé     /*< private >*/
3105927e9dSPhilippe Mathieu-Daudé     ObjectClass parent_class;
3205927e9dSPhilippe Mathieu-Daudé     /*< public >*/
3305927e9dSPhilippe Mathieu-Daudé 
3405927e9dSPhilippe Mathieu-Daudé     /* initialization function called when accel is chosen */
3505927e9dSPhilippe Mathieu-Daudé     void (*ops_init)(AccelClass *ac);
3605927e9dSPhilippe Mathieu-Daudé 
3705927e9dSPhilippe Mathieu-Daudé     bool (*cpus_are_resettable)(void);
3805927e9dSPhilippe Mathieu-Daudé     void (*cpu_reset_hold)(CPUState *cpu);
3905927e9dSPhilippe Mathieu-Daudé 
4005927e9dSPhilippe Mathieu-Daudé     void (*create_vcpu_thread)(CPUState *cpu); /* MANDATORY NON-NULL */
4105927e9dSPhilippe Mathieu-Daudé     void (*kick_vcpu_thread)(CPUState *cpu);
4205927e9dSPhilippe Mathieu-Daudé     bool (*cpu_thread_is_idle)(CPUState *cpu);
4305927e9dSPhilippe Mathieu-Daudé 
4405927e9dSPhilippe Mathieu-Daudé     /**
4505927e9dSPhilippe Mathieu-Daudé      * synchronize_post_reset:
4605927e9dSPhilippe Mathieu-Daudé      * synchronize_post_init:
4705927e9dSPhilippe Mathieu-Daudé      * @cpu: The vCPU to synchronize.
4805927e9dSPhilippe Mathieu-Daudé      *
4905927e9dSPhilippe Mathieu-Daudé      * Request to synchronize QEMU vCPU registers to the hardware accelerator
5005927e9dSPhilippe Mathieu-Daudé      * (QEMU is the reference).
5105927e9dSPhilippe Mathieu-Daudé      */
5205927e9dSPhilippe Mathieu-Daudé     void (*synchronize_post_reset)(CPUState *cpu);
5305927e9dSPhilippe Mathieu-Daudé     void (*synchronize_post_init)(CPUState *cpu);
5405927e9dSPhilippe Mathieu-Daudé     /**
5505927e9dSPhilippe Mathieu-Daudé      * synchronize_state:
5605927e9dSPhilippe Mathieu-Daudé      * synchronize_pre_loadvm:
5705927e9dSPhilippe Mathieu-Daudé      * @cpu: The vCPU to synchronize.
5805927e9dSPhilippe Mathieu-Daudé      *
5905927e9dSPhilippe Mathieu-Daudé      * Request to synchronize QEMU vCPU registers from the hardware accelerator
6005927e9dSPhilippe Mathieu-Daudé      * (the hardware accelerator is the reference).
6105927e9dSPhilippe Mathieu-Daudé      */
6205927e9dSPhilippe Mathieu-Daudé     void (*synchronize_state)(CPUState *cpu);
6305927e9dSPhilippe Mathieu-Daudé     void (*synchronize_pre_loadvm)(CPUState *cpu);
6405927e9dSPhilippe Mathieu-Daudé 
6505927e9dSPhilippe Mathieu-Daudé     /* handle_interrupt is mandatory. */
6605927e9dSPhilippe Mathieu-Daudé     void (*handle_interrupt)(CPUState *cpu, int mask);
6705927e9dSPhilippe Mathieu-Daudé 
68*1861993fSPhilippe Mathieu-Daudé     /* get_vcpu_stats: Append statistics of this @cpu to @buf */
69*1861993fSPhilippe Mathieu-Daudé     void (*get_vcpu_stats)(CPUState *cpu, GString *buf);
70*1861993fSPhilippe Mathieu-Daudé 
7105927e9dSPhilippe Mathieu-Daudé     /**
7205927e9dSPhilippe Mathieu-Daudé      * @get_virtual_clock: fetch virtual clock
7305927e9dSPhilippe Mathieu-Daudé      * @set_virtual_clock: set virtual clock
7405927e9dSPhilippe Mathieu-Daudé      *
7505927e9dSPhilippe Mathieu-Daudé      * These allow the timer subsystem to defer to the accelerator to
7605927e9dSPhilippe Mathieu-Daudé      * fetch time. The set function is needed if the accelerator wants
7705927e9dSPhilippe Mathieu-Daudé      * to track the changes to time as the timer is warped through
7805927e9dSPhilippe Mathieu-Daudé      * various timer events.
7905927e9dSPhilippe Mathieu-Daudé      */
8005927e9dSPhilippe Mathieu-Daudé     int64_t (*get_virtual_clock)(void);
8105927e9dSPhilippe Mathieu-Daudé     void (*set_virtual_clock)(int64_t time);
8205927e9dSPhilippe Mathieu-Daudé 
8305927e9dSPhilippe Mathieu-Daudé     int64_t (*get_elapsed_ticks)(void);
8405927e9dSPhilippe Mathieu-Daudé 
8505927e9dSPhilippe Mathieu-Daudé     /* gdbstub hooks */
8605927e9dSPhilippe Mathieu-Daudé     bool (*supports_guest_debug)(void);
8705927e9dSPhilippe Mathieu-Daudé     int (*update_guest_debug)(CPUState *cpu);
8805927e9dSPhilippe Mathieu-Daudé     int (*insert_breakpoint)(CPUState *cpu, int type, vaddr addr, vaddr len);
8905927e9dSPhilippe Mathieu-Daudé     int (*remove_breakpoint)(CPUState *cpu, int type, vaddr addr, vaddr len);
9005927e9dSPhilippe Mathieu-Daudé     void (*remove_all_breakpoints)(CPUState *cpu);
9105927e9dSPhilippe Mathieu-Daudé };
9205927e9dSPhilippe Mathieu-Daudé 
9305927e9dSPhilippe Mathieu-Daudé void generic_handle_interrupt(CPUState *cpu, int mask);
9405927e9dSPhilippe Mathieu-Daudé 
9505927e9dSPhilippe Mathieu-Daudé #endif /* QEMU_ACCEL_CPU_OPS_H */
96