Skip to content

Commit

Permalink
target: Use CPUArchState as interface to target-specific CPU state
Browse files Browse the repository at this point in the history
While CPUState is our interface with generic code, CPUArchState is
our interface with target-specific code. Use CPUArchState as an
abstract type, defined by each target.

Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
Message-Id: <20220214183144.27402-13-f4bug@amsat.org>
  • Loading branch information
philmd committed Mar 6, 2022
1 parent 3686119 commit 1ea4a06
Show file tree
Hide file tree
Showing 26 changed files with 37 additions and 70 deletions.
2 changes: 0 additions & 2 deletions include/exec/poison.h
Expand Up @@ -51,8 +51,6 @@
#pragma GCC poison TARGET_PAGE_BITS
#pragma GCC poison TARGET_PAGE_ALIGN

#pragma GCC poison CPUArchState

#pragma GCC poison CPU_INTERRUPT_HARD
#pragma GCC poison CPU_INTERRUPT_EXITTB
#pragma GCC poison CPU_INTERRUPT_HALT
Expand Down
2 changes: 1 addition & 1 deletion include/hw/core/cpu.h
Expand Up @@ -340,7 +340,7 @@ struct CPUState {
AddressSpace *as;
MemoryRegion *memory;

void *env_ptr; /* CPUArchState */
CPUArchState *env_ptr;
IcountDecr *icount_decr_ptr;

/* Accessed in parallel; all accesses must be atomic */
Expand Down
1 change: 1 addition & 0 deletions include/qemu/typedefs.h
Expand Up @@ -39,6 +39,7 @@ typedef struct CompatProperty CompatProperty;
typedef struct CoMutex CoMutex;
typedef struct ConfidentialGuestSupport ConfidentialGuestSupport;
typedef struct CPUAddressSpace CPUAddressSpace;
typedef struct CPUArchState CPUArchState;
typedef struct CPUState CPUState;
typedef struct DeviceListener DeviceListener;
typedef struct DeviceState DeviceState;
Expand Down
7 changes: 2 additions & 5 deletions target/alpha/cpu.h
Expand Up @@ -197,9 +197,7 @@ enum {
#define MMU_USER_IDX 1
#define MMU_PHYS_IDX 2

typedef struct CPUAlphaState CPUAlphaState;

struct CPUAlphaState {
typedef struct CPUArchState {
uint64_t ir[31];
float64 fir[31];
uint64_t pc;
Expand Down Expand Up @@ -251,7 +249,7 @@ struct CPUAlphaState {
uint32_t features;
uint32_t amask;
int implver;
};
} CPUAlphaState;

/**
* AlphaCPU:
Expand Down Expand Up @@ -285,7 +283,6 @@ int alpha_cpu_gdb_write_register(CPUState *cpu, uint8_t *buf, int reg);

#define cpu_list alpha_cpu_list

typedef CPUAlphaState CPUArchState;
typedef AlphaCPU ArchCPU;

#include "exec/cpu-all.h"
Expand Down
3 changes: 1 addition & 2 deletions target/arm/cpu.h
Expand Up @@ -232,7 +232,7 @@ typedef struct CPUARMTBFlags {
target_ulong flags2;
} CPUARMTBFlags;

typedef struct CPUARMState {
typedef struct CPUArchState {
/* Regs for current mode. */
uint32_t regs[16];

Expand Down Expand Up @@ -3410,7 +3410,6 @@ static inline bool arm_cpu_data_is_big_endian(CPUARMState *env)
}
}

typedef CPUARMState CPUArchState;
typedef ARMCPU ArchCPU;

#include "exec/cpu-all.h"
Expand Down
7 changes: 2 additions & 5 deletions target/avr/cpu.h
Expand Up @@ -108,9 +108,7 @@ typedef enum AVRFeature {
AVR_FEATURE_RAMPZ,
} AVRFeature;

typedef struct CPUAVRState CPUAVRState;

struct CPUAVRState {
typedef struct CPUArchState {
uint32_t pc_w; /* 0x003fffff up to 22 bits */

uint32_t sregC; /* 0x00000001 1 bit */
Expand All @@ -137,7 +135,7 @@ struct CPUAVRState {
bool fullacc; /* CPU/MEM if true MEM only otherwise */

uint64_t features;
};
} CPUAVRState;

/**
* AVRCPU:
Expand Down Expand Up @@ -247,7 +245,6 @@ bool avr_cpu_tlb_fill(CPUState *cs, vaddr address, int size,
MMUAccessType access_type, int mmu_idx,
bool probe, uintptr_t retaddr);

typedef CPUAVRState CPUArchState;
typedef AVRCPU ArchCPU;

#include "exec/cpu-all.h"
Expand Down
3 changes: 1 addition & 2 deletions target/cris/cpu.h
Expand Up @@ -105,7 +105,7 @@ typedef struct {
uint32_t lo;
} TLBSet;

typedef struct CPUCRISState {
typedef struct CPUArchState {
uint32_t regs[16];
/* P0 - P15 are referred to as special registers in the docs. */
uint32_t pregs[16];
Expand Down Expand Up @@ -265,7 +265,6 @@ static inline int cpu_mmu_index (CPUCRISState *env, bool ifetch)
#define SFR_RW_MM_TLB_LO env->pregs[PR_SRS]][5
#define SFR_RW_MM_TLB_HI env->pregs[PR_SRS]][6

typedef CPUCRISState CPUArchState;
typedef CRISCPU ArchCPU;

#include "exec/cpu-all.h"
Expand Down
8 changes: 2 additions & 6 deletions target/hexagon/cpu.h
Expand Up @@ -18,9 +18,6 @@
#ifndef HEXAGON_CPU_H
#define HEXAGON_CPU_H

/* Forward declaration needed by some of the header files */
typedef struct CPUHexagonState CPUHexagonState;

#include "fpu/softfloat-types.h"

#include "exec/cpu-defs.h"
Expand Down Expand Up @@ -77,7 +74,7 @@ typedef struct {
/* Maximum number of vector temps in a packet */
#define VECTOR_TEMPS_MAX 4

struct CPUHexagonState {
typedef struct CPUArchState {
target_ulong gpr[TOTAL_PER_THREAD_REGS];
target_ulong pred[NUM_PREGS];
target_ulong branch_taken;
Expand Down Expand Up @@ -131,7 +128,7 @@ struct CPUHexagonState {
target_ulong vstore_pending[VSTORES_MAX];
bool vtcm_pending;
VTCMStoreLog vtcm_log;
};
} CPUHexagonState;

OBJECT_DECLARE_TYPE(HexagonCPU, HexagonCPUClass, HEXAGON_CPU)

Expand Down Expand Up @@ -177,7 +174,6 @@ static inline int cpu_mmu_index(CPUHexagonState *env, bool ifetch)
#endif
}

typedef struct CPUHexagonState CPUArchState;
typedef HexagonCPU ArchCPU;

void hexagon_translate_init(void);
Expand Down
8 changes: 2 additions & 6 deletions target/hppa/cpu.h
Expand Up @@ -138,8 +138,6 @@
#define CR_IPSW 22
#define CR_EIRR 23

typedef struct CPUHPPAState CPUHPPAState;

#if TARGET_REGISTER_BITS == 32
typedef uint32_t target_ureg;
typedef int32_t target_sreg;
Expand Down Expand Up @@ -168,7 +166,7 @@ typedef struct {
unsigned access_id : 16;
} hppa_tlb_entry;

struct CPUHPPAState {
typedef struct CPUArchState {
target_ureg gr[32];
uint64_t fr[32];
uint64_t sr[8]; /* stored shifted into place for gva */
Expand Down Expand Up @@ -207,7 +205,7 @@ struct CPUHPPAState {
/* ??? We should use a more intelligent data structure. */
hppa_tlb_entry tlb[HPPA_TLB_ENTRIES];
uint32_t tlb_last;
};
} CPUHPPAState;

/**
* HPPACPU:
Expand All @@ -225,8 +223,6 @@ struct HPPACPU {
QEMUTimer *alarm_timer;
};


typedef CPUHPPAState CPUArchState;
typedef HPPACPU ArchCPU;

#include "exec/cpu-all.h"
Expand Down
3 changes: 1 addition & 2 deletions target/i386/cpu.h
Expand Up @@ -1431,7 +1431,7 @@ typedef struct HVFX86LazyFlags {
target_ulong auxbits;
} HVFX86LazyFlags;

typedef struct CPUX86State {
typedef struct CPUArchState {
/* standard registers */
target_ulong regs[CPU_NB_REGS];
target_ulong eip;
Expand Down Expand Up @@ -2074,7 +2074,6 @@ static inline int cpu_mmu_index_kernel(CPUX86State *env)
#define CC_SRC2 (env->cc_src2)
#define CC_OP (env->cc_op)

typedef CPUX86State CPUArchState;
typedef X86CPU ArchCPU;

#include "exec/cpu-all.h"
Expand Down
3 changes: 1 addition & 2 deletions target/m68k/cpu.h
Expand Up @@ -79,7 +79,7 @@

typedef CPU_LDoubleU FPReg;

typedef struct CPUM68KState {
typedef struct CPUArchState {
uint32_t dregs[8];
uint32_t aregs[8];
uint32_t pc;
Expand Down Expand Up @@ -574,7 +574,6 @@ void m68k_cpu_transaction_failed(CPUState *cs, hwaddr physaddr, vaddr addr,
int mmu_idx, MemTxAttrs attrs,
MemTxResult response, uintptr_t retaddr);

typedef CPUM68KState CPUArchState;
typedef M68kCPU ArchCPU;

#include "exec/cpu-all.h"
Expand Down
5 changes: 2 additions & 3 deletions target/microblaze/cpu.h
Expand Up @@ -24,7 +24,7 @@
#include "exec/cpu-defs.h"
#include "fpu/softfloat-types.h"

typedef struct CPUMBState CPUMBState;
typedef struct CPUArchState CPUMBState;
#if !defined(CONFIG_USER_ONLY)
#include "mmu.h"
#endif
Expand Down Expand Up @@ -239,7 +239,7 @@ typedef struct CPUMBState CPUMBState;
#define USE_NON_SECURE_M_AXI_DC_MASK 0x4
#define USE_NON_SECURE_M_AXI_IC_MASK 0x8

struct CPUMBState {
struct CPUArchState {
uint32_t bvalue; /* TCG temporary, only valid during a TB */
uint32_t btarget; /* Full resolved branch destination */

Expand Down Expand Up @@ -394,7 +394,6 @@ void mb_tcg_init(void);
#define MMU_USER_IDX 2
/* See NB_MMU_MODES further up the file. */

typedef CPUMBState CPUArchState;
typedef MicroBlazeCPU ArchCPU;

#include "exec/cpu-all.h"
Expand Down
6 changes: 2 additions & 4 deletions target/mips/cpu.h
Expand Up @@ -524,8 +524,7 @@ struct TCState {
};

struct MIPSITUState;
typedef struct CPUMIPSState CPUMIPSState;
struct CPUMIPSState {
typedef struct CPUArchState {
TCState active_tc;
CPUMIPSFPUContext active_fpu;

Expand Down Expand Up @@ -1161,7 +1160,7 @@ struct CPUMIPSState {
QEMUTimer *timer; /* Internal timer */
target_ulong exception_base; /* ExceptionBase input to the core */
uint64_t cp0_count_ns; /* CP0_Count clock period (in nanoseconds) */
};
} CPUMIPSState;

/**
* MIPSCPU:
Expand Down Expand Up @@ -1218,7 +1217,6 @@ static inline int cpu_mmu_index(CPUMIPSState *env, bool ifetch)
return hflags_mmu_index(env->hflags);
}

typedef CPUMIPSState CPUArchState;
typedef MIPSCPU ArchCPU;

#include "exec/cpu-all.h"
Expand Down
4 changes: 2 additions & 2 deletions target/nios2/cpu.h
Expand Up @@ -25,7 +25,7 @@
#include "hw/core/cpu.h"
#include "qom/object.h"

typedef struct CPUNios2State CPUNios2State;
typedef struct CPUArchState CPUNios2State;
#if !defined(CONFIG_USER_ONLY)
#include "mmu.h"
#endif
Expand Down Expand Up @@ -155,7 +155,7 @@ struct Nios2CPUClass {

#define CPU_INTERRUPT_NMI CPU_INTERRUPT_TGT_EXT_3

struct CPUNios2State {
struct CPUArchState {
uint32_t regs[NUM_CORE_REGS];

#if !defined(CONFIG_USER_ONLY)
Expand Down
3 changes: 1 addition & 2 deletions target/openrisc/cpu.h
Expand Up @@ -242,7 +242,7 @@ typedef struct CPUOpenRISCTLBContext {
} CPUOpenRISCTLBContext;
#endif

typedef struct CPUOpenRISCState {
typedef struct CPUArchState {
target_ulong shadow_gpr[16][32]; /* Shadow registers */

target_ulong pc; /* Program counter */
Expand Down Expand Up @@ -348,7 +348,6 @@ void cpu_openrisc_count_stop(OpenRISCCPU *cpu);
#define OPENRISC_CPU_TYPE_NAME(model) model OPENRISC_CPU_TYPE_SUFFIX
#define CPU_RESOLVING_TYPE TYPE_OPENRISC_CPU

typedef CPUOpenRISCState CPUArchState;
typedef OpenRISCCPU ArchCPU;

#include "exec/cpu-all.h"
Expand Down
2 changes: 1 addition & 1 deletion target/ppc/cpu-qom.h
Expand Up @@ -32,7 +32,7 @@
OBJECT_DECLARE_TYPE(PowerPCCPU, PowerPCCPUClass,
POWERPC_CPU)

typedef struct CPUPPCState CPUPPCState;
typedef struct CPUArchState CPUPPCState;
typedef struct ppc_tb_t ppc_tb_t;
typedef struct ppc_dcr_t ppc_dcr_t;

Expand Down
3 changes: 1 addition & 2 deletions target/ppc/cpu.h
Expand Up @@ -1077,7 +1077,7 @@ struct ppc_radix_page_info {
#define PPC_CPU_OPCODES_LEN 0x40
#define PPC_CPU_INDIRECT_OPCODES_LEN 0x20

struct CPUPPCState {
struct CPUArchState {
/* Most commonly used resources during translated code execution first */
target_ulong gpr[32]; /* general purpose registers */
target_ulong gprh[32]; /* storage for GPR MSB, used by the SPE extension */
Expand Down Expand Up @@ -1477,7 +1477,6 @@ void ppc_compat_add_property(Object *obj, const char *name,
uint32_t *compat_pvr, const char *basedesc);
#endif /* defined(TARGET_PPC64) */

typedef CPUPPCState CPUArchState;
typedef PowerPCCPU ArchCPU;

#include "exec/cpu-all.h"
Expand Down
5 changes: 2 additions & 3 deletions target/riscv/cpu.h
Expand Up @@ -98,7 +98,7 @@ enum {

#define MAX_RISCV_PMPS (16)

typedef struct CPURISCVState CPURISCVState;
typedef struct CPUArchState CPURISCVState;

#if !defined(CONFIG_USER_ONLY)
#include "pmp.h"
Expand All @@ -113,7 +113,7 @@ FIELD(VTYPE, VMA, 7, 1)
FIELD(VTYPE, VEDIV, 8, 2)
FIELD(VTYPE, RESERVED, 10, sizeof(target_ulong) * 8 - 11)

struct CPURISCVState {
struct CPUArchState {
target_ulong gpr[32];
target_ulong gprh[32]; /* 64 top bits of the 128-bit registers */
uint64_t fpr[32]; /* assume both F and D extensions */
Expand Down Expand Up @@ -499,7 +499,6 @@ void riscv_cpu_set_fflags(CPURISCVState *env, target_ulong);
#define TB_FLAGS_MSTATUS_FS MSTATUS_FS
#define TB_FLAGS_MSTATUS_VS MSTATUS_VS

typedef CPURISCVState CPUArchState;
typedef RISCVCPU ArchCPU;
#include "exec/cpu-all.h"

Expand Down
2 changes: 0 additions & 2 deletions target/rx/cpu-qom.h
Expand Up @@ -45,6 +45,4 @@ struct RXCPUClass {
DeviceReset parent_reset;
};

#define CPUArchState struct CPURXState

#endif
2 changes: 1 addition & 1 deletion target/rx/cpu.h
Expand Up @@ -65,7 +65,7 @@ enum {
NUM_REGS = 16,
};

typedef struct CPURXState {
typedef struct CPUArchState {
/* CPU registers */
uint32_t regs[NUM_REGS]; /* general registers */
uint32_t psw_o; /* O bit of status register */
Expand Down
4 changes: 2 additions & 2 deletions target/s390x/cpu-qom.h
Expand Up @@ -31,6 +31,8 @@ OBJECT_DECLARE_TYPE(S390CPU, S390CPUClass,
typedef struct S390CPUModel S390CPUModel;
typedef struct S390CPUDef S390CPUDef;

typedef struct CPUArchState CPUS390XState;

typedef enum cpu_reset_type {
S390_CPU_RESET_NORMAL,
S390_CPU_RESET_INITIAL,
Expand Down Expand Up @@ -63,6 +65,4 @@ struct S390CPUClass {
void (*reset)(CPUState *cpu, cpu_reset_type type);
};

typedef struct CPUS390XState CPUS390XState;

#endif

0 comments on commit 1ea4a06

Please sign in to comment.