mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-04 08:13:54 -06:00
Adjust types for some memory access functions.
Reduce inclusion of tcg headers. Fix watchpoints vs replay. Fix tcg/aarch64 roli expansion. Introduce SysemuCPUOps structure. -----BEGIN PGP SIGNATURE----- iQFRBAABCgA7FiEEekgeeIaLTbaoWgXAZN846K9+IV8FAmCu3TodHHJpY2hhcmQu aGVuZGVyc29uQGxpbmFyby5vcmcACgkQZN846K9+IV9ibwf+IyI2B3CrrJUkyzdg AiKasEQJS7XoKRf924THegSHQEzFltDEuOiSdq3x2oFB9iMuZeu/HH/CLdw3qCFb IZgsFhhYRjtzO6aVanyNWE2/b3HViGPI4rRvk09YaQg+FEEKqCw6Qb+MM3yv9Aa2 7VGsYX1u0RK/W6CfgUFULcnjbKUcPtOnZRZZMiNKwA6Jg9m19ASAVuLCmoQrcIg7 PrpGUuSn8VrC3ICGcqALbCVp+HWcMERuckAlSJ3cOvAng+vcvxSy8lkUm5sibkm2 27k+t2IzwTObVlyVKj2TvLC3GVXHg/0juXg7UH1h1+cshn0BIX5HuzDU8NyMj+Dj RHeoqA== =RPLq -----END PGP SIGNATURE----- Merge remote-tracking branch 'remotes/rth-gitlab/tags/pull-tcg-20210526' into staging Adjust types for some memory access functions. Reduce inclusion of tcg headers. Fix watchpoints vs replay. Fix tcg/aarch64 roli expansion. Introduce SysemuCPUOps structure. # gpg: Signature made Thu 27 May 2021 00:43:54 BST # gpg: using RSA key 7A481E78868B4DB6A85A05C064DF38E8AF7E215F # gpg: issuer "richard.henderson@linaro.org" # gpg: Good signature from "Richard Henderson <richard.henderson@linaro.org>" [full] # Primary key fingerprint: 7A48 1E78 868B 4DB6 A85A 05C0 64DF 38E8 AF7E 215F * remotes/rth-gitlab/tags/pull-tcg-20210526: (31 commits) hw/core: Constify TCGCPUOps target/mips: Fold jazz behaviour into mips_cpu_do_transaction_failed cpu: Move CPUClass::get_paging_enabled to SysemuCPUOps cpu: Move CPUClass::get_memory_mapping to SysemuCPUOps cpu: Move CPUClass::get_phys_page_debug to SysemuCPUOps cpu: Move CPUClass::asidx_from_attrs to SysemuCPUOps cpu: Move CPUClass::write_elf* to SysemuCPUOps cpu: Move CPUClass::get_crash_info to SysemuCPUOps cpu: Move CPUClass::virtio_is_big_endian to SysemuCPUOps cpu: Move CPUClass::vmsd to SysemuCPUOps cpu: Introduce SysemuCPUOps structure cpu: Move AVR target vmsd field from CPUClass to DeviceClass cpu: Rename CPUClass vmsd -> legacy_vmsd cpu: Assert DeviceClass::vmsd is NULL on user emulation cpu: Directly use get_memory_mapping() fallback handlers in place cpu: Directly use get_paging_enabled() fallback handlers in place cpu: Directly use cpu_write_elf*() fallback handlers in place cpu: Introduce cpu_virtio_is_big_endian() cpu: Un-inline cpu_get_phys_page_debug and cpu_asidx_from_attrs cpu: Split as cpu-common / cpu-sysemu ... Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
commit
62c0ac5041
53 changed files with 602 additions and 406 deletions
|
@ -80,6 +80,9 @@ struct TCGCPUOps;
|
|||
/* see accel-cpu.h */
|
||||
struct AccelCPUClass;
|
||||
|
||||
/* see sysemu-cpu-ops.h */
|
||||
struct SysemuCPUOps;
|
||||
|
||||
/**
|
||||
* CPUClass:
|
||||
* @class_by_name: Callback to map -cpu command line model name to an
|
||||
|
@ -87,16 +90,10 @@ struct AccelCPUClass;
|
|||
* @parse_features: Callback to parse command line arguments.
|
||||
* @reset_dump_flags: #CPUDumpFlags to use for reset logging.
|
||||
* @has_work: Callback for checking if there is work to do.
|
||||
* @virtio_is_big_endian: Callback to return %true if a CPU which supports
|
||||
* runtime configurable endianness is currently big-endian. Non-configurable
|
||||
* CPUs can use the default implementation of this method. This method should
|
||||
* not be used by any callers other than the pre-1.0 virtio devices.
|
||||
* @memory_rw_debug: Callback for GDB memory access.
|
||||
* @dump_state: Callback for dumping state.
|
||||
* @dump_statistics: Callback for dumping statistics.
|
||||
* @get_arch_id: Callback for getting architecture-dependent CPU ID.
|
||||
* @get_paging_enabled: Callback for inquiring whether paging is enabled.
|
||||
* @get_memory_mapping: Callback for obtaining the memory mappings.
|
||||
* @set_pc: Callback for setting the Program Counter register. This
|
||||
* should have the semantics used by the target architecture when
|
||||
* setting the PC from a source such as an ELF file entry point;
|
||||
|
@ -105,24 +102,8 @@ struct AccelCPUClass;
|
|||
* If the target behaviour here is anything other than "set
|
||||
* the PC register to the value passed in" then the target must
|
||||
* also implement the synchronize_from_tb hook.
|
||||
* @get_phys_page_debug: Callback for obtaining a physical address.
|
||||
* @get_phys_page_attrs_debug: Callback for obtaining a physical address and the
|
||||
* associated memory transaction attributes to use for the access.
|
||||
* CPUs which use memory transaction attributes should implement this
|
||||
* instead of get_phys_page_debug.
|
||||
* @asidx_from_attrs: Callback to return the CPU AddressSpace to use for
|
||||
* a memory access with the specified memory transaction attributes.
|
||||
* @gdb_read_register: Callback for letting GDB read a register.
|
||||
* @gdb_write_register: Callback for letting GDB write a register.
|
||||
* @write_elf64_note: Callback for writing a CPU-specific ELF note to a
|
||||
* 64-bit VM coredump.
|
||||
* @write_elf32_qemunote: Callback for writing a CPU- and QEMU-specific ELF
|
||||
* note to a 32-bit VM coredump.
|
||||
* @write_elf32_note: Callback for writing a CPU-specific ELF note to a
|
||||
* 32-bit VM coredump.
|
||||
* @write_elf32_qemunote: Callback for writing a CPU- and QEMU-specific ELF
|
||||
* note to a 32-bit VM coredump.
|
||||
* @vmsd: State description for migration.
|
||||
* @gdb_num_core_regs: Number of core registers accessible to GDB.
|
||||
* @gdb_core_xml_file: File name for core registers GDB XML description.
|
||||
* @gdb_stop_before_watchpoint: Indicates whether GDB expects the CPU to stop
|
||||
|
@ -150,34 +131,15 @@ struct CPUClass {
|
|||
|
||||
int reset_dump_flags;
|
||||
bool (*has_work)(CPUState *cpu);
|
||||
bool (*virtio_is_big_endian)(CPUState *cpu);
|
||||
int (*memory_rw_debug)(CPUState *cpu, vaddr addr,
|
||||
uint8_t *buf, int len, bool is_write);
|
||||
void (*dump_state)(CPUState *cpu, FILE *, int flags);
|
||||
GuestPanicInformation* (*get_crash_info)(CPUState *cpu);
|
||||
void (*dump_statistics)(CPUState *cpu, int flags);
|
||||
int64_t (*get_arch_id)(CPUState *cpu);
|
||||
bool (*get_paging_enabled)(const CPUState *cpu);
|
||||
void (*get_memory_mapping)(CPUState *cpu, MemoryMappingList *list,
|
||||
Error **errp);
|
||||
void (*set_pc)(CPUState *cpu, vaddr value);
|
||||
hwaddr (*get_phys_page_debug)(CPUState *cpu, vaddr addr);
|
||||
hwaddr (*get_phys_page_attrs_debug)(CPUState *cpu, vaddr addr,
|
||||
MemTxAttrs *attrs);
|
||||
int (*asidx_from_attrs)(CPUState *cpu, MemTxAttrs attrs);
|
||||
int (*gdb_read_register)(CPUState *cpu, GByteArray *buf, int reg);
|
||||
int (*gdb_write_register)(CPUState *cpu, uint8_t *buf, int reg);
|
||||
|
||||
int (*write_elf64_note)(WriteCoreDumpFunction f, CPUState *cpu,
|
||||
int cpuid, void *opaque);
|
||||
int (*write_elf64_qemunote)(WriteCoreDumpFunction f, CPUState *cpu,
|
||||
void *opaque);
|
||||
int (*write_elf32_note)(WriteCoreDumpFunction f, CPUState *cpu,
|
||||
int cpuid, void *opaque);
|
||||
int (*write_elf32_qemunote)(WriteCoreDumpFunction f, CPUState *cpu,
|
||||
void *opaque);
|
||||
|
||||
const VMStateDescription *vmsd;
|
||||
const char *gdb_core_xml_file;
|
||||
gchar * (*gdb_arch_name)(CPUState *cpu);
|
||||
const char * (*gdb_get_dynamic_xml)(CPUState *cpu, const char *xmlname);
|
||||
|
@ -190,8 +152,11 @@ struct CPUClass {
|
|||
bool gdb_stop_before_watchpoint;
|
||||
struct AccelCPUClass *accel_cpu;
|
||||
|
||||
/* when system emulation is not available, this pointer is NULL */
|
||||
const struct SysemuCPUOps *sysemu_ops;
|
||||
|
||||
/* when TCG is not available, this pointer is NULL */
|
||||
struct TCGCPUOps *tcg_ops;
|
||||
const struct TCGCPUOps *tcg_ops;
|
||||
|
||||
/*
|
||||
* if not NULL, this is called in order for the CPUClass to initialize
|
||||
|
@ -593,18 +558,8 @@ void cpu_dump_statistics(CPUState *cpu, int flags);
|
|||
*
|
||||
* Returns: Corresponding physical page address or -1 if no page found.
|
||||
*/
|
||||
static inline hwaddr cpu_get_phys_page_attrs_debug(CPUState *cpu, vaddr addr,
|
||||
MemTxAttrs *attrs)
|
||||
{
|
||||
CPUClass *cc = CPU_GET_CLASS(cpu);
|
||||
|
||||
if (cc->get_phys_page_attrs_debug) {
|
||||
return cc->get_phys_page_attrs_debug(cpu, addr, attrs);
|
||||
}
|
||||
/* Fallback for CPUs which don't implement the _attrs_ hook */
|
||||
*attrs = MEMTXATTRS_UNSPECIFIED;
|
||||
return cc->get_phys_page_debug(cpu, addr);
|
||||
}
|
||||
hwaddr cpu_get_phys_page_attrs_debug(CPUState *cpu, vaddr addr,
|
||||
MemTxAttrs *attrs);
|
||||
|
||||
/**
|
||||
* cpu_get_phys_page_debug:
|
||||
|
@ -616,12 +571,7 @@ static inline hwaddr cpu_get_phys_page_attrs_debug(CPUState *cpu, vaddr addr,
|
|||
*
|
||||
* Returns: Corresponding physical page address or -1 if no page found.
|
||||
*/
|
||||
static inline hwaddr cpu_get_phys_page_debug(CPUState *cpu, vaddr addr)
|
||||
{
|
||||
MemTxAttrs attrs = {};
|
||||
|
||||
return cpu_get_phys_page_attrs_debug(cpu, addr, &attrs);
|
||||
}
|
||||
hwaddr cpu_get_phys_page_debug(CPUState *cpu, vaddr addr);
|
||||
|
||||
/** cpu_asidx_from_attrs:
|
||||
* @cpu: CPU
|
||||
|
@ -630,17 +580,16 @@ static inline hwaddr cpu_get_phys_page_debug(CPUState *cpu, vaddr addr)
|
|||
* Returns the address space index specifying the CPU AddressSpace
|
||||
* to use for a memory access with the given transaction attributes.
|
||||
*/
|
||||
static inline int cpu_asidx_from_attrs(CPUState *cpu, MemTxAttrs attrs)
|
||||
{
|
||||
CPUClass *cc = CPU_GET_CLASS(cpu);
|
||||
int ret = 0;
|
||||
int cpu_asidx_from_attrs(CPUState *cpu, MemTxAttrs attrs);
|
||||
|
||||
if (cc->asidx_from_attrs) {
|
||||
ret = cc->asidx_from_attrs(cpu, attrs);
|
||||
assert(ret < cpu->num_ases && ret >= 0);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
/**
|
||||
* cpu_virtio_is_big_endian:
|
||||
* @cpu: CPU
|
||||
|
||||
* Returns %true if a CPU which supports runtime configurable endianness
|
||||
* is currently big-endian.
|
||||
*/
|
||||
bool cpu_virtio_is_big_endian(CPUState *cpu);
|
||||
|
||||
#endif /* CONFIG_USER_ONLY */
|
||||
|
||||
|
@ -1081,10 +1030,8 @@ bool target_words_bigendian(void);
|
|||
#ifdef NEED_CPU_H
|
||||
|
||||
#ifdef CONFIG_SOFTMMU
|
||||
|
||||
extern const VMStateDescription vmstate_cpu_common;
|
||||
#else
|
||||
#define vmstate_cpu_common vmstate_dummy
|
||||
#endif
|
||||
|
||||
#define VMSTATE_CPU() { \
|
||||
.name = "parent_obj", \
|
||||
|
@ -1093,6 +1040,7 @@ extern const VMStateDescription vmstate_cpu_common;
|
|||
.flags = VMS_STRUCT, \
|
||||
.offset = 0, \
|
||||
}
|
||||
#endif /* CONFIG_SOFTMMU */
|
||||
|
||||
#endif /* NEED_CPU_H */
|
||||
|
||||
|
|
92
include/hw/core/sysemu-cpu-ops.h
Normal file
92
include/hw/core/sysemu-cpu-ops.h
Normal file
|
@ -0,0 +1,92 @@
|
|||
/*
|
||||
* CPU operations specific to system emulation
|
||||
*
|
||||
* Copyright (c) 2012 SUSE LINUX Products GmbH
|
||||
*
|
||||
* This work is licensed under the terms of the GNU GPL, version 2 or later.
|
||||
* See the COPYING file in the top-level directory.
|
||||
*/
|
||||
|
||||
#ifndef SYSEMU_CPU_OPS_H
|
||||
#define SYSEMU_CPU_OPS_H
|
||||
|
||||
#include "hw/core/cpu.h"
|
||||
|
||||
/*
|
||||
* struct SysemuCPUOps: System operations specific to a CPU class
|
||||
*/
|
||||
typedef struct SysemuCPUOps {
|
||||
/**
|
||||
* @get_memory_mapping: Callback for obtaining the memory mappings.
|
||||
*/
|
||||
void (*get_memory_mapping)(CPUState *cpu, MemoryMappingList *list,
|
||||
Error **errp);
|
||||
/**
|
||||
* @get_paging_enabled: Callback for inquiring whether paging is enabled.
|
||||
*/
|
||||
bool (*get_paging_enabled)(const CPUState *cpu);
|
||||
/**
|
||||
* @get_phys_page_debug: Callback for obtaining a physical address.
|
||||
*/
|
||||
hwaddr (*get_phys_page_debug)(CPUState *cpu, vaddr addr);
|
||||
/**
|
||||
* @get_phys_page_attrs_debug: Callback for obtaining a physical address
|
||||
* and the associated memory transaction attributes to use for the
|
||||
* access.
|
||||
* CPUs which use memory transaction attributes should implement this
|
||||
* instead of get_phys_page_debug.
|
||||
*/
|
||||
hwaddr (*get_phys_page_attrs_debug)(CPUState *cpu, vaddr addr,
|
||||
MemTxAttrs *attrs);
|
||||
/**
|
||||
* @asidx_from_attrs: Callback to return the CPU AddressSpace to use for
|
||||
* a memory access with the specified memory transaction attributes.
|
||||
*/
|
||||
int (*asidx_from_attrs)(CPUState *cpu, MemTxAttrs attrs);
|
||||
/**
|
||||
* @get_crash_info: Callback for reporting guest crash information in
|
||||
* GUEST_PANICKED events.
|
||||
*/
|
||||
GuestPanicInformation* (*get_crash_info)(CPUState *cpu);
|
||||
/**
|
||||
* @write_elf32_note: Callback for writing a CPU-specific ELF note to a
|
||||
* 32-bit VM coredump.
|
||||
*/
|
||||
int (*write_elf32_note)(WriteCoreDumpFunction f, CPUState *cpu,
|
||||
int cpuid, void *opaque);
|
||||
/**
|
||||
* @write_elf64_note: Callback for writing a CPU-specific ELF note to a
|
||||
* 64-bit VM coredump.
|
||||
*/
|
||||
int (*write_elf64_note)(WriteCoreDumpFunction f, CPUState *cpu,
|
||||
int cpuid, void *opaque);
|
||||
/**
|
||||
* @write_elf32_qemunote: Callback for writing a CPU- and QEMU-specific ELF
|
||||
* note to a 32-bit VM coredump.
|
||||
*/
|
||||
int (*write_elf32_qemunote)(WriteCoreDumpFunction f, CPUState *cpu,
|
||||
void *opaque);
|
||||
/**
|
||||
* @write_elf64_qemunote: Callback for writing a CPU- and QEMU-specific ELF
|
||||
* note to a 64-bit VM coredump.
|
||||
*/
|
||||
int (*write_elf64_qemunote)(WriteCoreDumpFunction f, CPUState *cpu,
|
||||
void *opaque);
|
||||
/**
|
||||
* @virtio_is_big_endian: Callback to return %true if a CPU which supports
|
||||
* runtime configurable endianness is currently big-endian.
|
||||
* Non-configurable CPUs can use the default implementation of this method.
|
||||
* This method should not be used by any callers other than the pre-1.0
|
||||
* virtio devices.
|
||||
*/
|
||||
bool (*virtio_is_big_endian)(CPUState *cpu);
|
||||
|
||||
/**
|
||||
* @legacy_vmsd: Legacy state for migration.
|
||||
* Do not use in new targets, use #DeviceClass::vmsd instead.
|
||||
*/
|
||||
const VMStateDescription *legacy_vmsd;
|
||||
|
||||
} SysemuCPUOps;
|
||||
|
||||
#endif /* SYSEMU_CPU_OPS_H */
|
Loading…
Add table
Add a link
Reference in a new issue