1bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turner/*
2bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turner * QEMU CPU model
3bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turner *
4bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turner * Copyright (c) 2012 SUSE LINUX Products GmbH
5bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turner *
6bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turner * This program is free software; you can redistribute it and/or
7bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turner * modify it under the terms of the GNU General Public License
8bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turner * as published by the Free Software Foundation; either version 2
9bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turner * of the License, or (at your option) any later version.
10bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turner *
11bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turner * This program is distributed in the hope that it will be useful,
12bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turner * but WITHOUT ANY WARRANTY; without even the implied warranty of
13bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turner * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turner * GNU General Public License for more details.
15bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turner *
16bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turner * You should have received a copy of the GNU General Public License
17bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turner * along with this program; if not, see
18bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turner * <http://www.gnu.org/licenses/gpl-2.0.html>
19bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turner */
206657678c3d86395084f6a699e73614195f06c445David 'Digit' Turner#ifndef QEMU_CPU_H
216657678c3d86395084f6a699e73614195f06c445David 'Digit' Turner#define QEMU_CPU_H
226657678c3d86395084f6a699e73614195f06c445David 'Digit' Turner
236657678c3d86395084f6a699e73614195f06c445David 'Digit' Turner#include <signal.h>
246657678c3d86395084f6a699e73614195f06c445David 'Digit' Turner#include "hw/qdev-core.h"
256657678c3d86395084f6a699e73614195f06c445David 'Digit' Turner#include "exec/hwaddr.h"
266657678c3d86395084f6a699e73614195f06c445David 'Digit' Turner#include "qemu/queue.h"
276657678c3d86395084f6a699e73614195f06c445David 'Digit' Turner#include "qemu/thread.h"
286657678c3d86395084f6a699e73614195f06c445David 'Digit' Turner#include "qemu/tls.h"
296657678c3d86395084f6a699e73614195f06c445David 'Digit' Turner#include "qemu/typedefs.h"
306657678c3d86395084f6a699e73614195f06c445David 'Digit' Turner
316657678c3d86395084f6a699e73614195f06c445David 'Digit' Turnertypedef int (*WriteCoreDumpFunction)(void *buf, size_t size, void *opaque);
326657678c3d86395084f6a699e73614195f06c445David 'Digit' Turner
336657678c3d86395084f6a699e73614195f06c445David 'Digit' Turner/**
346657678c3d86395084f6a699e73614195f06c445David 'Digit' Turner * vaddr:
356657678c3d86395084f6a699e73614195f06c445David 'Digit' Turner * Type wide enough to contain any #target_ulong virtual address.
366657678c3d86395084f6a699e73614195f06c445David 'Digit' Turner */
376657678c3d86395084f6a699e73614195f06c445David 'Digit' Turnertypedef uint64_t vaddr;
386657678c3d86395084f6a699e73614195f06c445David 'Digit' Turner#define VADDR_PRId PRId64
396657678c3d86395084f6a699e73614195f06c445David 'Digit' Turner#define VADDR_PRIu PRIu64
406657678c3d86395084f6a699e73614195f06c445David 'Digit' Turner#define VADDR_PRIo PRIo64
416657678c3d86395084f6a699e73614195f06c445David 'Digit' Turner#define VADDR_PRIx PRIx64
426657678c3d86395084f6a699e73614195f06c445David 'Digit' Turner#define VADDR_PRIX PRIX64
436657678c3d86395084f6a699e73614195f06c445David 'Digit' Turner#define VADDR_MAX UINT64_MAX
446657678c3d86395084f6a699e73614195f06c445David 'Digit' Turner
456657678c3d86395084f6a699e73614195f06c445David 'Digit' Turnertypedef struct CPUState CPUState;
466657678c3d86395084f6a699e73614195f06c445David 'Digit' Turner
476657678c3d86395084f6a699e73614195f06c445David 'Digit' Turnertypedef void (*CPUUnassignedAccess)(CPUState *cpu, hwaddr addr,
486657678c3d86395084f6a699e73614195f06c445David 'Digit' Turner                                    bool is_write, bool is_exec, int opaque,
496657678c3d86395084f6a699e73614195f06c445David 'Digit' Turner                                    unsigned size);
506657678c3d86395084f6a699e73614195f06c445David 'Digit' Turner
516657678c3d86395084f6a699e73614195f06c445David 'Digit' Turnerstruct TranslationBlock;
526657678c3d86395084f6a699e73614195f06c445David 'Digit' Turner
536657678c3d86395084f6a699e73614195f06c445David 'Digit' Turner// TODO(digit): Make this a proper QOM object that inherits from
546657678c3d86395084f6a699e73614195f06c445David 'Digit' Turner// DeviceState/DeviceClass.
556657678c3d86395084f6a699e73614195f06c445David 'Digit' Turnerstruct CPUState {
56bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turner    int nr_cores;
57bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turner    int nr_threads;
58bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turner    int numa_node;
596657678c3d86395084f6a699e73614195f06c445David 'Digit' Turner
606657678c3d86395084f6a699e73614195f06c445David 'Digit' Turner    struct QemuThread *thread;
616657678c3d86395084f6a699e73614195f06c445David 'Digit' Turner
626657678c3d86395084f6a699e73614195f06c445David 'Digit' Turner    uint32_t host_tid; /* host thread ID */
636657678c3d86395084f6a699e73614195f06c445David 'Digit' Turner    int running; /* Nonzero if cpu is currently running(usermode).  */
646657678c3d86395084f6a699e73614195f06c445David 'Digit' Turner    struct QemuCond *halt_cond;
656657678c3d86395084f6a699e73614195f06c445David 'Digit' Turner    struct qemu_work_item *queued_work_first, *queued_work_last;
666657678c3d86395084f6a699e73614195f06c445David 'Digit' Turner
676657678c3d86395084f6a699e73614195f06c445David 'Digit' Turner    uint32_t created;
686657678c3d86395084f6a699e73614195f06c445David 'Digit' Turner    uint32_t stop;   /* Stop request */
696657678c3d86395084f6a699e73614195f06c445David 'Digit' Turner    uint32_t stopped; /* Artificially stopped */
706657678c3d86395084f6a699e73614195f06c445David 'Digit' Turner
716657678c3d86395084f6a699e73614195f06c445David 'Digit' Turner    volatile sig_atomic_t exit_request;
726657678c3d86395084f6a699e73614195f06c445David 'Digit' Turner    uint32_t interrupt_request;
736657678c3d86395084f6a699e73614195f06c445David 'Digit' Turner
746657678c3d86395084f6a699e73614195f06c445David 'Digit' Turner    void *env_ptr; /* CPUArchState */
756657678c3d86395084f6a699e73614195f06c445David 'Digit' Turner    struct TranslationBlock *current_tb; /* currently executing TB  */
76fed223d2bab55eda155e3463b9cb6966e69dd73cDavid 'Digit' Turner    int singlestep_enabled;
776657678c3d86395084f6a699e73614195f06c445David 'Digit' Turner    struct GDBRegisterState *gdb_regs;
786657678c3d86395084f6a699e73614195f06c445David 'Digit' Turner    QTAILQ_ENTRY(CPUState) node;   /* next CPU sharing TB cache */
796657678c3d86395084f6a699e73614195f06c445David 'Digit' Turner
806657678c3d86395084f6a699e73614195f06c445David 'Digit' Turner    const char *cpu_model_str;
816657678c3d86395084f6a699e73614195f06c445David 'Digit' Turner
826657678c3d86395084f6a699e73614195f06c445David 'Digit' Turner    int kvm_fd;
836657678c3d86395084f6a699e73614195f06c445David 'Digit' Turner    int kvm_vcpu_dirty;
846657678c3d86395084f6a699e73614195f06c445David 'Digit' Turner    struct KVMState *kvm_state;
856657678c3d86395084f6a699e73614195f06c445David 'Digit' Turner    struct kvm_run *kvm_run;
866657678c3d86395084f6a699e73614195f06c445David 'Digit' Turner
876657678c3d86395084f6a699e73614195f06c445David 'Digit' Turner    struct hax_vcpu_state *hax_vcpu;
886657678c3d86395084f6a699e73614195f06c445David 'Digit' Turner
896657678c3d86395084f6a699e73614195f06c445David 'Digit' Turner    /* TODO Move common fields from CPUArchState here. */
906657678c3d86395084f6a699e73614195f06c445David 'Digit' Turner    int cpu_index; /* used by alpha TCG */
916657678c3d86395084f6a699e73614195f06c445David 'Digit' Turner    uint32_t halted; /* used by alpha, cris, ppc TCG */
926657678c3d86395084f6a699e73614195f06c445David 'Digit' Turner};
936657678c3d86395084f6a699e73614195f06c445David 'Digit' Turner
946657678c3d86395084f6a699e73614195f06c445David 'Digit' Turner#define CPU(obj)  ((CPUState*)(obj))
956657678c3d86395084f6a699e73614195f06c445David 'Digit' Turner
966657678c3d86395084f6a699e73614195f06c445David 'Digit' TurnerQTAILQ_HEAD(CPUTailQ, CPUState);
976657678c3d86395084f6a699e73614195f06c445David 'Digit' Turnerextern struct CPUTailQ cpus;
986657678c3d86395084f6a699e73614195f06c445David 'Digit' Turner#define CPU_NEXT(cpu) QTAILQ_NEXT(cpu, node)
996657678c3d86395084f6a699e73614195f06c445David 'Digit' Turner#define CPU_FOREACH(cpu) QTAILQ_FOREACH(cpu, &cpus, node)
1006657678c3d86395084f6a699e73614195f06c445David 'Digit' Turner#define CPU_FOREACH_SAFE(cpu, next_cpu) \
1016657678c3d86395084f6a699e73614195f06c445David 'Digit' Turner    QTAILQ_FOREACH_SAFE(cpu, &cpus, node, next_cpu)
1026657678c3d86395084f6a699e73614195f06c445David 'Digit' Turner#define first_cpu QTAILQ_FIRST(&cpus)
1036657678c3d86395084f6a699e73614195f06c445David 'Digit' Turner
1046657678c3d86395084f6a699e73614195f06c445David 'Digit' TurnerDECLARE_TLS(CPUState *, current_cpu);
1056657678c3d86395084f6a699e73614195f06c445David 'Digit' Turner#define current_cpu tls_var(current_cpu)
1066657678c3d86395084f6a699e73614195f06c445David 'Digit' Turner
1076657678c3d86395084f6a699e73614195f06c445David 'Digit' Turner// TODO(digit): Remove this.
1086657678c3d86395084f6a699e73614195f06c445David 'Digit' Turner#define cpu_single_env ((CPUArchState*)current_cpu->env_ptr)
1096657678c3d86395084f6a699e73614195f06c445David 'Digit' Turner
110bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turner/**
111bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turner * CPUDumpFlags:
112bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turner * @CPU_DUMP_CODE:
113bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turner * @CPU_DUMP_FPU: dump FPU register state, not just integer
114bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turner * @CPU_DUMP_CCOP: dump info about TCG QEMU's condition code optimization state
115bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turner */
116bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turnerenum CPUDumpFlags {
117bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turner    CPU_DUMP_CODE = 0x00010000,
118bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turner    CPU_DUMP_FPU  = 0x00020000,
119bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turner    CPU_DUMP_CCOP = 0x00040000,
120bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turner};
121bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turner
122bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turner/**
123bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turner * cpu_dump_state:
124bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turner * @cpu: The CPU whose state is to be dumped.
125bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turner * @f: File to dump to.
126bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turner * @cpu_fprintf: Function to dump with.
127bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turner * @flags: Flags what to dump.
128bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turner *
129bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turner * Dumps CPU state.
130bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turner */
131bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turnervoid cpu_dump_state(CPUState *cpu, FILE *f, fprintf_function cpu_fprintf,
132bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turner                    int flags);
133bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turner
134bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turner/**
135bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turner * cpu_dump_statistics:
136bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turner * @cpu: The CPU whose state is to be dumped.
137bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turner * @f: File to dump to.
138bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turner * @cpu_fprintf: Function to dump with.
139bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turner * @flags: Flags what to dump.
140bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turner *
141bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turner * Dumps CPU statistics.
142bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turner */
143bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turnervoid cpu_dump_statistics(CPUState *cpu, FILE *f, fprintf_function cpu_fprintf,
144bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turner                         int flags);
145bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turner
146bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turner/**
147bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turner * cpu_reset:
148bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turner * @cpu: The CPU whose state is to be reset.
149bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turner */
150bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turnervoid cpu_reset(CPUState *cpu);
151bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turner
152bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turner/**
153bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turner * qemu_cpu_has_work:
154bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turner * @cpu: The vCPU to check.
155bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turner *
156bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turner * Checks whether the CPU has work to do.
157bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turner *
158bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turner * Returns: %true if the CPU has work, %false otherwise.
159bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turner */
160bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turnerbool qemu_cpu_has_work(CPUState *cpu);
161bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turner
162bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turner/**
163bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turner * qemu_cpu_is_self:
164bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turner * @cpu: The vCPU to check against.
165bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turner *
166bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turner * Checks whether the caller is executing on the vCPU thread.
167bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turner *
168bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turner * Returns: %true if called from @cpu's thread, %false otherwise.
169bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turner */
170bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turnerbool qemu_cpu_is_self(CPUState *cpu);
171bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turner
172bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turner/**
173bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turner * qemu_cpu_kick:
174bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turner * @cpu: The vCPU to kick.
175bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turner *
176bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turner * Kicks @cpu's thread.
177bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turner */
178bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turnervoid qemu_cpu_kick(CPUState *cpu);
179bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turner
180bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turner/**
181bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turner * cpu_is_stopped:
182bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turner * @cpu: The CPU to check.
183bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turner *
184bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turner * Checks whether the CPU is stopped.
185bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turner *
186bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turner * Returns: %true if run state is not running or if artificially stopped;
187bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turner * %false otherwise.
188bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turner */
189bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turnerbool cpu_is_stopped(CPUState *cpu);
190bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turner
191bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turner/**
192bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turner * run_on_cpu:
193bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turner * @cpu: The vCPU to run on.
194bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turner * @func: The function to be executed.
195bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turner * @data: Data to pass to the function.
196bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turner *
197bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turner * Schedules the function @func for execution on the vCPU @cpu.
198bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turner */
199bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turnervoid run_on_cpu(CPUState *cpu, void (*func)(void *data), void *data);
200bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turner
201bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turner/**
202bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turner * qemu_get_cpu:
203bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turner * @index: The CPUState@cpu_index value of the CPU to obtain.
204bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turner *
205bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turner * Gets a CPU matching @index.
206bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turner *
207bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turner * Returns: The CPU or %NULL if there is no matching CPU.
208bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turner */
209bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' TurnerCPUState *qemu_get_cpu(int index);
210bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turner
211bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turner/**
212bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turner * cpu_interrupt:
213bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turner * @cpu: The CPU to set an interrupt on.
214bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turner * @mask: The interupts to set.
215bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turner *
216bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turner * Invokes the interrupt handler.
217bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turner */
218bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turnervoid cpu_interrupt(CPUState *cpu, int mask);
219bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turner
220bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turner/**
221bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turner * cpu_reset_interrupt:
222bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turner * @cpu: The CPU to clear the interrupt on.
223bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turner * @mask: The interrupt mask to clear.
224bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turner *
225bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turner * Resets interrupts on the vCPU @cpu.
226bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turner */
227bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turnervoid cpu_reset_interrupt(CPUState *cpu, int mask);
228bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turner
229bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turner/**
230bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turner * cpu_exit:
231bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turner * @cpu: The CPU to exit.
232bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turner *
233bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turner * Requests the CPU @cpu to exit execution.
234bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turner */
235bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turnervoid cpu_exit(CPUState *cpu);
236bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turner
237bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turner/**
238bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turner * cpu_resume:
239bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turner * @cpu: The CPU to resume.
240bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turner *
241bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turner * Resumes CPU, i.e. puts CPU into runnable state.
242bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turner */
243bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turnervoid cpu_resume(CPUState *cpu);
244bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turner
245bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turner/**
246bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turner * qemu_init_vcpu:
247bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turner * @cpu: The vCPU to initialize.
248bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turner *
249bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turner * Initializes a vCPU.
250bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turner */
251bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turnervoid qemu_init_vcpu(CPUState *cpu);
252bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turner
253bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turner#define SSTEP_ENABLE  0x1  /* Enable simulated HW single stepping */
254bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turner#define SSTEP_NOIRQ   0x2  /* Do not use IRQ while single stepping */
255bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turner#define SSTEP_NOTIMER 0x4  /* Do not Timers while single stepping */
256bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turner
257bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turner/**
258bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turner * cpu_single_step:
259bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turner * @cpu: CPU to the flags for.
260bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turner * @enabled: Flags to enable.
261bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turner *
262bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turner * Enables or disables single-stepping for @cpu.
263bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turner */
264bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turnervoid cpu_single_step(CPUState *cpu, int enabled);
265bf7a22f3a6c38d359d2e933dec4706d1c7375f0aDavid 'Digit' Turner
2666657678c3d86395084f6a699e73614195f06c445David 'Digit' Turner#endif  // QEMU_CPU_H
267