12e5b09fdSMarkus Armbruster /* 22e5b09fdSMarkus Armbruster * QEMU CPU model 32e5b09fdSMarkus Armbruster * 42e5b09fdSMarkus Armbruster * Copyright (c) 2012 SUSE LINUX Products GmbH 52e5b09fdSMarkus Armbruster * 62e5b09fdSMarkus Armbruster * This program is free software; you can redistribute it and/or 72e5b09fdSMarkus Armbruster * modify it under the terms of the GNU General Public License 82e5b09fdSMarkus Armbruster * as published by the Free Software Foundation; either version 2 92e5b09fdSMarkus Armbruster * of the License, or (at your option) any later version. 102e5b09fdSMarkus Armbruster * 112e5b09fdSMarkus Armbruster * This program is distributed in the hope that it will be useful, 122e5b09fdSMarkus Armbruster * but WITHOUT ANY WARRANTY; without even the implied warranty of 132e5b09fdSMarkus Armbruster * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 142e5b09fdSMarkus Armbruster * GNU General Public License for more details. 152e5b09fdSMarkus Armbruster * 162e5b09fdSMarkus Armbruster * You should have received a copy of the GNU General Public License 172e5b09fdSMarkus Armbruster * along with this program; if not, see 182e5b09fdSMarkus Armbruster * <http://www.gnu.org/licenses/gpl-2.0.html> 192e5b09fdSMarkus Armbruster */ 202e5b09fdSMarkus Armbruster #ifndef QEMU_CPU_H 212e5b09fdSMarkus Armbruster #define QEMU_CPU_H 222e5b09fdSMarkus Armbruster 232e5b09fdSMarkus Armbruster #include "hw/qdev-core.h" 242e5b09fdSMarkus Armbruster #include "disas/dis-asm.h" 256ce1c9d0SPhilippe Mathieu-Daudé #include "exec/breakpoint.h" 262e5b09fdSMarkus Armbruster #include "exec/hwaddr.h" 2761d6a915SAnton Johansson #include "exec/vaddr.h" 282e5b09fdSMarkus Armbruster #include "exec/memattrs.h" 299c1283ddSPhilippe Mathieu-Daudé #include "exec/mmu-access-type.h" 30ef6d8210SRichard Henderson #include "exec/tlb-common.h" 318fb1435cSPaolo Bonzini #include "qapi/qapi-types-machine.h" 322e5b09fdSMarkus Armbruster #include "qapi/qapi-types-run-state.h" 332e5b09fdSMarkus Armbruster #include "qemu/bitmap.h" 342e5b09fdSMarkus Armbruster #include "qemu/rcu_queue.h" 352e5b09fdSMarkus Armbruster #include "qemu/queue.h" 36*51483f6cSPeter Maydell #include "qemu/lockcnt.h" 372e5b09fdSMarkus Armbruster #include "qemu/thread.h" 38db1015e9SEduardo Habkost #include "qom/object.h" 392e5b09fdSMarkus Armbruster 402e5b09fdSMarkus Armbruster typedef int (*WriteCoreDumpFunction)(const void *buf, size_t size, 412e5b09fdSMarkus Armbruster void *opaque); 422e5b09fdSMarkus Armbruster 432e5b09fdSMarkus Armbruster /** 442e5b09fdSMarkus Armbruster * SECTION:cpu 452e5b09fdSMarkus Armbruster * @section_id: QEMU-cpu 462e5b09fdSMarkus Armbruster * @title: CPU Class 472e5b09fdSMarkus Armbruster * @short_description: Base class for all CPUs 482e5b09fdSMarkus Armbruster */ 492e5b09fdSMarkus Armbruster 502e5b09fdSMarkus Armbruster #define TYPE_CPU "cpu" 512e5b09fdSMarkus Armbruster 522e5b09fdSMarkus Armbruster /* Since this macro is used a lot in hot code paths and in conjunction with 532e5b09fdSMarkus Armbruster * FooCPU *foo_env_get_cpu(), we deviate from usual QOM practice by using 542e5b09fdSMarkus Armbruster * an unchecked cast. 552e5b09fdSMarkus Armbruster */ 562e5b09fdSMarkus Armbruster #define CPU(obj) ((CPUState *)(obj)) 572e5b09fdSMarkus Armbruster 586fbdff87SAlex Bennée /* 596fbdff87SAlex Bennée * The class checkers bring in CPU_GET_CLASS() which is potentially 606fbdff87SAlex Bennée * expensive given the eventual call to 616fbdff87SAlex Bennée * object_class_dynamic_cast_assert(). Because of this the CPUState 626fbdff87SAlex Bennée * has a cached value for the class in cs->cc which is set up in 636fbdff87SAlex Bennée * cpu_exec_realizefn() for use in hot code paths. 646fbdff87SAlex Bennée */ 65db1015e9SEduardo Habkost typedef struct CPUClass CPUClass; 668110fa1dSEduardo Habkost DECLARE_CLASS_CHECKERS(CPUClass, CPU, 678110fa1dSEduardo Habkost TYPE_CPU) 682e5b09fdSMarkus Armbruster 699295b1aaSPhilippe Mathieu-Daudé /** 709295b1aaSPhilippe Mathieu-Daudé * OBJECT_DECLARE_CPU_TYPE: 719295b1aaSPhilippe Mathieu-Daudé * @CpuInstanceType: instance struct name 729295b1aaSPhilippe Mathieu-Daudé * @CpuClassType: class struct name 739295b1aaSPhilippe Mathieu-Daudé * @CPU_MODULE_OBJ_NAME: the CPU name in uppercase with underscore separators 749295b1aaSPhilippe Mathieu-Daudé * 759295b1aaSPhilippe Mathieu-Daudé * This macro is typically used in "cpu-qom.h" header file, and will: 769295b1aaSPhilippe Mathieu-Daudé * 779295b1aaSPhilippe Mathieu-Daudé * - create the typedefs for the CPU object and class structs 789295b1aaSPhilippe Mathieu-Daudé * - register the type for use with g_autoptr 799295b1aaSPhilippe Mathieu-Daudé * - provide three standard type cast functions 809295b1aaSPhilippe Mathieu-Daudé * 819295b1aaSPhilippe Mathieu-Daudé * The object struct and class struct need to be declared manually. 829295b1aaSPhilippe Mathieu-Daudé */ 839295b1aaSPhilippe Mathieu-Daudé #define OBJECT_DECLARE_CPU_TYPE(CpuInstanceType, CpuClassType, CPU_MODULE_OBJ_NAME) \ 84b36e239eSPhilippe Mathieu-Daudé typedef struct ArchCPU CpuInstanceType; \ 85b36e239eSPhilippe Mathieu-Daudé OBJECT_DECLARE_TYPE(ArchCPU, CpuClassType, CPU_MODULE_OBJ_NAME); 869295b1aaSPhilippe Mathieu-Daudé 872e5b09fdSMarkus Armbruster typedef struct CPUWatchpoint CPUWatchpoint; 882e5b09fdSMarkus Armbruster 8915d62536SPaolo Bonzini /* see physmem.c */ 9015d62536SPaolo Bonzini struct CPUAddressSpace; 9115d62536SPaolo Bonzini 9215d62536SPaolo Bonzini /* see accel/tcg/tb-jmp-cache.h */ 9315d62536SPaolo Bonzini struct CPUJumpCache; 9415d62536SPaolo Bonzini 95fb6916ddSClaudio Fontana /* see accel-cpu.h */ 96fb6916ddSClaudio Fontana struct AccelCPUClass; 97fb6916ddSClaudio Fontana 988b80bd28SPhilippe Mathieu-Daudé /* see sysemu-cpu-ops.h */ 998b80bd28SPhilippe Mathieu-Daudé struct SysemuCPUOps; 1008b80bd28SPhilippe Mathieu-Daudé 101e9e51b71SEduardo Habkost /** 1022e5b09fdSMarkus Armbruster * CPUClass: 1032e5b09fdSMarkus Armbruster * @class_by_name: Callback to map -cpu command line model name to an 1042e5b09fdSMarkus Armbruster * instantiatable CPU type. 1052e5b09fdSMarkus Armbruster * @parse_features: Callback to parse command line arguments. 1062e5b09fdSMarkus Armbruster * @reset_dump_flags: #CPUDumpFlags to use for reset logging. 1072e5b09fdSMarkus Armbruster * @has_work: Callback for checking if there is work to do. 108343ed32dSRichard Henderson * @mmu_index: Callback for choosing softmmu mmu index; 109343ed32dSRichard Henderson * may be used internally by memory_rw_debug without TCG. 1102e5b09fdSMarkus Armbruster * @memory_rw_debug: Callback for GDB memory access. 1112e5b09fdSMarkus Armbruster * @dump_state: Callback for dumping state. 1125503da4aSThomas Huth * @query_cpu_fast: 1135503da4aSThomas Huth * Fill in target specific information for the "query-cpus-fast" 1145503da4aSThomas Huth * QAPI call. 1152e5b09fdSMarkus Armbruster * @get_arch_id: Callback for getting architecture-dependent CPU ID. 1162e5b09fdSMarkus Armbruster * @set_pc: Callback for setting the Program Counter register. This 1172e5b09fdSMarkus Armbruster * should have the semantics used by the target architecture when 1182e5b09fdSMarkus Armbruster * setting the PC from a source such as an ELF file entry point; 1192e5b09fdSMarkus Armbruster * for example on Arm it will also set the Thumb mode bit based 1202e5b09fdSMarkus Armbruster * on the least significant bit of the new PC value. 1212e5b09fdSMarkus Armbruster * If the target behaviour here is anything other than "set 1222e5b09fdSMarkus Armbruster * the PC register to the value passed in" then the target must 1232e5b09fdSMarkus Armbruster * also implement the synchronize_from_tb hook. 124e4fdf9dfSRichard Henderson * @get_pc: Callback for getting the Program Counter register. 125e4fdf9dfSRichard Henderson * As above, with the semantics of the target architecture. 1262e5b09fdSMarkus Armbruster * @gdb_read_register: Callback for letting GDB read a register. 1272e5b09fdSMarkus Armbruster * @gdb_write_register: Callback for letting GDB write a register. 1285bc31e94SRichard Henderson * @gdb_adjust_breakpoint: Callback for adjusting the address of a 1295bc31e94SRichard Henderson * breakpoint. Used by AVR to handle a gdb mis-feature with 1305bc31e94SRichard Henderson * its Harvard architecture split code and data. 131ecd6f6a8SAkihiko Odaki * @gdb_num_core_regs: Number of core registers accessible to GDB or 0 to infer 132ecd6f6a8SAkihiko Odaki * from @gdb_core_xml_file. 1332e5b09fdSMarkus Armbruster * @gdb_core_xml_file: File name for core registers GDB XML description. 1342e5b09fdSMarkus Armbruster * @gdb_stop_before_watchpoint: Indicates whether GDB expects the CPU to stop 1352e5b09fdSMarkus Armbruster * before the insn which triggers a watchpoint rather than after it. 1362e5b09fdSMarkus Armbruster * @gdb_arch_name: Optional callback that returns the architecture name known 1372e5b09fdSMarkus Armbruster * to GDB. The caller must free the returned string with g_free. 1382e5b09fdSMarkus Armbruster * @disas_set_info: Setup architecture specific components of disassembly info 1392e5b09fdSMarkus Armbruster * @adjust_watchpoint_address: Perform a target-specific adjustment to an 1402e5b09fdSMarkus Armbruster * address before attempting to match it against watchpoints. 14161ad65d0SRobert Hoo * @deprecation_note: If this CPUClass is deprecated, this field provides 14261ad65d0SRobert Hoo * related information. 1432e5b09fdSMarkus Armbruster * 1442e5b09fdSMarkus Armbruster * Represents a CPU family or model. 1452e5b09fdSMarkus Armbruster */ 146db1015e9SEduardo Habkost struct CPUClass { 1472e5b09fdSMarkus Armbruster /*< private >*/ 1482e5b09fdSMarkus Armbruster DeviceClass parent_class; 1492e5b09fdSMarkus Armbruster /*< public >*/ 1502e5b09fdSMarkus Armbruster 1512e5b09fdSMarkus Armbruster ObjectClass *(*class_by_name)(const char *cpu_model); 1522e5b09fdSMarkus Armbruster void (*parse_features)(const char *typename, char *str, Error **errp); 1532e5b09fdSMarkus Armbruster 1542e5b09fdSMarkus Armbruster bool (*has_work)(CPUState *cpu); 155343ed32dSRichard Henderson int (*mmu_index)(CPUState *cpu, bool ifetch); 1562e5b09fdSMarkus Armbruster int (*memory_rw_debug)(CPUState *cpu, vaddr addr, 1572e5b09fdSMarkus Armbruster uint8_t *buf, int len, bool is_write); 1582e5b09fdSMarkus Armbruster void (*dump_state)(CPUState *cpu, FILE *, int flags); 1595503da4aSThomas Huth void (*query_cpu_fast)(CPUState *cpu, CpuInfoFast *value); 1602e5b09fdSMarkus Armbruster int64_t (*get_arch_id)(CPUState *cpu); 1612e5b09fdSMarkus Armbruster void (*set_pc)(CPUState *cpu, vaddr value); 162e4fdf9dfSRichard Henderson vaddr (*get_pc)(CPUState *cpu); 163a010bdbeSAlex Bennée int (*gdb_read_register)(CPUState *cpu, GByteArray *buf, int reg); 1642e5b09fdSMarkus Armbruster int (*gdb_write_register)(CPUState *cpu, uint8_t *buf, int reg); 1655bc31e94SRichard Henderson vaddr (*gdb_adjust_breakpoint)(CPUState *cpu, vaddr addr); 1662e5b09fdSMarkus Armbruster 1672e5b09fdSMarkus Armbruster const char *gdb_core_xml_file; 168a6506838SAkihiko Odaki const gchar * (*gdb_arch_name)(CPUState *cpu); 1692e5b09fdSMarkus Armbruster 1702e5b09fdSMarkus Armbruster void (*disas_set_info)(CPUState *cpu, disassemble_info *info); 1712e5b09fdSMarkus Armbruster 17261ad65d0SRobert Hoo const char *deprecation_note; 173fb6916ddSClaudio Fontana struct AccelCPUClass *accel_cpu; 174e9e51b71SEduardo Habkost 1758b80bd28SPhilippe Mathieu-Daudé /* when system emulation is not available, this pointer is NULL */ 1768b80bd28SPhilippe Mathieu-Daudé const struct SysemuCPUOps *sysemu_ops; 1778b80bd28SPhilippe Mathieu-Daudé 17878271684SClaudio Fontana /* when TCG is not available, this pointer is NULL */ 1791764ad70SRichard Henderson const TCGCPUOps *tcg_ops; 180cc3f2be6SClaudio Fontana 181cc3f2be6SClaudio Fontana /* 182cc3f2be6SClaudio Fontana * if not NULL, this is called in order for the CPUClass to initialize 183cc3f2be6SClaudio Fontana * class data that depends on the accelerator, see accel/accel-common.c. 184cc3f2be6SClaudio Fontana */ 185cc3f2be6SClaudio Fontana void (*init_accel_cpu)(struct AccelCPUClass *accel_cpu, CPUClass *cc); 186dc29f474SRichard Henderson 187dc29f474SRichard Henderson /* 188dc29f474SRichard Henderson * Keep non-pointer data at the end to minimize holes. 189dc29f474SRichard Henderson */ 190dc29f474SRichard Henderson int reset_dump_flags; 191dc29f474SRichard Henderson int gdb_num_core_regs; 192dc29f474SRichard Henderson bool gdb_stop_before_watchpoint; 193db1015e9SEduardo Habkost }; 1942e5b09fdSMarkus Armbruster 1952e5b09fdSMarkus Armbruster /* 196ef6d8210SRichard Henderson * Fix the number of mmu modes to 16, which is also the maximum 197ef6d8210SRichard Henderson * supported by the softmmu tlb api. 198ef6d8210SRichard Henderson */ 199ef6d8210SRichard Henderson #define NB_MMU_MODES 16 200ef6d8210SRichard Henderson 201ef6d8210SRichard Henderson /* Use a fully associative victim tlb of 8 entries. */ 202ef6d8210SRichard Henderson #define CPU_VTLB_SIZE 8 203ef6d8210SRichard Henderson 204ef6d8210SRichard Henderson /* 205ef6d8210SRichard Henderson * The full TLB entry, which is not accessed by generated TCG code, 206ef6d8210SRichard Henderson * so the layout is not as critical as that of CPUTLBEntry. This is 207ef6d8210SRichard Henderson * also why we don't want to combine the two structs. 208ef6d8210SRichard Henderson */ 209f168808dSRichard Henderson struct CPUTLBEntryFull { 210ef6d8210SRichard Henderson /* 211ef6d8210SRichard Henderson * @xlat_section contains: 212ef6d8210SRichard Henderson * - in the lower TARGET_PAGE_BITS, a physical section number 213ef6d8210SRichard Henderson * - with the lower TARGET_PAGE_BITS masked off, an offset which 214ef6d8210SRichard Henderson * must be added to the virtual address to obtain: 215ef6d8210SRichard Henderson * + the ram_addr_t of the target RAM (if the physical section 216ef6d8210SRichard Henderson * number is PHYS_SECTION_NOTDIRTY or PHYS_SECTION_ROM) 217ef6d8210SRichard Henderson * + the offset within the target MemoryRegion (otherwise) 218ef6d8210SRichard Henderson */ 219ef6d8210SRichard Henderson hwaddr xlat_section; 220ef6d8210SRichard Henderson 221ef6d8210SRichard Henderson /* 222ef6d8210SRichard Henderson * @phys_addr contains the physical address in the address space 223ef6d8210SRichard Henderson * given by cpu_asidx_from_attrs(cpu, @attrs). 224ef6d8210SRichard Henderson */ 225ef6d8210SRichard Henderson hwaddr phys_addr; 226ef6d8210SRichard Henderson 227ef6d8210SRichard Henderson /* @attrs contains the memory transaction attributes for the page. */ 228ef6d8210SRichard Henderson MemTxAttrs attrs; 229ef6d8210SRichard Henderson 230ef6d8210SRichard Henderson /* @prot contains the complete protections for the page. */ 231ef6d8210SRichard Henderson uint8_t prot; 232ef6d8210SRichard Henderson 233ef6d8210SRichard Henderson /* @lg_page_size contains the log2 of the page size. */ 234ef6d8210SRichard Henderson uint8_t lg_page_size; 235ef6d8210SRichard Henderson 236a0ff4a87SRichard Henderson /* Additional tlb flags requested by tlb_fill. */ 237a0ff4a87SRichard Henderson uint8_t tlb_fill_flags; 238a0ff4a87SRichard Henderson 239ef6d8210SRichard Henderson /* 240ef6d8210SRichard Henderson * Additional tlb flags for use by the slow path. If non-zero, 241ef6d8210SRichard Henderson * the corresponding CPUTLBEntry comparator must have TLB_FORCE_SLOW. 242ef6d8210SRichard Henderson */ 243ef6d8210SRichard Henderson uint8_t slow_flags[MMU_ACCESS_COUNT]; 244ef6d8210SRichard Henderson 245ef6d8210SRichard Henderson /* 246ef6d8210SRichard Henderson * Allow target-specific additions to this structure. 247ef6d8210SRichard Henderson * This may be used to cache items from the guest cpu 248ef6d8210SRichard Henderson * page tables for later use by the implementation. 249ef6d8210SRichard Henderson */ 250ef6d8210SRichard Henderson union { 251ef6d8210SRichard Henderson /* 252ef6d8210SRichard Henderson * Cache the attrs and shareability fields from the page table entry. 253ef6d8210SRichard Henderson * 254ef6d8210SRichard Henderson * For ARMMMUIdx_Stage2*, pte_attrs is the S2 descriptor bits [5:2]. 255ef6d8210SRichard Henderson * Otherwise, pte_attrs is the same as the MAIR_EL1 8-bit format. 256ef6d8210SRichard Henderson * For shareability and guarded, as in the SH and GP fields respectively 257ef6d8210SRichard Henderson * of the VMSAv8-64 PTEs. 258ef6d8210SRichard Henderson */ 259ef6d8210SRichard Henderson struct { 260ef6d8210SRichard Henderson uint8_t pte_attrs; 261ef6d8210SRichard Henderson uint8_t shareability; 262ef6d8210SRichard Henderson bool guarded; 263ef6d8210SRichard Henderson } arm; 264ef6d8210SRichard Henderson } extra; 265f168808dSRichard Henderson }; 266ef6d8210SRichard Henderson 267ef6d8210SRichard Henderson /* 268ef6d8210SRichard Henderson * Data elements that are per MMU mode, minus the bits accessed by 269ef6d8210SRichard Henderson * the TCG fast path. 270ef6d8210SRichard Henderson */ 271ef6d8210SRichard Henderson typedef struct CPUTLBDesc { 272ef6d8210SRichard Henderson /* 273ef6d8210SRichard Henderson * Describe a region covering all of the large pages allocated 274ef6d8210SRichard Henderson * into the tlb. When any page within this region is flushed, 275ef6d8210SRichard Henderson * we must flush the entire tlb. The region is matched if 276ef6d8210SRichard Henderson * (addr & large_page_mask) == large_page_addr. 277ef6d8210SRichard Henderson */ 278ef6d8210SRichard Henderson vaddr large_page_addr; 279ef6d8210SRichard Henderson vaddr large_page_mask; 280ef6d8210SRichard Henderson /* host time (in ns) at the beginning of the time window */ 281ef6d8210SRichard Henderson int64_t window_begin_ns; 282ef6d8210SRichard Henderson /* maximum number of entries observed in the window */ 283ef6d8210SRichard Henderson size_t window_max_entries; 284ef6d8210SRichard Henderson size_t n_used_entries; 285ef6d8210SRichard Henderson /* The next index to use in the tlb victim table. */ 286ef6d8210SRichard Henderson size_t vindex; 287ef6d8210SRichard Henderson /* The tlb victim table, in two parts. */ 288ef6d8210SRichard Henderson CPUTLBEntry vtable[CPU_VTLB_SIZE]; 289ef6d8210SRichard Henderson CPUTLBEntryFull vfulltlb[CPU_VTLB_SIZE]; 290ef6d8210SRichard Henderson CPUTLBEntryFull *fulltlb; 291ef6d8210SRichard Henderson } CPUTLBDesc; 292ef6d8210SRichard Henderson 293ef6d8210SRichard Henderson /* 294ef6d8210SRichard Henderson * Data elements that are shared between all MMU modes. 295ef6d8210SRichard Henderson */ 296ef6d8210SRichard Henderson typedef struct CPUTLBCommon { 297ef6d8210SRichard Henderson /* Serialize updates to f.table and d.vtable, and others as noted. */ 298ef6d8210SRichard Henderson QemuSpin lock; 299ef6d8210SRichard Henderson /* 300ef6d8210SRichard Henderson * Within dirty, for each bit N, modifications have been made to 301ef6d8210SRichard Henderson * mmu_idx N since the last time that mmu_idx was flushed. 302ef6d8210SRichard Henderson * Protected by tlb_c.lock. 303ef6d8210SRichard Henderson */ 304ef6d8210SRichard Henderson uint16_t dirty; 305ef6d8210SRichard Henderson /* 306ef6d8210SRichard Henderson * Statistics. These are not lock protected, but are read and 307ef6d8210SRichard Henderson * written atomically. This allows the monitor to print a snapshot 308ef6d8210SRichard Henderson * of the stats without interfering with the cpu. 309ef6d8210SRichard Henderson */ 310ef6d8210SRichard Henderson size_t full_flush_count; 311ef6d8210SRichard Henderson size_t part_flush_count; 312ef6d8210SRichard Henderson size_t elide_flush_count; 313ef6d8210SRichard Henderson } CPUTLBCommon; 314ef6d8210SRichard Henderson 315ef6d8210SRichard Henderson /* 316ef6d8210SRichard Henderson * The entire softmmu tlb, for all MMU modes. 317ef6d8210SRichard Henderson * The meaning of each of the MMU modes is defined in the target code. 318ef6d8210SRichard Henderson * Since this is placed within CPUNegativeOffsetState, the smallest 319ef6d8210SRichard Henderson * negative offsets are at the end of the struct. 320ef6d8210SRichard Henderson */ 321ef6d8210SRichard Henderson typedef struct CPUTLB { 322ef6d8210SRichard Henderson #ifdef CONFIG_TCG 323ef6d8210SRichard Henderson CPUTLBCommon c; 324ef6d8210SRichard Henderson CPUTLBDesc d[NB_MMU_MODES]; 325ef6d8210SRichard Henderson CPUTLBDescFast f[NB_MMU_MODES]; 326ef6d8210SRichard Henderson #endif 327ef6d8210SRichard Henderson } CPUTLB; 328ef6d8210SRichard Henderson 329ef6d8210SRichard Henderson /* 3302e5b09fdSMarkus Armbruster * Low 16 bits: number of cycles left, used only in icount mode. 3312e5b09fdSMarkus Armbruster * High 16 bits: Set to -1 to force TCG to stop executing linked TBs 3322e5b09fdSMarkus Armbruster * for this CPU and return to its top level loop (even in non-icount mode). 3332e5b09fdSMarkus Armbruster * This allows a single read-compare-cbranch-write sequence to test 3342e5b09fdSMarkus Armbruster * for both decrementer underflow and exceptions. 3352e5b09fdSMarkus Armbruster */ 3362e5b09fdSMarkus Armbruster typedef union IcountDecr { 3372e5b09fdSMarkus Armbruster uint32_t u32; 3382e5b09fdSMarkus Armbruster struct { 339e03b5686SMarc-André Lureau #if HOST_BIG_ENDIAN 3402e5b09fdSMarkus Armbruster uint16_t high; 3412e5b09fdSMarkus Armbruster uint16_t low; 3422e5b09fdSMarkus Armbruster #else 3432e5b09fdSMarkus Armbruster uint16_t low; 3442e5b09fdSMarkus Armbruster uint16_t high; 3452e5b09fdSMarkus Armbruster #endif 3462e5b09fdSMarkus Armbruster } u16; 3472e5b09fdSMarkus Armbruster } IcountDecr; 3482e5b09fdSMarkus Armbruster 349b3e7bdebSPhilippe Mathieu-Daudé /** 350b3e7bdebSPhilippe Mathieu-Daudé * CPUNegativeOffsetState: Elements of CPUState most efficiently accessed 351b3e7bdebSPhilippe Mathieu-Daudé * from CPUArchState, via small negative offsets. 352b3e7bdebSPhilippe Mathieu-Daudé * @can_do_io: True if memory-mapped IO is allowed. 35380f034c5SPhilippe Mathieu-Daudé * @plugin_mem_cbs: active plugin memory callbacks 354b709da5dSPierrick Bouvier * @plugin_mem_value_low: 64 lower bits of latest accessed mem value. 355b709da5dSPierrick Bouvier * @plugin_mem_value_high: 64 higher bits of latest accessed mem value. 356ef6d8210SRichard Henderson */ 357ef6d8210SRichard Henderson typedef struct CPUNegativeOffsetState { 358ef6d8210SRichard Henderson CPUTLB tlb; 35980f034c5SPhilippe Mathieu-Daudé #ifdef CONFIG_PLUGIN 36080f034c5SPhilippe Mathieu-Daudé /* 36180f034c5SPhilippe Mathieu-Daudé * The callback pointer are accessed via TCG (see gen_empty_mem_helper). 36280f034c5SPhilippe Mathieu-Daudé */ 36380f034c5SPhilippe Mathieu-Daudé GArray *plugin_mem_cbs; 364b709da5dSPierrick Bouvier uint64_t plugin_mem_value_low; 365b709da5dSPierrick Bouvier uint64_t plugin_mem_value_high; 36680f034c5SPhilippe Mathieu-Daudé #endif 367ef6d8210SRichard Henderson IcountDecr icount_decr; 368464dacf6SRichard Henderson bool can_do_io; 369ef6d8210SRichard Henderson } CPUNegativeOffsetState; 370ef6d8210SRichard Henderson 3712e5b09fdSMarkus Armbruster struct KVMState; 3722e5b09fdSMarkus Armbruster struct kvm_run; 3732e5b09fdSMarkus Armbruster 3742e5b09fdSMarkus Armbruster /* work queue */ 3752e5b09fdSMarkus Armbruster 3762e5b09fdSMarkus Armbruster /* The union type allows passing of 64 bit target pointers on 32 bit 3772e5b09fdSMarkus Armbruster * hosts in a single parameter 3782e5b09fdSMarkus Armbruster */ 3792e5b09fdSMarkus Armbruster typedef union { 3802e5b09fdSMarkus Armbruster int host_int; 3812e5b09fdSMarkus Armbruster unsigned long host_ulong; 3822e5b09fdSMarkus Armbruster void *host_ptr; 3832e5b09fdSMarkus Armbruster vaddr target_ptr; 3842e5b09fdSMarkus Armbruster } run_on_cpu_data; 3852e5b09fdSMarkus Armbruster 3862e5b09fdSMarkus Armbruster #define RUN_ON_CPU_HOST_PTR(p) ((run_on_cpu_data){.host_ptr = (p)}) 3872e5b09fdSMarkus Armbruster #define RUN_ON_CPU_HOST_INT(i) ((run_on_cpu_data){.host_int = (i)}) 3882e5b09fdSMarkus Armbruster #define RUN_ON_CPU_HOST_ULONG(ul) ((run_on_cpu_data){.host_ulong = (ul)}) 3892e5b09fdSMarkus Armbruster #define RUN_ON_CPU_TARGET_PTR(v) ((run_on_cpu_data){.target_ptr = (v)}) 3902e5b09fdSMarkus Armbruster #define RUN_ON_CPU_NULL RUN_ON_CPU_HOST_PTR(NULL) 3912e5b09fdSMarkus Armbruster 3922e5b09fdSMarkus Armbruster typedef void (*run_on_cpu_func)(CPUState *cpu, run_on_cpu_data data); 3932e5b09fdSMarkus Armbruster 3942e5b09fdSMarkus Armbruster struct qemu_work_item; 3952e5b09fdSMarkus Armbruster 3962e5b09fdSMarkus Armbruster #define CPU_UNSET_NUMA_NODE_ID -1 3972e5b09fdSMarkus Armbruster 3982e5b09fdSMarkus Armbruster /** 399b8a208ccSAlex Bennée * struct CPUState - common state of one CPU core or thread. 400b8a208ccSAlex Bennée * 4012e5b09fdSMarkus Armbruster * @cpu_index: CPU index (informative). 4022e5b09fdSMarkus Armbruster * @cluster_index: Identifies which cluster this CPU is in. 4032e5b09fdSMarkus Armbruster * For boards which don't define clusters or for "loose" CPUs not assigned 4042e5b09fdSMarkus Armbruster * to a cluster this will be UNASSIGNED_CLUSTER_INDEX; otherwise it will 4052e5b09fdSMarkus Armbruster * be the same as the cluster-id property of the CPU object's TYPE_CPU_CLUSTER 4062e5b09fdSMarkus Armbruster * QOM parent. 407a371975eSPhilippe Mathieu-Daudé * Under TCG this value is propagated to @tcg_cflags. 408a371975eSPhilippe Mathieu-Daudé * See TranslationBlock::TCG CF_CLUSTER_MASK. 4096cc9d67cSRichard Henderson * @tcg_cflags: Pre-computed cflags for this cpu. 4102e5b09fdSMarkus Armbruster * @nr_cores: Number of cores within this CPU package. 411aa1878fbSZhao Liu * @nr_threads: Number of threads within this CPU core. 412a4c2735fSAlex Bennée * @thread: Host thread details, only live once @created is #true 413a4c2735fSAlex Bennée * @sem: WIN32 only semaphore used only for qtest 414a4c2735fSAlex Bennée * @thread_id: native thread id of vCPU, only live once @created is #true 4152e5b09fdSMarkus Armbruster * @running: #true if CPU is currently running (lockless). 4162e5b09fdSMarkus Armbruster * @has_waiter: #true if a CPU is currently waiting for the cpu_exec_end; 4172e5b09fdSMarkus Armbruster * valid under cpu_list_lock. 4182e5b09fdSMarkus Armbruster * @created: Indicates whether the CPU thread has been successfully created. 419a4c2735fSAlex Bennée * @halt_cond: condition variable sleeping threads can wait on. 4202e5b09fdSMarkus Armbruster * @interrupt_request: Indicates a pending interrupt request. 4212e5b09fdSMarkus Armbruster * @halted: Nonzero if the CPU is in suspended state. 4222e5b09fdSMarkus Armbruster * @stop: Indicates a pending stop request. 4232e5b09fdSMarkus Armbruster * @stopped: Indicates the CPU has been artificially stopped. 4242e5b09fdSMarkus Armbruster * @unplug: Indicates a pending CPU unplug request. 4252e5b09fdSMarkus Armbruster * @crash_occurred: Indicates the OS reported a crash (panic) for this CPU 4262e5b09fdSMarkus Armbruster * @singlestep_enabled: Flags for single-stepping. 4272e5b09fdSMarkus Armbruster * @icount_extra: Instructions until next timer event. 4282e5b09fdSMarkus Armbruster * @cpu_ases: Pointer to array of CPUAddressSpaces (which define the 4292e5b09fdSMarkus Armbruster * AddressSpaces this CPU has) 4302e5b09fdSMarkus Armbruster * @num_ases: number of CPUAddressSpaces in @cpu_ases 4312e5b09fdSMarkus Armbruster * @as: Pointer to the first AddressSpace, for the convenience of targets which 4322e5b09fdSMarkus Armbruster * only have a single AddressSpace 4332e5b09fdSMarkus Armbruster * @gdb_regs: Additional GDB registers. 4342e5b09fdSMarkus Armbruster * @gdb_num_regs: Number of total registers accessible to GDB. 4352e5b09fdSMarkus Armbruster * @gdb_num_g_regs: Number of registers in GDB 'g' packets. 4368d41afa4SPhilippe Mathieu-Daudé * @node: QTAILQ of CPUs sharing TB cache. 4372e5b09fdSMarkus Armbruster * @opaque: User data. 4382e5b09fdSMarkus Armbruster * @mem_io_pc: Host Program Counter at which the memory was accessed. 439f861b3f3SPhilippe Mathieu-Daudé * @accel: Pointer to accelerator specific state. 4402e5b09fdSMarkus Armbruster * @kvm_fd: vCPU file descriptor for KVM. 4410c0fcc20SEmilio G. Cota * @work_mutex: Lock to prevent multiple access to @work_list. 4420c0fcc20SEmilio G. Cota * @work_list: List of pending asynchronous work. 443c0061471SAlex Bennée * @plugin_state: per-CPU plugin state 4442e5b09fdSMarkus Armbruster * @ignore_memory_transaction_failures: Cached copy of the MachineState 4452e5b09fdSMarkus Armbruster * flag of the same name: allows the board to suppress calling of the 4462e5b09fdSMarkus Armbruster * CPU do_transaction_failed hook function. 447b4420f19SPeter Xu * @kvm_dirty_gfns: Points to the KVM dirty ring for this CPU when KVM dirty 448b4420f19SPeter Xu * ring is enabled. 449b4420f19SPeter Xu * @kvm_fetch_index: Keeps the index that we last fetched from the per-vCPU 450b4420f19SPeter Xu * dirty ring structure. 4512e5b09fdSMarkus Armbruster * 452b8a208ccSAlex Bennée * @neg_align: The CPUState is the common part of a concrete ArchCPU 453b8a208ccSAlex Bennée * which is allocated when an individual CPU instance is created. As 454b8a208ccSAlex Bennée * such care is taken is ensure there is no gap between between 455b8a208ccSAlex Bennée * CPUState and CPUArchState within ArchCPU. 4563b3d7df5SRichard Henderson * 457b8a208ccSAlex Bennée * @neg: The architectural register state ("cpu_env") immediately follows 458b8a208ccSAlex Bennée * CPUState in ArchCPU and is passed to TCG code. The @neg structure holds 459b8a208ccSAlex Bennée * some common TCG CPU variables which are accessed with a negative offset 460b8a208ccSAlex Bennée * from cpu_env. 4612e5b09fdSMarkus Armbruster */ 4622e5b09fdSMarkus Armbruster struct CPUState { 4632e5b09fdSMarkus Armbruster /*< private >*/ 4642e5b09fdSMarkus Armbruster DeviceState parent_obj; 4656fbdff87SAlex Bennée /* cache to avoid expensive CPU_GET_CLASS */ 4666fbdff87SAlex Bennée CPUClass *cc; 4672e5b09fdSMarkus Armbruster /*< public >*/ 4682e5b09fdSMarkus Armbruster 4692e5b09fdSMarkus Armbruster int nr_cores; 4702e5b09fdSMarkus Armbruster int nr_threads; 4712e5b09fdSMarkus Armbruster 4722e5b09fdSMarkus Armbruster struct QemuThread *thread; 4732e5b09fdSMarkus Armbruster #ifdef _WIN32 474c9923550SXuzhou Cheng QemuSemaphore sem; 4752e5b09fdSMarkus Armbruster #endif 4762e5b09fdSMarkus Armbruster int thread_id; 4772e5b09fdSMarkus Armbruster bool running, has_waiter; 4782e5b09fdSMarkus Armbruster struct QemuCond *halt_cond; 4792e5b09fdSMarkus Armbruster bool thread_kicked; 4802e5b09fdSMarkus Armbruster bool created; 4812e5b09fdSMarkus Armbruster bool stop; 4822e5b09fdSMarkus Armbruster bool stopped; 483c1b70158SThiago Jung Bauermann 484c1b70158SThiago Jung Bauermann /* Should CPU start in powered-off state? */ 485c1b70158SThiago Jung Bauermann bool start_powered_off; 486c1b70158SThiago Jung Bauermann 4872e5b09fdSMarkus Armbruster bool unplug; 4882e5b09fdSMarkus Armbruster bool crash_occurred; 4892e5b09fdSMarkus Armbruster bool exit_request; 490df8a6880SIlya Leoshkevich int exclusive_context_count; 4912e5b09fdSMarkus Armbruster uint32_t cflags_next_tb; 4922e5b09fdSMarkus Armbruster /* updates protected by BQL */ 4932e5b09fdSMarkus Armbruster uint32_t interrupt_request; 4942e5b09fdSMarkus Armbruster int singlestep_enabled; 4952e5b09fdSMarkus Armbruster int64_t icount_budget; 4962e5b09fdSMarkus Armbruster int64_t icount_extra; 4972e5b09fdSMarkus Armbruster uint64_t random_seed; 4982e5b09fdSMarkus Armbruster sigjmp_buf jmp_env; 4992e5b09fdSMarkus Armbruster 5002e5b09fdSMarkus Armbruster QemuMutex work_mutex; 5010c0fcc20SEmilio G. Cota QSIMPLEQ_HEAD(, qemu_work_item) work_list; 5022e5b09fdSMarkus Armbruster 50315d62536SPaolo Bonzini struct CPUAddressSpace *cpu_ases; 50424bec42fSSalil Mehta int cpu_ases_count; 5052e5b09fdSMarkus Armbruster int num_ases; 5062e5b09fdSMarkus Armbruster AddressSpace *as; 5072e5b09fdSMarkus Armbruster MemoryRegion *memory; 5082e5b09fdSMarkus Armbruster 50915d62536SPaolo Bonzini struct CPUJumpCache *tb_jmp_cache; 5102e5b09fdSMarkus Armbruster 51173c392c2SAkihiko Odaki GArray *gdb_regs; 5122e5b09fdSMarkus Armbruster int gdb_num_regs; 5132e5b09fdSMarkus Armbruster int gdb_num_g_regs; 5142e5b09fdSMarkus Armbruster QTAILQ_ENTRY(CPUState) node; 5152e5b09fdSMarkus Armbruster 5162e5b09fdSMarkus Armbruster /* ice debug support */ 5172e5b09fdSMarkus Armbruster QTAILQ_HEAD(, CPUBreakpoint) breakpoints; 5182e5b09fdSMarkus Armbruster 5192e5b09fdSMarkus Armbruster QTAILQ_HEAD(, CPUWatchpoint) watchpoints; 5202e5b09fdSMarkus Armbruster CPUWatchpoint *watchpoint_hit; 5212e5b09fdSMarkus Armbruster 5222e5b09fdSMarkus Armbruster void *opaque; 5232e5b09fdSMarkus Armbruster 5242e5b09fdSMarkus Armbruster /* In order to avoid passing too many arguments to the MMIO helpers, 5252e5b09fdSMarkus Armbruster * we store some rarely used information in the CPU context. 5262e5b09fdSMarkus Armbruster */ 5272e5b09fdSMarkus Armbruster uintptr_t mem_io_pc; 5282e5b09fdSMarkus Armbruster 529b4420f19SPeter Xu /* Only used in KVM */ 5302e5b09fdSMarkus Armbruster int kvm_fd; 5312e5b09fdSMarkus Armbruster struct KVMState *kvm_state; 5322e5b09fdSMarkus Armbruster struct kvm_run *kvm_run; 533b4420f19SPeter Xu struct kvm_dirty_gfn *kvm_dirty_gfns; 534b4420f19SPeter Xu uint32_t kvm_fetch_index; 5357786ae40SHyman Huang(黄勇) uint64_t dirty_pages; 5363b6f4852SMarcelo Tosatti int kvm_vcpu_stats_fd; 537e6203636SPhilippe Mathieu-Daudé bool vcpu_dirty; 5382e5b09fdSMarkus Armbruster 539bd688fc9SEmanuele Giuseppe Esposito /* Use by accel-block: CPU is executing an ioctl() */ 540bd688fc9SEmanuele Giuseppe Esposito QemuLockCnt in_ioctl_lock; 541bd688fc9SEmanuele Giuseppe Esposito 5422f3a57eeSAlex Bennée #ifdef CONFIG_PLUGIN 543c0061471SAlex Bennée CPUPluginState *plugin_state; 544c5ffd16bSPeter Maydell #endif 54554cb65d8SEmilio G. Cota 5462e5b09fdSMarkus Armbruster /* TODO Move common fields from CPUArchState here. */ 5472e5b09fdSMarkus Armbruster int cpu_index; 5482e5b09fdSMarkus Armbruster int cluster_index; 5496cc9d67cSRichard Henderson uint32_t tcg_cflags; 5502e5b09fdSMarkus Armbruster uint32_t halted; 5512e5b09fdSMarkus Armbruster int32_t exception_index; 5522e5b09fdSMarkus Armbruster 553f861b3f3SPhilippe Mathieu-Daudé AccelCPUState *accel; 5542e5b09fdSMarkus Armbruster 5552e5b09fdSMarkus Armbruster /* Used to keep track of an outstanding cpu throttle thread for migration 5562e5b09fdSMarkus Armbruster * autoconverge 5572e5b09fdSMarkus Armbruster */ 5582e5b09fdSMarkus Armbruster bool throttle_thread_scheduled; 5592e5b09fdSMarkus Armbruster 560baa60983SHyman Huang(黄勇) /* 561baa60983SHyman Huang(黄勇) * Sleep throttle_us_per_full microseconds once dirty ring is full 562baa60983SHyman Huang(黄勇) * if dirty page rate limit is enabled. 563baa60983SHyman Huang(黄勇) */ 564baa60983SHyman Huang(黄勇) int64_t throttle_us_per_full; 565baa60983SHyman Huang(黄勇) 5662e5b09fdSMarkus Armbruster bool ignore_memory_transaction_failures; 5672e5b09fdSMarkus Armbruster 5686e8dcacdSRichard Henderson /* Used for user-only emulation of prctl(PR_SET_UNALIGN). */ 5696e8dcacdSRichard Henderson bool prctl_unalign_sigbus; 5706e8dcacdSRichard Henderson 5712e5b09fdSMarkus Armbruster /* track IOMMUs whose translations we've cached in the TCG TLB */ 5722e5b09fdSMarkus Armbruster GArray *iommu_notifiers; 5733b3d7df5SRichard Henderson 5743b3d7df5SRichard Henderson /* 5753b3d7df5SRichard Henderson * MUST BE LAST in order to minimize the displacement to CPUArchState. 5763b3d7df5SRichard Henderson */ 5773b3d7df5SRichard Henderson char neg_align[-sizeof(CPUNegativeOffsetState) % 16] QEMU_ALIGNED(16); 5783b3d7df5SRichard Henderson CPUNegativeOffsetState neg; 5792e5b09fdSMarkus Armbruster }; 5802e5b09fdSMarkus Armbruster 5813b3d7df5SRichard Henderson /* Validate placement of CPUNegativeOffsetState. */ 5823b3d7df5SRichard Henderson QEMU_BUILD_BUG_ON(offsetof(CPUState, neg) != 5833b3d7df5SRichard Henderson sizeof(CPUState) - sizeof(CPUNegativeOffsetState)); 5843b3d7df5SRichard Henderson 585b77af26eSRichard Henderson static inline CPUArchState *cpu_env(CPUState *cpu) 586b77af26eSRichard Henderson { 587b77af26eSRichard Henderson /* We validate that CPUArchState follows CPUState in cpu-all.h. */ 588b77af26eSRichard Henderson return (CPUArchState *)(cpu + 1); 589b77af26eSRichard Henderson } 590b77af26eSRichard Henderson 5912e5b09fdSMarkus Armbruster typedef QTAILQ_HEAD(CPUTailQ, CPUState) CPUTailQ; 5923c55dd58SPhilippe Mathieu-Daudé extern CPUTailQ cpus_queue; 5932e5b09fdSMarkus Armbruster 5943c55dd58SPhilippe Mathieu-Daudé #define first_cpu QTAILQ_FIRST_RCU(&cpus_queue) 5952e5b09fdSMarkus Armbruster #define CPU_NEXT(cpu) QTAILQ_NEXT_RCU(cpu, node) 5963c55dd58SPhilippe Mathieu-Daudé #define CPU_FOREACH(cpu) QTAILQ_FOREACH_RCU(cpu, &cpus_queue, node) 5972e5b09fdSMarkus Armbruster #define CPU_FOREACH_SAFE(cpu, next_cpu) \ 5983c55dd58SPhilippe Mathieu-Daudé QTAILQ_FOREACH_SAFE_RCU(cpu, &cpus_queue, node, next_cpu) 5992e5b09fdSMarkus Armbruster 6002e5b09fdSMarkus Armbruster extern __thread CPUState *current_cpu; 6012e5b09fdSMarkus Armbruster 6022e5b09fdSMarkus Armbruster /** 6032e5b09fdSMarkus Armbruster * qemu_tcg_mttcg_enabled: 6042e5b09fdSMarkus Armbruster * Check whether we are running MultiThread TCG or not. 6052e5b09fdSMarkus Armbruster * 6062e5b09fdSMarkus Armbruster * Returns: %true if we are in MTTCG mode %false otherwise. 6072e5b09fdSMarkus Armbruster */ 6082e5b09fdSMarkus Armbruster extern bool mttcg_enabled; 6092e5b09fdSMarkus Armbruster #define qemu_tcg_mttcg_enabled() (mttcg_enabled) 6102e5b09fdSMarkus Armbruster 6112e5b09fdSMarkus Armbruster /** 6122e5b09fdSMarkus Armbruster * cpu_paging_enabled: 6132e5b09fdSMarkus Armbruster * @cpu: The CPU whose state is to be inspected. 6142e5b09fdSMarkus Armbruster * 6152e5b09fdSMarkus Armbruster * Returns: %true if paging is enabled, %false otherwise. 6162e5b09fdSMarkus Armbruster */ 6172e5b09fdSMarkus Armbruster bool cpu_paging_enabled(const CPUState *cpu); 6182e5b09fdSMarkus Armbruster 6192e5b09fdSMarkus Armbruster /** 6202e5b09fdSMarkus Armbruster * cpu_get_memory_mapping: 6212e5b09fdSMarkus Armbruster * @cpu: The CPU whose memory mappings are to be obtained. 6222e5b09fdSMarkus Armbruster * @list: Where to write the memory mappings to. 6232e5b09fdSMarkus Armbruster * @errp: Pointer for reporting an #Error. 6248a5b974bSMarc-André Lureau * 6258a5b974bSMarc-André Lureau * Returns: %true on success, %false otherwise. 6262e5b09fdSMarkus Armbruster */ 6278a5b974bSMarc-André Lureau bool cpu_get_memory_mapping(CPUState *cpu, MemoryMappingList *list, 6282e5b09fdSMarkus Armbruster Error **errp); 6292e5b09fdSMarkus Armbruster 630cfe35d48SPhilippe Mathieu-Daudé #if !defined(CONFIG_USER_ONLY) 631cfe35d48SPhilippe Mathieu-Daudé 6322e5b09fdSMarkus Armbruster /** 6332e5b09fdSMarkus Armbruster * cpu_write_elf64_note: 6342e5b09fdSMarkus Armbruster * @f: pointer to a function that writes memory to a file 6352e5b09fdSMarkus Armbruster * @cpu: The CPU whose memory is to be dumped 6362e5b09fdSMarkus Armbruster * @cpuid: ID number of the CPU 6372e5b09fdSMarkus Armbruster * @opaque: pointer to the CPUState struct 6382e5b09fdSMarkus Armbruster */ 6392e5b09fdSMarkus Armbruster int cpu_write_elf64_note(WriteCoreDumpFunction f, CPUState *cpu, 6402e5b09fdSMarkus Armbruster int cpuid, void *opaque); 6412e5b09fdSMarkus Armbruster 6422e5b09fdSMarkus Armbruster /** 6432e5b09fdSMarkus Armbruster * cpu_write_elf64_qemunote: 6442e5b09fdSMarkus Armbruster * @f: pointer to a function that writes memory to a file 6452e5b09fdSMarkus Armbruster * @cpu: The CPU whose memory is to be dumped 6462e5b09fdSMarkus Armbruster * @cpuid: ID number of the CPU 6472e5b09fdSMarkus Armbruster * @opaque: pointer to the CPUState struct 6482e5b09fdSMarkus Armbruster */ 6492e5b09fdSMarkus Armbruster int cpu_write_elf64_qemunote(WriteCoreDumpFunction f, CPUState *cpu, 6502e5b09fdSMarkus Armbruster void *opaque); 6512e5b09fdSMarkus Armbruster 6522e5b09fdSMarkus Armbruster /** 6532e5b09fdSMarkus Armbruster * cpu_write_elf32_note: 6542e5b09fdSMarkus Armbruster * @f: pointer to a function that writes memory to a file 6552e5b09fdSMarkus Armbruster * @cpu: The CPU whose memory is to be dumped 6562e5b09fdSMarkus Armbruster * @cpuid: ID number of the CPU 6572e5b09fdSMarkus Armbruster * @opaque: pointer to the CPUState struct 6582e5b09fdSMarkus Armbruster */ 6592e5b09fdSMarkus Armbruster int cpu_write_elf32_note(WriteCoreDumpFunction f, CPUState *cpu, 6602e5b09fdSMarkus Armbruster int cpuid, void *opaque); 6612e5b09fdSMarkus Armbruster 6622e5b09fdSMarkus Armbruster /** 6632e5b09fdSMarkus Armbruster * cpu_write_elf32_qemunote: 6642e5b09fdSMarkus Armbruster * @f: pointer to a function that writes memory to a file 6652e5b09fdSMarkus Armbruster * @cpu: The CPU whose memory is to be dumped 6662e5b09fdSMarkus Armbruster * @cpuid: ID number of the CPU 6672e5b09fdSMarkus Armbruster * @opaque: pointer to the CPUState struct 6682e5b09fdSMarkus Armbruster */ 6692e5b09fdSMarkus Armbruster int cpu_write_elf32_qemunote(WriteCoreDumpFunction f, CPUState *cpu, 6702e5b09fdSMarkus Armbruster void *opaque); 6712e5b09fdSMarkus Armbruster 6722e5b09fdSMarkus Armbruster /** 6732e5b09fdSMarkus Armbruster * cpu_get_crash_info: 6742e5b09fdSMarkus Armbruster * @cpu: The CPU to get crash information for 6752e5b09fdSMarkus Armbruster * 6762e5b09fdSMarkus Armbruster * Gets the previously saved crash information. 6772e5b09fdSMarkus Armbruster * Caller is responsible for freeing the data. 6782e5b09fdSMarkus Armbruster */ 6792e5b09fdSMarkus Armbruster GuestPanicInformation *cpu_get_crash_info(CPUState *cpu); 6802e5b09fdSMarkus Armbruster 681cfe35d48SPhilippe Mathieu-Daudé #endif /* !CONFIG_USER_ONLY */ 682cfe35d48SPhilippe Mathieu-Daudé 6832e5b09fdSMarkus Armbruster /** 6842e5b09fdSMarkus Armbruster * CPUDumpFlags: 6852e5b09fdSMarkus Armbruster * @CPU_DUMP_CODE: 6862e5b09fdSMarkus Armbruster * @CPU_DUMP_FPU: dump FPU register state, not just integer 6872e5b09fdSMarkus Armbruster * @CPU_DUMP_CCOP: dump info about TCG QEMU's condition code optimization state 688b84694deSIvan Klokov * @CPU_DUMP_VPU: dump VPU registers 6892e5b09fdSMarkus Armbruster */ 6902e5b09fdSMarkus Armbruster enum CPUDumpFlags { 6912e5b09fdSMarkus Armbruster CPU_DUMP_CODE = 0x00010000, 6922e5b09fdSMarkus Armbruster CPU_DUMP_FPU = 0x00020000, 6932e5b09fdSMarkus Armbruster CPU_DUMP_CCOP = 0x00040000, 694b84694deSIvan Klokov CPU_DUMP_VPU = 0x00080000, 6952e5b09fdSMarkus Armbruster }; 6962e5b09fdSMarkus Armbruster 6972e5b09fdSMarkus Armbruster /** 6982e5b09fdSMarkus Armbruster * cpu_dump_state: 6992e5b09fdSMarkus Armbruster * @cpu: The CPU whose state is to be dumped. 7002e5b09fdSMarkus Armbruster * @f: If non-null, dump to this stream, else to current print sink. 7012e5b09fdSMarkus Armbruster * 7022e5b09fdSMarkus Armbruster * Dumps CPU state. 7032e5b09fdSMarkus Armbruster */ 7042e5b09fdSMarkus Armbruster void cpu_dump_state(CPUState *cpu, FILE *f, int flags); 7052e5b09fdSMarkus Armbruster 7062e5b09fdSMarkus Armbruster #ifndef CONFIG_USER_ONLY 7072e5b09fdSMarkus Armbruster /** 7082e5b09fdSMarkus Armbruster * cpu_get_phys_page_attrs_debug: 7092e5b09fdSMarkus Armbruster * @cpu: The CPU to obtain the physical page address for. 7102e5b09fdSMarkus Armbruster * @addr: The virtual address. 7112e5b09fdSMarkus Armbruster * @attrs: Updated on return with the memory transaction attributes to use 7122e5b09fdSMarkus Armbruster * for this access. 7132e5b09fdSMarkus Armbruster * 7142e5b09fdSMarkus Armbruster * Obtains the physical page corresponding to a virtual one, together 7152e5b09fdSMarkus Armbruster * with the corresponding memory transaction attributes to use for the access. 7162e5b09fdSMarkus Armbruster * Use it only for debugging because no protection checks are done. 7172e5b09fdSMarkus Armbruster * 7182e5b09fdSMarkus Armbruster * Returns: Corresponding physical page address or -1 if no page found. 7192e5b09fdSMarkus Armbruster */ 720a41d3aaeSPhilippe Mathieu-Daudé hwaddr cpu_get_phys_page_attrs_debug(CPUState *cpu, vaddr addr, 721a41d3aaeSPhilippe Mathieu-Daudé MemTxAttrs *attrs); 7222e5b09fdSMarkus Armbruster 7232e5b09fdSMarkus Armbruster /** 7242e5b09fdSMarkus Armbruster * cpu_get_phys_page_debug: 7252e5b09fdSMarkus Armbruster * @cpu: The CPU to obtain the physical page address for. 7262e5b09fdSMarkus Armbruster * @addr: The virtual address. 7272e5b09fdSMarkus Armbruster * 7282e5b09fdSMarkus Armbruster * Obtains the physical page corresponding to a virtual one. 7292e5b09fdSMarkus Armbruster * Use it only for debugging because no protection checks are done. 7302e5b09fdSMarkus Armbruster * 7312e5b09fdSMarkus Armbruster * Returns: Corresponding physical page address or -1 if no page found. 7322e5b09fdSMarkus Armbruster */ 733a41d3aaeSPhilippe Mathieu-Daudé hwaddr cpu_get_phys_page_debug(CPUState *cpu, vaddr addr); 7342e5b09fdSMarkus Armbruster 7352e5b09fdSMarkus Armbruster /** cpu_asidx_from_attrs: 7362e5b09fdSMarkus Armbruster * @cpu: CPU 7372e5b09fdSMarkus Armbruster * @attrs: memory transaction attributes 7382e5b09fdSMarkus Armbruster * 7392e5b09fdSMarkus Armbruster * Returns the address space index specifying the CPU AddressSpace 7402e5b09fdSMarkus Armbruster * to use for a memory access with the given transaction attributes. 7412e5b09fdSMarkus Armbruster */ 742a41d3aaeSPhilippe Mathieu-Daudé int cpu_asidx_from_attrs(CPUState *cpu, MemTxAttrs attrs); 7432e5b09fdSMarkus Armbruster 744cdba7e2fSPhilippe Mathieu-Daudé /** 745cdba7e2fSPhilippe Mathieu-Daudé * cpu_virtio_is_big_endian: 746cdba7e2fSPhilippe Mathieu-Daudé * @cpu: CPU 747cdba7e2fSPhilippe Mathieu-Daudé 748cdba7e2fSPhilippe Mathieu-Daudé * Returns %true if a CPU which supports runtime configurable endianness 749cdba7e2fSPhilippe Mathieu-Daudé * is currently big-endian. 750cdba7e2fSPhilippe Mathieu-Daudé */ 751cdba7e2fSPhilippe Mathieu-Daudé bool cpu_virtio_is_big_endian(CPUState *cpu); 752cfe35d48SPhilippe Mathieu-Daudé 753cfe35d48SPhilippe Mathieu-Daudé #endif /* CONFIG_USER_ONLY */ 7542e5b09fdSMarkus Armbruster 7552e5b09fdSMarkus Armbruster /** 7562e5b09fdSMarkus Armbruster * cpu_list_add: 7572e5b09fdSMarkus Armbruster * @cpu: The CPU to be added to the list of CPUs. 7582e5b09fdSMarkus Armbruster */ 7592e5b09fdSMarkus Armbruster void cpu_list_add(CPUState *cpu); 7602e5b09fdSMarkus Armbruster 7612e5b09fdSMarkus Armbruster /** 7622e5b09fdSMarkus Armbruster * cpu_list_remove: 7632e5b09fdSMarkus Armbruster * @cpu: The CPU to be removed from the list of CPUs. 7642e5b09fdSMarkus Armbruster */ 7652e5b09fdSMarkus Armbruster void cpu_list_remove(CPUState *cpu); 7662e5b09fdSMarkus Armbruster 7672e5b09fdSMarkus Armbruster /** 7682e5b09fdSMarkus Armbruster * cpu_reset: 7692e5b09fdSMarkus Armbruster * @cpu: The CPU whose state is to be reset. 7702e5b09fdSMarkus Armbruster */ 7712e5b09fdSMarkus Armbruster void cpu_reset(CPUState *cpu); 7722e5b09fdSMarkus Armbruster 7732e5b09fdSMarkus Armbruster /** 7742e5b09fdSMarkus Armbruster * cpu_class_by_name: 7752e5b09fdSMarkus Armbruster * @typename: The CPU base type. 7762e5b09fdSMarkus Armbruster * @cpu_model: The model string without any parameters. 7772e5b09fdSMarkus Armbruster * 7783a9d0d7bSPhilippe Mathieu-Daudé * Looks up a concrete CPU #ObjectClass matching name @cpu_model. 7792e5b09fdSMarkus Armbruster * 7803a9d0d7bSPhilippe Mathieu-Daudé * Returns: A concrete #CPUClass or %NULL if no matching class is found 7813a9d0d7bSPhilippe Mathieu-Daudé * or if the matching class is abstract. 7822e5b09fdSMarkus Armbruster */ 7832e5b09fdSMarkus Armbruster ObjectClass *cpu_class_by_name(const char *typename, const char *cpu_model); 7842e5b09fdSMarkus Armbruster 7852e5b09fdSMarkus Armbruster /** 786445946f4SGavin Shan * cpu_model_from_type: 787445946f4SGavin Shan * @typename: The CPU type name 788445946f4SGavin Shan * 789445946f4SGavin Shan * Extract the CPU model name from the CPU type name. The 790445946f4SGavin Shan * CPU type name is either the combination of the CPU model 791445946f4SGavin Shan * name and suffix, or same to the CPU model name. 792445946f4SGavin Shan * 793445946f4SGavin Shan * Returns: CPU model name or NULL if the CPU class doesn't exist 794445946f4SGavin Shan * The user should g_free() the string once no longer needed. 795445946f4SGavin Shan */ 796445946f4SGavin Shan char *cpu_model_from_type(const char *typename); 797445946f4SGavin Shan 798445946f4SGavin Shan /** 7992e5b09fdSMarkus Armbruster * cpu_create: 8002e5b09fdSMarkus Armbruster * @typename: The CPU type. 8012e5b09fdSMarkus Armbruster * 8022e5b09fdSMarkus Armbruster * Instantiates a CPU and realizes the CPU. 8032e5b09fdSMarkus Armbruster * 8042e5b09fdSMarkus Armbruster * Returns: A #CPUState or %NULL if an error occurred. 8052e5b09fdSMarkus Armbruster */ 8062e5b09fdSMarkus Armbruster CPUState *cpu_create(const char *typename); 8072e5b09fdSMarkus Armbruster 8082e5b09fdSMarkus Armbruster /** 8092e5b09fdSMarkus Armbruster * parse_cpu_option: 8102e5b09fdSMarkus Armbruster * @cpu_option: The -cpu option including optional parameters. 8112e5b09fdSMarkus Armbruster * 8122e5b09fdSMarkus Armbruster * processes optional parameters and registers them as global properties 8132e5b09fdSMarkus Armbruster * 8142e5b09fdSMarkus Armbruster * Returns: type of CPU to create or prints error and terminates process 8152e5b09fdSMarkus Armbruster * if an error occurred. 8162e5b09fdSMarkus Armbruster */ 8172e5b09fdSMarkus Armbruster const char *parse_cpu_option(const char *cpu_option); 8182e5b09fdSMarkus Armbruster 8192e5b09fdSMarkus Armbruster /** 8202e5b09fdSMarkus Armbruster * cpu_has_work: 8212e5b09fdSMarkus Armbruster * @cpu: The vCPU to check. 8222e5b09fdSMarkus Armbruster * 8232e5b09fdSMarkus Armbruster * Checks whether the CPU has work to do. 8242e5b09fdSMarkus Armbruster * 8252e5b09fdSMarkus Armbruster * Returns: %true if the CPU has work, %false otherwise. 8262e5b09fdSMarkus Armbruster */ 8272e5b09fdSMarkus Armbruster static inline bool cpu_has_work(CPUState *cpu) 8282e5b09fdSMarkus Armbruster { 8292e5b09fdSMarkus Armbruster CPUClass *cc = CPU_GET_CLASS(cpu); 8302e5b09fdSMarkus Armbruster 8312e5b09fdSMarkus Armbruster g_assert(cc->has_work); 8322e5b09fdSMarkus Armbruster return cc->has_work(cpu); 8332e5b09fdSMarkus Armbruster } 8342e5b09fdSMarkus Armbruster 8352e5b09fdSMarkus Armbruster /** 8362e5b09fdSMarkus Armbruster * qemu_cpu_is_self: 8372e5b09fdSMarkus Armbruster * @cpu: The vCPU to check against. 8382e5b09fdSMarkus Armbruster * 8392e5b09fdSMarkus Armbruster * Checks whether the caller is executing on the vCPU thread. 8402e5b09fdSMarkus Armbruster * 8412e5b09fdSMarkus Armbruster * Returns: %true if called from @cpu's thread, %false otherwise. 8422e5b09fdSMarkus Armbruster */ 8432e5b09fdSMarkus Armbruster bool qemu_cpu_is_self(CPUState *cpu); 8442e5b09fdSMarkus Armbruster 8452e5b09fdSMarkus Armbruster /** 8462e5b09fdSMarkus Armbruster * qemu_cpu_kick: 8472e5b09fdSMarkus Armbruster * @cpu: The vCPU to kick. 8482e5b09fdSMarkus Armbruster * 8492e5b09fdSMarkus Armbruster * Kicks @cpu's thread. 8502e5b09fdSMarkus Armbruster */ 8512e5b09fdSMarkus Armbruster void qemu_cpu_kick(CPUState *cpu); 8522e5b09fdSMarkus Armbruster 8532e5b09fdSMarkus Armbruster /** 8542e5b09fdSMarkus Armbruster * cpu_is_stopped: 8552e5b09fdSMarkus Armbruster * @cpu: The CPU to check. 8562e5b09fdSMarkus Armbruster * 8572e5b09fdSMarkus Armbruster * Checks whether the CPU is stopped. 8582e5b09fdSMarkus Armbruster * 8592e5b09fdSMarkus Armbruster * Returns: %true if run state is not running or if artificially stopped; 8602e5b09fdSMarkus Armbruster * %false otherwise. 8612e5b09fdSMarkus Armbruster */ 8622e5b09fdSMarkus Armbruster bool cpu_is_stopped(CPUState *cpu); 8632e5b09fdSMarkus Armbruster 8642e5b09fdSMarkus Armbruster /** 8652e5b09fdSMarkus Armbruster * do_run_on_cpu: 8662e5b09fdSMarkus Armbruster * @cpu: The vCPU to run on. 8672e5b09fdSMarkus Armbruster * @func: The function to be executed. 8682e5b09fdSMarkus Armbruster * @data: Data to pass to the function. 8692e5b09fdSMarkus Armbruster * @mutex: Mutex to release while waiting for @func to run. 8702e5b09fdSMarkus Armbruster * 8712e5b09fdSMarkus Armbruster * Used internally in the implementation of run_on_cpu. 8722e5b09fdSMarkus Armbruster */ 8732e5b09fdSMarkus Armbruster void do_run_on_cpu(CPUState *cpu, run_on_cpu_func func, run_on_cpu_data data, 8742e5b09fdSMarkus Armbruster QemuMutex *mutex); 8752e5b09fdSMarkus Armbruster 8762e5b09fdSMarkus Armbruster /** 8772e5b09fdSMarkus Armbruster * run_on_cpu: 8782e5b09fdSMarkus Armbruster * @cpu: The vCPU to run on. 8792e5b09fdSMarkus Armbruster * @func: The function to be executed. 8802e5b09fdSMarkus Armbruster * @data: Data to pass to the function. 8812e5b09fdSMarkus Armbruster * 8822e5b09fdSMarkus Armbruster * Schedules the function @func for execution on the vCPU @cpu. 8832e5b09fdSMarkus Armbruster */ 8842e5b09fdSMarkus Armbruster void run_on_cpu(CPUState *cpu, run_on_cpu_func func, run_on_cpu_data data); 8852e5b09fdSMarkus Armbruster 8862e5b09fdSMarkus Armbruster /** 8872e5b09fdSMarkus Armbruster * async_run_on_cpu: 8882e5b09fdSMarkus Armbruster * @cpu: The vCPU to run on. 8892e5b09fdSMarkus Armbruster * @func: The function to be executed. 8902e5b09fdSMarkus Armbruster * @data: Data to pass to the function. 8912e5b09fdSMarkus Armbruster * 8922e5b09fdSMarkus Armbruster * Schedules the function @func for execution on the vCPU @cpu asynchronously. 8932e5b09fdSMarkus Armbruster */ 8942e5b09fdSMarkus Armbruster void async_run_on_cpu(CPUState *cpu, run_on_cpu_func func, run_on_cpu_data data); 8952e5b09fdSMarkus Armbruster 8962e5b09fdSMarkus Armbruster /** 8972e5b09fdSMarkus Armbruster * async_safe_run_on_cpu: 8982e5b09fdSMarkus Armbruster * @cpu: The vCPU to run on. 8992e5b09fdSMarkus Armbruster * @func: The function to be executed. 9002e5b09fdSMarkus Armbruster * @data: Data to pass to the function. 9012e5b09fdSMarkus Armbruster * 9022e5b09fdSMarkus Armbruster * Schedules the function @func for execution on the vCPU @cpu asynchronously, 9032e5b09fdSMarkus Armbruster * while all other vCPUs are sleeping. 9042e5b09fdSMarkus Armbruster * 9052e5b09fdSMarkus Armbruster * Unlike run_on_cpu and async_run_on_cpu, the function is run outside the 9062e5b09fdSMarkus Armbruster * BQL. 9072e5b09fdSMarkus Armbruster */ 9082e5b09fdSMarkus Armbruster void async_safe_run_on_cpu(CPUState *cpu, run_on_cpu_func func, run_on_cpu_data data); 9092e5b09fdSMarkus Armbruster 9102e5b09fdSMarkus Armbruster /** 911cfbc3c60SEmilio G. Cota * cpu_in_exclusive_context() 912cfbc3c60SEmilio G. Cota * @cpu: The vCPU to check 913cfbc3c60SEmilio G. Cota * 914cfbc3c60SEmilio G. Cota * Returns true if @cpu is an exclusive context, for example running 915cfbc3c60SEmilio G. Cota * something which has previously been queued via async_safe_run_on_cpu(). 916cfbc3c60SEmilio G. Cota */ 917cfbc3c60SEmilio G. Cota static inline bool cpu_in_exclusive_context(const CPUState *cpu) 918cfbc3c60SEmilio G. Cota { 919df8a6880SIlya Leoshkevich return cpu->exclusive_context_count; 920cfbc3c60SEmilio G. Cota } 921cfbc3c60SEmilio G. Cota 922cfbc3c60SEmilio G. Cota /** 9232e5b09fdSMarkus Armbruster * qemu_get_cpu: 9242e5b09fdSMarkus Armbruster * @index: The CPUState@cpu_index value of the CPU to obtain. 9252e5b09fdSMarkus Armbruster * 9262e5b09fdSMarkus Armbruster * Gets a CPU matching @index. 9272e5b09fdSMarkus Armbruster * 9282e5b09fdSMarkus Armbruster * Returns: The CPU or %NULL if there is no matching CPU. 9292e5b09fdSMarkus Armbruster */ 9302e5b09fdSMarkus Armbruster CPUState *qemu_get_cpu(int index); 9312e5b09fdSMarkus Armbruster 9322e5b09fdSMarkus Armbruster /** 9332e5b09fdSMarkus Armbruster * cpu_exists: 9342e5b09fdSMarkus Armbruster * @id: Guest-exposed CPU ID to lookup. 9352e5b09fdSMarkus Armbruster * 9362e5b09fdSMarkus Armbruster * Search for CPU with specified ID. 9372e5b09fdSMarkus Armbruster * 9382e5b09fdSMarkus Armbruster * Returns: %true - CPU is found, %false - CPU isn't found. 9392e5b09fdSMarkus Armbruster */ 9402e5b09fdSMarkus Armbruster bool cpu_exists(int64_t id); 9412e5b09fdSMarkus Armbruster 9422e5b09fdSMarkus Armbruster /** 9432e5b09fdSMarkus Armbruster * cpu_by_arch_id: 9442e5b09fdSMarkus Armbruster * @id: Guest-exposed CPU ID of the CPU to obtain. 9452e5b09fdSMarkus Armbruster * 9462e5b09fdSMarkus Armbruster * Get a CPU with matching @id. 9472e5b09fdSMarkus Armbruster * 9482e5b09fdSMarkus Armbruster * Returns: The CPU or %NULL if there is no matching CPU. 9492e5b09fdSMarkus Armbruster */ 9502e5b09fdSMarkus Armbruster CPUState *cpu_by_arch_id(int64_t id); 9512e5b09fdSMarkus Armbruster 9522e5b09fdSMarkus Armbruster /** 9532e5b09fdSMarkus Armbruster * cpu_interrupt: 9542e5b09fdSMarkus Armbruster * @cpu: The CPU to set an interrupt on. 9552e5b09fdSMarkus Armbruster * @mask: The interrupts to set. 9562e5b09fdSMarkus Armbruster * 9572e5b09fdSMarkus Armbruster * Invokes the interrupt handler. 9582e5b09fdSMarkus Armbruster */ 9592e5b09fdSMarkus Armbruster 9602e5b09fdSMarkus Armbruster void cpu_interrupt(CPUState *cpu, int mask); 9612e5b09fdSMarkus Armbruster 9622e5b09fdSMarkus Armbruster /** 9632e5b09fdSMarkus Armbruster * cpu_set_pc: 9642e5b09fdSMarkus Armbruster * @cpu: The CPU to set the program counter for. 9652e5b09fdSMarkus Armbruster * @addr: Program counter value. 9662e5b09fdSMarkus Armbruster * 9672e5b09fdSMarkus Armbruster * Sets the program counter for a CPU. 9682e5b09fdSMarkus Armbruster */ 9692e5b09fdSMarkus Armbruster static inline void cpu_set_pc(CPUState *cpu, vaddr addr) 9702e5b09fdSMarkus Armbruster { 9712e5b09fdSMarkus Armbruster CPUClass *cc = CPU_GET_CLASS(cpu); 9722e5b09fdSMarkus Armbruster 9732e5b09fdSMarkus Armbruster cc->set_pc(cpu, addr); 9742e5b09fdSMarkus Armbruster } 9752e5b09fdSMarkus Armbruster 9762e5b09fdSMarkus Armbruster /** 9772e5b09fdSMarkus Armbruster * cpu_reset_interrupt: 9782e5b09fdSMarkus Armbruster * @cpu: The CPU to clear the interrupt on. 9792e5b09fdSMarkus Armbruster * @mask: The interrupt mask to clear. 9802e5b09fdSMarkus Armbruster * 9812e5b09fdSMarkus Armbruster * Resets interrupts on the vCPU @cpu. 9822e5b09fdSMarkus Armbruster */ 9832e5b09fdSMarkus Armbruster void cpu_reset_interrupt(CPUState *cpu, int mask); 9842e5b09fdSMarkus Armbruster 9852e5b09fdSMarkus Armbruster /** 9862e5b09fdSMarkus Armbruster * cpu_exit: 9872e5b09fdSMarkus Armbruster * @cpu: The CPU to exit. 9882e5b09fdSMarkus Armbruster * 9892e5b09fdSMarkus Armbruster * Requests the CPU @cpu to exit execution. 9902e5b09fdSMarkus Armbruster */ 9912e5b09fdSMarkus Armbruster void cpu_exit(CPUState *cpu); 9922e5b09fdSMarkus Armbruster 9932e5b09fdSMarkus Armbruster /** 9946b659310SNicholas Piggin * cpu_pause: 9956b659310SNicholas Piggin * @cpu: The CPU to pause. 9966b659310SNicholas Piggin * 9976b659310SNicholas Piggin * Pauses CPU, i.e. puts CPU into stopped state. 9986b659310SNicholas Piggin */ 9996b659310SNicholas Piggin void cpu_pause(CPUState *cpu); 10006b659310SNicholas Piggin 10016b659310SNicholas Piggin /** 10022e5b09fdSMarkus Armbruster * cpu_resume: 10032e5b09fdSMarkus Armbruster * @cpu: The CPU to resume. 10042e5b09fdSMarkus Armbruster * 10052e5b09fdSMarkus Armbruster * Resumes CPU, i.e. puts CPU into runnable state. 10062e5b09fdSMarkus Armbruster */ 10072e5b09fdSMarkus Armbruster void cpu_resume(CPUState *cpu); 10082e5b09fdSMarkus Armbruster 10092e5b09fdSMarkus Armbruster /** 10102e5b09fdSMarkus Armbruster * cpu_remove_sync: 10112e5b09fdSMarkus Armbruster * @cpu: The CPU to remove. 10122e5b09fdSMarkus Armbruster * 10132e5b09fdSMarkus Armbruster * Requests the CPU to be removed and waits till it is removed. 10142e5b09fdSMarkus Armbruster */ 10152e5b09fdSMarkus Armbruster void cpu_remove_sync(CPUState *cpu); 10162e5b09fdSMarkus Armbruster 10172e5b09fdSMarkus Armbruster /** 1018f8b64d35SAkihiko Odaki * free_queued_cpu_work() - free all items on CPU work queue 1019f8b64d35SAkihiko Odaki * @cpu: The CPU which work queue to free. 1020f8b64d35SAkihiko Odaki */ 1021f8b64d35SAkihiko Odaki void free_queued_cpu_work(CPUState *cpu); 1022f8b64d35SAkihiko Odaki 1023f8b64d35SAkihiko Odaki /** 10242e5b09fdSMarkus Armbruster * process_queued_cpu_work() - process all items on CPU work queue 10252e5b09fdSMarkus Armbruster * @cpu: The CPU which work queue to process. 10262e5b09fdSMarkus Armbruster */ 10272e5b09fdSMarkus Armbruster void process_queued_cpu_work(CPUState *cpu); 10282e5b09fdSMarkus Armbruster 10292e5b09fdSMarkus Armbruster /** 10302e5b09fdSMarkus Armbruster * cpu_exec_start: 10312e5b09fdSMarkus Armbruster * @cpu: The CPU for the current thread. 10322e5b09fdSMarkus Armbruster * 10332e5b09fdSMarkus Armbruster * Record that a CPU has started execution and can be interrupted with 10342e5b09fdSMarkus Armbruster * cpu_exit. 10352e5b09fdSMarkus Armbruster */ 10362e5b09fdSMarkus Armbruster void cpu_exec_start(CPUState *cpu); 10372e5b09fdSMarkus Armbruster 10382e5b09fdSMarkus Armbruster /** 10392e5b09fdSMarkus Armbruster * cpu_exec_end: 10402e5b09fdSMarkus Armbruster * @cpu: The CPU for the current thread. 10412e5b09fdSMarkus Armbruster * 10422e5b09fdSMarkus Armbruster * Record that a CPU has stopped execution and exclusive sections 10432e5b09fdSMarkus Armbruster * can be executed without interrupting it. 10442e5b09fdSMarkus Armbruster */ 10452e5b09fdSMarkus Armbruster void cpu_exec_end(CPUState *cpu); 10462e5b09fdSMarkus Armbruster 10472e5b09fdSMarkus Armbruster /** 10482e5b09fdSMarkus Armbruster * start_exclusive: 10492e5b09fdSMarkus Armbruster * 10502e5b09fdSMarkus Armbruster * Wait for a concurrent exclusive section to end, and then start 10512e5b09fdSMarkus Armbruster * a section of work that is run while other CPUs are not running 10522e5b09fdSMarkus Armbruster * between cpu_exec_start and cpu_exec_end. CPUs that are running 10532e5b09fdSMarkus Armbruster * cpu_exec are exited immediately. CPUs that call cpu_exec_start 10542e5b09fdSMarkus Armbruster * during the exclusive section go to sleep until this CPU calls 10552e5b09fdSMarkus Armbruster * end_exclusive. 10562e5b09fdSMarkus Armbruster */ 10572e5b09fdSMarkus Armbruster void start_exclusive(void); 10582e5b09fdSMarkus Armbruster 10592e5b09fdSMarkus Armbruster /** 10602e5b09fdSMarkus Armbruster * end_exclusive: 10612e5b09fdSMarkus Armbruster * 10622e5b09fdSMarkus Armbruster * Concludes an exclusive execution section started by start_exclusive. 10632e5b09fdSMarkus Armbruster */ 10642e5b09fdSMarkus Armbruster void end_exclusive(void); 10652e5b09fdSMarkus Armbruster 10662e5b09fdSMarkus Armbruster /** 10672e5b09fdSMarkus Armbruster * qemu_init_vcpu: 10682e5b09fdSMarkus Armbruster * @cpu: The vCPU to initialize. 10692e5b09fdSMarkus Armbruster * 10702e5b09fdSMarkus Armbruster * Initializes a vCPU. 10712e5b09fdSMarkus Armbruster */ 10722e5b09fdSMarkus Armbruster void qemu_init_vcpu(CPUState *cpu); 10732e5b09fdSMarkus Armbruster 10742e5b09fdSMarkus Armbruster #define SSTEP_ENABLE 0x1 /* Enable simulated HW single stepping */ 10752e5b09fdSMarkus Armbruster #define SSTEP_NOIRQ 0x2 /* Do not use IRQ while single stepping */ 10762e5b09fdSMarkus Armbruster #define SSTEP_NOTIMER 0x4 /* Do not Timers while single stepping */ 10772e5b09fdSMarkus Armbruster 10782e5b09fdSMarkus Armbruster /** 10792e5b09fdSMarkus Armbruster * cpu_single_step: 10802e5b09fdSMarkus Armbruster * @cpu: CPU to the flags for. 10812e5b09fdSMarkus Armbruster * @enabled: Flags to enable. 10822e5b09fdSMarkus Armbruster * 10832e5b09fdSMarkus Armbruster * Enables or disables single-stepping for @cpu. 10842e5b09fdSMarkus Armbruster */ 10852e5b09fdSMarkus Armbruster void cpu_single_step(CPUState *cpu, int enabled); 10862e5b09fdSMarkus Armbruster 10872e5b09fdSMarkus Armbruster /* Breakpoint/watchpoint flags */ 10882e5b09fdSMarkus Armbruster #define BP_MEM_READ 0x01 10892e5b09fdSMarkus Armbruster #define BP_MEM_WRITE 0x02 10902e5b09fdSMarkus Armbruster #define BP_MEM_ACCESS (BP_MEM_READ | BP_MEM_WRITE) 10912e5b09fdSMarkus Armbruster #define BP_STOP_BEFORE_ACCESS 0x04 10922e5b09fdSMarkus Armbruster /* 0x08 currently unused */ 10932e5b09fdSMarkus Armbruster #define BP_GDB 0x10 10942e5b09fdSMarkus Armbruster #define BP_CPU 0x20 10952e5b09fdSMarkus Armbruster #define BP_ANY (BP_GDB | BP_CPU) 1096019a9808SRichard Henderson #define BP_HIT_SHIFT 6 1097019a9808SRichard Henderson #define BP_WATCHPOINT_HIT_READ (BP_MEM_READ << BP_HIT_SHIFT) 1098019a9808SRichard Henderson #define BP_WATCHPOINT_HIT_WRITE (BP_MEM_WRITE << BP_HIT_SHIFT) 1099019a9808SRichard Henderson #define BP_WATCHPOINT_HIT (BP_MEM_ACCESS << BP_HIT_SHIFT) 11002e5b09fdSMarkus Armbruster 11012e5b09fdSMarkus Armbruster int cpu_breakpoint_insert(CPUState *cpu, vaddr pc, int flags, 11022e5b09fdSMarkus Armbruster CPUBreakpoint **breakpoint); 11032e5b09fdSMarkus Armbruster int cpu_breakpoint_remove(CPUState *cpu, vaddr pc, int flags); 11042e5b09fdSMarkus Armbruster void cpu_breakpoint_remove_by_ref(CPUState *cpu, CPUBreakpoint *breakpoint); 11052e5b09fdSMarkus Armbruster void cpu_breakpoint_remove_all(CPUState *cpu, int mask); 11062e5b09fdSMarkus Armbruster 11072e5b09fdSMarkus Armbruster /* Return true if PC matches an installed breakpoint. */ 11082e5b09fdSMarkus Armbruster static inline bool cpu_breakpoint_test(CPUState *cpu, vaddr pc, int mask) 11092e5b09fdSMarkus Armbruster { 11102e5b09fdSMarkus Armbruster CPUBreakpoint *bp; 11112e5b09fdSMarkus Armbruster 11122e5b09fdSMarkus Armbruster if (unlikely(!QTAILQ_EMPTY(&cpu->breakpoints))) { 11132e5b09fdSMarkus Armbruster QTAILQ_FOREACH(bp, &cpu->breakpoints, entry) { 11142e5b09fdSMarkus Armbruster if (bp->pc == pc && (bp->flags & mask)) { 11152e5b09fdSMarkus Armbruster return true; 11162e5b09fdSMarkus Armbruster } 11172e5b09fdSMarkus Armbruster } 11182e5b09fdSMarkus Armbruster } 11192e5b09fdSMarkus Armbruster return false; 11202e5b09fdSMarkus Armbruster } 11212e5b09fdSMarkus Armbruster 112287e303deSPhilippe Mathieu-Daudé #if defined(CONFIG_USER_ONLY) 112374841f04SRichard Henderson static inline int cpu_watchpoint_insert(CPUState *cpu, vaddr addr, vaddr len, 112474841f04SRichard Henderson int flags, CPUWatchpoint **watchpoint) 112574841f04SRichard Henderson { 112674841f04SRichard Henderson return -ENOSYS; 112774841f04SRichard Henderson } 112874841f04SRichard Henderson 112974841f04SRichard Henderson static inline int cpu_watchpoint_remove(CPUState *cpu, vaddr addr, 113074841f04SRichard Henderson vaddr len, int flags) 113174841f04SRichard Henderson { 113274841f04SRichard Henderson return -ENOSYS; 113374841f04SRichard Henderson } 113474841f04SRichard Henderson 113574841f04SRichard Henderson static inline void cpu_watchpoint_remove_by_ref(CPUState *cpu, 113674841f04SRichard Henderson CPUWatchpoint *wp) 113774841f04SRichard Henderson { 113874841f04SRichard Henderson } 113974841f04SRichard Henderson 114074841f04SRichard Henderson static inline void cpu_watchpoint_remove_all(CPUState *cpu, int mask) 114174841f04SRichard Henderson { 114274841f04SRichard Henderson } 114374841f04SRichard Henderson #else 11442e5b09fdSMarkus Armbruster int cpu_watchpoint_insert(CPUState *cpu, vaddr addr, vaddr len, 11452e5b09fdSMarkus Armbruster int flags, CPUWatchpoint **watchpoint); 11462e5b09fdSMarkus Armbruster int cpu_watchpoint_remove(CPUState *cpu, vaddr addr, 11472e5b09fdSMarkus Armbruster vaddr len, int flags); 11482e5b09fdSMarkus Armbruster void cpu_watchpoint_remove_by_ref(CPUState *cpu, CPUWatchpoint *watchpoint); 11492e5b09fdSMarkus Armbruster void cpu_watchpoint_remove_all(CPUState *cpu, int mask); 115074841f04SRichard Henderson #endif 11512e5b09fdSMarkus Armbruster 11522e5b09fdSMarkus Armbruster /** 11532e5b09fdSMarkus Armbruster * cpu_get_address_space: 11542e5b09fdSMarkus Armbruster * @cpu: CPU to get address space from 11552e5b09fdSMarkus Armbruster * @asidx: index identifying which address space to get 11562e5b09fdSMarkus Armbruster * 11572e5b09fdSMarkus Armbruster * Return the requested address space of this CPU. @asidx 11582e5b09fdSMarkus Armbruster * specifies which address space to read. 11592e5b09fdSMarkus Armbruster */ 11602e5b09fdSMarkus Armbruster AddressSpace *cpu_get_address_space(CPUState *cpu, int asidx); 11612e5b09fdSMarkus Armbruster 11628905770bSMarc-André Lureau G_NORETURN void cpu_abort(CPUState *cpu, const char *fmt, ...) 11639edc6313SMarc-André Lureau G_GNUC_PRINTF(2, 3); 11647df5e3d6SClaudio Fontana 11657df5e3d6SClaudio Fontana /* $(top_srcdir)/cpu.c */ 1166995b87deSRichard Henderson void cpu_class_init_props(DeviceClass *dc); 11672e5b09fdSMarkus Armbruster void cpu_exec_initfn(CPUState *cpu); 116879a99091SPhilippe Mathieu-Daudé bool cpu_exec_realizefn(CPUState *cpu, Error **errp); 11692e5b09fdSMarkus Armbruster void cpu_exec_unrealizefn(CPUState *cpu); 11701b5120d7SPhilippe Mathieu-Daudé void cpu_exec_reset_hold(CPUState *cpu); 11712e5b09fdSMarkus Armbruster 11721077f50bSThomas Huth const char *target_name(void); 11731077f50bSThomas Huth 11747d7a21baSPhilippe Mathieu-Daudé #ifdef COMPILING_PER_TARGET 11752e5b09fdSMarkus Armbruster 117675fe97b4SPhilippe Mathieu-Daudé #ifndef CONFIG_USER_ONLY 1177feece4d0SPhilippe Mathieu-Daudé 11782e5b09fdSMarkus Armbruster extern const VMStateDescription vmstate_cpu_common; 11792e5b09fdSMarkus Armbruster 11802e5b09fdSMarkus Armbruster #define VMSTATE_CPU() { \ 11812e5b09fdSMarkus Armbruster .name = "parent_obj", \ 11822e5b09fdSMarkus Armbruster .size = sizeof(CPUState), \ 11832e5b09fdSMarkus Armbruster .vmsd = &vmstate_cpu_common, \ 11842e5b09fdSMarkus Armbruster .flags = VMS_STRUCT, \ 11852e5b09fdSMarkus Armbruster .offset = 0, \ 11862e5b09fdSMarkus Armbruster } 118775fe97b4SPhilippe Mathieu-Daudé #endif /* !CONFIG_USER_ONLY */ 11882e5b09fdSMarkus Armbruster 11897d7a21baSPhilippe Mathieu-Daudé #endif /* COMPILING_PER_TARGET */ 11902e5b09fdSMarkus Armbruster 11912e5b09fdSMarkus Armbruster #define UNASSIGNED_CPU_INDEX -1 11922e5b09fdSMarkus Armbruster #define UNASSIGNED_CLUSTER_INDEX -1 11932e5b09fdSMarkus Armbruster 11942e5b09fdSMarkus Armbruster #endif 1195