Andreas Färber | dd83b06 | 2012-01-28 16:39:52 +0100 | [diff] [blame] | 1 | /* |
| 2 | * QEMU CPU model |
| 3 | * |
| 4 | * Copyright (c) 2012 SUSE LINUX Products GmbH |
| 5 | * |
| 6 | * This program is free software; you can redistribute it and/or |
| 7 | * modify it under the terms of the GNU General Public License |
| 8 | * as published by the Free Software Foundation; either version 2 |
| 9 | * of the License, or (at your option) any later version. |
| 10 | * |
| 11 | * This program is distributed in the hope that it will be useful, |
| 12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| 14 | * GNU General Public License for more details. |
| 15 | * |
| 16 | * You should have received a copy of the GNU General Public License |
| 17 | * along with this program; if not, see |
| 18 | * <http://www.gnu.org/licenses/gpl-2.0.html> |
| 19 | */ |
| 20 | #ifndef QEMU_CPU_H |
| 21 | #define QEMU_CPU_H |
| 22 | |
Paolo Bonzini | 14cccb6 | 2012-12-17 18:19:50 +0100 | [diff] [blame] | 23 | #include "qom/object.h" |
Paolo Bonzini | 1de7afc | 2012-12-17 18:20:00 +0100 | [diff] [blame] | 24 | #include "qemu/thread.h" |
Andreas Färber | dd83b06 | 2012-01-28 16:39:52 +0100 | [diff] [blame] | 25 | |
| 26 | /** |
| 27 | * SECTION:cpu |
| 28 | * @section_id: QEMU-cpu |
| 29 | * @title: CPU Class |
| 30 | * @short_description: Base class for all CPUs |
| 31 | */ |
| 32 | |
| 33 | #define TYPE_CPU "cpu" |
| 34 | |
| 35 | #define CPU(obj) OBJECT_CHECK(CPUState, (obj), TYPE_CPU) |
| 36 | #define CPU_CLASS(class) OBJECT_CLASS_CHECK(CPUClass, (class), TYPE_CPU) |
| 37 | #define CPU_GET_CLASS(obj) OBJECT_GET_CLASS(CPUClass, (obj), TYPE_CPU) |
| 38 | |
| 39 | typedef struct CPUState CPUState; |
| 40 | |
| 41 | /** |
| 42 | * CPUClass: |
Andreas Färber | f5df5ba | 2012-05-02 22:28:58 +0200 | [diff] [blame] | 43 | * @reset: Callback to reset the #CPUState to its initial state. |
Andreas Färber | dd83b06 | 2012-01-28 16:39:52 +0100 | [diff] [blame] | 44 | * |
| 45 | * Represents a CPU family or model. |
| 46 | */ |
| 47 | typedef struct CPUClass { |
| 48 | /*< private >*/ |
| 49 | ObjectClass parent_class; |
| 50 | /*< public >*/ |
| 51 | |
| 52 | void (*reset)(CPUState *cpu); |
| 53 | } CPUClass; |
| 54 | |
Andreas Färber | a60f24b | 2012-12-01 05:35:08 +0100 | [diff] [blame] | 55 | struct KVMState; |
Andreas Färber | f7575c96 | 2012-12-01 06:18:14 +0100 | [diff] [blame] | 56 | struct kvm_run; |
Andreas Färber | a60f24b | 2012-12-01 05:35:08 +0100 | [diff] [blame] | 57 | |
Andreas Färber | dd83b06 | 2012-01-28 16:39:52 +0100 | [diff] [blame] | 58 | /** |
| 59 | * CPUState: |
Andreas Färber | 61a4621 | 2012-05-02 22:49:36 +0200 | [diff] [blame] | 60 | * @created: Indicates whether the CPU thread has been successfully created. |
Andreas Färber | 4fdeee7 | 2012-05-02 23:10:09 +0200 | [diff] [blame] | 61 | * @stop: Indicates a pending stop request. |
Andreas Färber | f324e76 | 2012-05-02 23:26:21 +0200 | [diff] [blame] | 62 | * @stopped: Indicates the CPU has been artificially stopped. |
Andreas Färber | 8737c51 | 2012-10-31 05:29:00 +0100 | [diff] [blame] | 63 | * @kvm_fd: vCPU file descriptor for KVM. |
Andreas Färber | dd83b06 | 2012-01-28 16:39:52 +0100 | [diff] [blame] | 64 | * |
| 65 | * State of one CPU core or thread. |
| 66 | */ |
| 67 | struct CPUState { |
| 68 | /*< private >*/ |
| 69 | Object parent_obj; |
| 70 | /*< public >*/ |
| 71 | |
Andreas Färber | 814e612 | 2012-05-02 17:00:37 +0200 | [diff] [blame] | 72 | struct QemuThread *thread; |
Andreas Färber | bcba2a7 | 2012-05-02 15:24:40 +0200 | [diff] [blame] | 73 | #ifdef _WIN32 |
| 74 | HANDLE hThread; |
| 75 | #endif |
Andreas Färber | 9f09e18 | 2012-05-03 06:59:07 +0200 | [diff] [blame] | 76 | int thread_id; |
Andreas Färber | f5c121b | 2012-05-03 01:22:49 +0200 | [diff] [blame] | 77 | struct QemuCond *halt_cond; |
Andreas Färber | c64ca81 | 2012-05-03 02:11:45 +0200 | [diff] [blame] | 78 | struct qemu_work_item *queued_work_first, *queued_work_last; |
Andreas Färber | 216fc9a | 2012-05-02 17:49:49 +0200 | [diff] [blame] | 79 | bool thread_kicked; |
Andreas Färber | 61a4621 | 2012-05-02 22:49:36 +0200 | [diff] [blame] | 80 | bool created; |
Andreas Färber | 4fdeee7 | 2012-05-02 23:10:09 +0200 | [diff] [blame] | 81 | bool stop; |
Andreas Färber | f324e76 | 2012-05-02 23:26:21 +0200 | [diff] [blame] | 82 | bool stopped; |
Andreas Färber | bcba2a7 | 2012-05-02 15:24:40 +0200 | [diff] [blame] | 83 | |
Andreas Färber | 8737c51 | 2012-10-31 05:29:00 +0100 | [diff] [blame] | 84 | #if !defined(CONFIG_USER_ONLY) |
| 85 | int kvm_fd; |
Andreas Färber | 20d695a | 2012-10-31 06:57:49 +0100 | [diff] [blame] | 86 | bool kvm_vcpu_dirty; |
Andreas Färber | 8737c51 | 2012-10-31 05:29:00 +0100 | [diff] [blame] | 87 | #endif |
Andreas Färber | a60f24b | 2012-12-01 05:35:08 +0100 | [diff] [blame] | 88 | struct KVMState *kvm_state; |
Andreas Färber | f7575c96 | 2012-12-01 06:18:14 +0100 | [diff] [blame] | 89 | struct kvm_run *kvm_run; |
Andreas Färber | 8737c51 | 2012-10-31 05:29:00 +0100 | [diff] [blame] | 90 | |
Andreas Färber | f5df5ba | 2012-05-02 22:28:58 +0200 | [diff] [blame] | 91 | /* TODO Move common fields from CPUArchState here. */ |
Andreas Färber | dd83b06 | 2012-01-28 16:39:52 +0100 | [diff] [blame] | 92 | }; |
| 93 | |
| 94 | |
| 95 | /** |
| 96 | * cpu_reset: |
| 97 | * @cpu: The CPU whose state is to be reset. |
| 98 | */ |
| 99 | void cpu_reset(CPUState *cpu); |
| 100 | |
Andreas Färber | 60e8257 | 2012-05-02 22:23:49 +0200 | [diff] [blame] | 101 | /** |
Andreas Färber | 3993c6b | 2012-05-03 06:43:49 +0200 | [diff] [blame] | 102 | * qemu_cpu_has_work: |
| 103 | * @cpu: The vCPU to check. |
| 104 | * |
| 105 | * Checks whether the CPU has work to do. |
| 106 | * |
| 107 | * Returns: %true if the CPU has work, %false otherwise. |
| 108 | */ |
| 109 | bool qemu_cpu_has_work(CPUState *cpu); |
| 110 | |
| 111 | /** |
Andreas Färber | 60e8257 | 2012-05-02 22:23:49 +0200 | [diff] [blame] | 112 | * qemu_cpu_is_self: |
| 113 | * @cpu: The vCPU to check against. |
| 114 | * |
| 115 | * Checks whether the caller is executing on the vCPU thread. |
| 116 | * |
| 117 | * Returns: %true if called from @cpu's thread, %false otherwise. |
| 118 | */ |
| 119 | bool qemu_cpu_is_self(CPUState *cpu); |
| 120 | |
Andreas Färber | 2fa4534 | 2012-05-02 23:38:39 +0200 | [diff] [blame] | 121 | /** |
Andreas Färber | c08d742 | 2012-05-03 04:34:15 +0200 | [diff] [blame] | 122 | * qemu_cpu_kick: |
| 123 | * @cpu: The vCPU to kick. |
| 124 | * |
| 125 | * Kicks @cpu's thread. |
| 126 | */ |
| 127 | void qemu_cpu_kick(CPUState *cpu); |
| 128 | |
| 129 | /** |
Andreas Färber | 2fa4534 | 2012-05-02 23:38:39 +0200 | [diff] [blame] | 130 | * cpu_is_stopped: |
| 131 | * @cpu: The CPU to check. |
| 132 | * |
| 133 | * Checks whether the CPU is stopped. |
| 134 | * |
| 135 | * Returns: %true if run state is not running or if artificially stopped; |
| 136 | * %false otherwise. |
| 137 | */ |
| 138 | bool cpu_is_stopped(CPUState *cpu); |
| 139 | |
Andreas Färber | f100f0b | 2012-05-03 14:58:47 +0200 | [diff] [blame] | 140 | /** |
| 141 | * run_on_cpu: |
| 142 | * @cpu: The vCPU to run on. |
| 143 | * @func: The function to be executed. |
| 144 | * @data: Data to pass to the function. |
| 145 | * |
| 146 | * Schedules the function @func for execution on the vCPU @cpu. |
| 147 | */ |
| 148 | void run_on_cpu(CPUState *cpu, void (*func)(void *data), void *data); |
| 149 | |
Andreas Färber | dd83b06 | 2012-01-28 16:39:52 +0100 | [diff] [blame] | 150 | |
| 151 | #endif |