mirror of
https://github.com/xemu-project/xemu.git
synced 2024-12-21 03:20:46 +00:00
4dd6517e36
Bug fixes: * memory encryption: Disable mem merge (Dr. David Alan Gilbert) Features: * New EPYC CPU definitions (Babu Moger) * Denventon-v2 CPU model (Tao Xu) * New 'note' field on versioned CPU models (Tao Xu) Cleanups: * x86 CPU topology cleanups (Babu Moger) * cpu: Use DeviceClass reset instead of a special CPUClass reset (Peter Maydell) -----BEGIN PGP SIGNATURE----- iQJIBAABCAAyFiEEWjIv1avE09usz9GqKAeTb5hNxaYFAl5xdnsUHGVoYWJrb3N0 QHJlZGhhdC5jb20ACgkQKAeTb5hNxaYkGA/9Fn1tCdW/74CEREPbcKNOf8twmCr2 L4qykix7mFcZXstFhEQuoNJQMz8mEPJngOfUSQY1c9w4psf0AXE6q3wbdNcxxdj1 1/+cPbaRuoF8EKw63MgR3AaReuWtAV+sGS4+eKBMJTMUbl03pOYARE+irCWJU6rd YdP0t6CX0NWF4afv+2wMeeZVr+IcKEo81jCCCSjmM0YLkwvu0Vs5ng3jE7vtFKPj MQHMyqD/lz0FwyksBiOLwjOCbnmIydWc/8VV68UH5ulxka96jk8CwmI0+A9v2UMQ 4PjQ84UeQclJTbec+h/Qy8DoCP3qiqijFMRau2wo1UWCsAjMcaRIJjIe5CSOJFRu 3FrP2FEJCZiWjh11b/x3jIyjK6MDjv3Y1oky1j5VkCnFUNLHbXUA2KY3jaZ/pf+1 BDqa6lNDYJBN+FQQt0yXDWAdGLUxxP87S9jmU9RULzwAwCic0FxVR/a5zk9EUDi0 mA+WL0ekfhIEVACdHYuCTxujGq8QnGiCppr1Wgx3t+GgveR8AjXdd/KclcKskYiw ozbujtBPQUImuq3xi6FTkRHXuEW+zc+IFbhZ3Zq5OhmJmpdgmSHryFcKAdvNJH/z VllKAsLg1hffm+PjlpuZLBucC4PBrvHbS7htHhMaemEiJHO9V5EfGDWQdELNRM8p sKymFNs5XjzQcGE= =9fEL -----END PGP SIGNATURE----- Merge remote-tracking branch 'remotes/ehabkost/tags/x86-and-machine-pull-request' into staging x86 and machine queue for 5.0 soft freeze Bug fixes: * memory encryption: Disable mem merge (Dr. David Alan Gilbert) Features: * New EPYC CPU definitions (Babu Moger) * Denventon-v2 CPU model (Tao Xu) * New 'note' field on versioned CPU models (Tao Xu) Cleanups: * x86 CPU topology cleanups (Babu Moger) * cpu: Use DeviceClass reset instead of a special CPUClass reset (Peter Maydell) # gpg: Signature made Wed 18 Mar 2020 01:16:43 GMT # gpg: using RSA key 5A322FD5ABC4D3DBACCFD1AA2807936F984DC5A6 # gpg: issuer "ehabkost@redhat.com" # gpg: Good signature from "Eduardo Habkost <ehabkost@redhat.com>" [full] # Primary key fingerprint: 5A32 2FD5 ABC4 D3DB ACCF D1AA 2807 936F 984D C5A6 * remotes/ehabkost/tags/x86-and-machine-pull-request: hw/i386: Rename apicid_from_topo_ids to x86_apicid_from_topo_ids hw/i386: Update structures to save the number of nodes per package hw/i386: Remove unnecessary initialization in x86_cpu_new machine: Add SMP Sockets in CpuTopology hw/i386: Consolidate topology functions hw/i386: Introduce X86CPUTopoInfo to contain topology info cpu: Use DeviceClass reset instead of a special CPUClass reset machine/memory encryption: Disable mem merge hw/i386: Rename X86CPUTopoInfo structure to X86CPUTopoIDs i386: Add 2nd Generation AMD EPYC processors i386: Add missing cpu feature bits in EPYC model target/i386: Add new property note to versioned CPU models target/i386: Add Denverton-v2 (no MPX) CPU model Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
225 lines
8.0 KiB
C
225 lines
8.0 KiB
C
/*
|
|
* QEMU PowerPC CPU
|
|
*
|
|
* Copyright (c) 2012 SUSE LINUX Products GmbH
|
|
*
|
|
* This library is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU Lesser General Public
|
|
* License as published by the Free Software Foundation; either
|
|
* version 2.1 of the License, or (at your option) any later version.
|
|
*
|
|
* This library is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
* License along with this library; if not, see
|
|
* <http://www.gnu.org/licenses/lgpl-2.1.html>
|
|
*/
|
|
#ifndef QEMU_PPC_CPU_QOM_H
|
|
#define QEMU_PPC_CPU_QOM_H
|
|
|
|
#include "hw/core/cpu.h"
|
|
|
|
#ifdef TARGET_PPC64
|
|
#define TYPE_POWERPC_CPU "powerpc64-cpu"
|
|
#else
|
|
#define TYPE_POWERPC_CPU "powerpc-cpu"
|
|
#endif
|
|
|
|
#define POWERPC_CPU_CLASS(klass) \
|
|
OBJECT_CLASS_CHECK(PowerPCCPUClass, (klass), TYPE_POWERPC_CPU)
|
|
#define POWERPC_CPU(obj) \
|
|
OBJECT_CHECK(PowerPCCPU, (obj), TYPE_POWERPC_CPU)
|
|
#define POWERPC_CPU_GET_CLASS(obj) \
|
|
OBJECT_GET_CLASS(PowerPCCPUClass, (obj), TYPE_POWERPC_CPU)
|
|
|
|
typedef struct PowerPCCPU PowerPCCPU;
|
|
typedef struct CPUPPCState CPUPPCState;
|
|
typedef struct ppc_tb_t ppc_tb_t;
|
|
typedef struct ppc_dcr_t ppc_dcr_t;
|
|
|
|
/*****************************************************************************/
|
|
/* MMU model */
|
|
typedef enum powerpc_mmu_t powerpc_mmu_t;
|
|
enum powerpc_mmu_t {
|
|
POWERPC_MMU_UNKNOWN = 0x00000000,
|
|
/* Standard 32 bits PowerPC MMU */
|
|
POWERPC_MMU_32B = 0x00000001,
|
|
/* PowerPC 6xx MMU with software TLB */
|
|
POWERPC_MMU_SOFT_6xx = 0x00000002,
|
|
/* PowerPC 74xx MMU with software TLB */
|
|
POWERPC_MMU_SOFT_74xx = 0x00000003,
|
|
/* PowerPC 4xx MMU with software TLB */
|
|
POWERPC_MMU_SOFT_4xx = 0x00000004,
|
|
/* PowerPC 4xx MMU with software TLB and zones protections */
|
|
POWERPC_MMU_SOFT_4xx_Z = 0x00000005,
|
|
/* PowerPC MMU in real mode only */
|
|
POWERPC_MMU_REAL = 0x00000006,
|
|
/* Freescale MPC8xx MMU model */
|
|
POWERPC_MMU_MPC8xx = 0x00000007,
|
|
/* BookE MMU model */
|
|
POWERPC_MMU_BOOKE = 0x00000008,
|
|
/* BookE 2.06 MMU model */
|
|
POWERPC_MMU_BOOKE206 = 0x00000009,
|
|
/* PowerPC 601 MMU model (specific BATs format) */
|
|
POWERPC_MMU_601 = 0x0000000A,
|
|
#define POWERPC_MMU_64 0x00010000
|
|
/* 64 bits PowerPC MMU */
|
|
POWERPC_MMU_64B = POWERPC_MMU_64 | 0x00000001,
|
|
/* Architecture 2.03 and later (has LPCR) */
|
|
POWERPC_MMU_2_03 = POWERPC_MMU_64 | 0x00000002,
|
|
/* Architecture 2.06 variant */
|
|
POWERPC_MMU_2_06 = POWERPC_MMU_64 | 0x00000003,
|
|
/* Architecture 2.07 variant */
|
|
POWERPC_MMU_2_07 = POWERPC_MMU_64 | 0x00000004,
|
|
/* Architecture 3.00 variant */
|
|
POWERPC_MMU_3_00 = POWERPC_MMU_64 | 0x00000005,
|
|
};
|
|
|
|
/*****************************************************************************/
|
|
/* Exception model */
|
|
typedef enum powerpc_excp_t powerpc_excp_t;
|
|
enum powerpc_excp_t {
|
|
POWERPC_EXCP_UNKNOWN = 0,
|
|
/* Standard PowerPC exception model */
|
|
POWERPC_EXCP_STD,
|
|
/* PowerPC 40x exception model */
|
|
POWERPC_EXCP_40x,
|
|
/* PowerPC 601 exception model */
|
|
POWERPC_EXCP_601,
|
|
/* PowerPC 602 exception model */
|
|
POWERPC_EXCP_602,
|
|
/* PowerPC 603 exception model */
|
|
POWERPC_EXCP_603,
|
|
/* PowerPC 603e exception model */
|
|
POWERPC_EXCP_603E,
|
|
/* PowerPC G2 exception model */
|
|
POWERPC_EXCP_G2,
|
|
/* PowerPC 604 exception model */
|
|
POWERPC_EXCP_604,
|
|
/* PowerPC 7x0 exception model */
|
|
POWERPC_EXCP_7x0,
|
|
/* PowerPC 7x5 exception model */
|
|
POWERPC_EXCP_7x5,
|
|
/* PowerPC 74xx exception model */
|
|
POWERPC_EXCP_74xx,
|
|
/* BookE exception model */
|
|
POWERPC_EXCP_BOOKE,
|
|
/* PowerPC 970 exception model */
|
|
POWERPC_EXCP_970,
|
|
/* POWER7 exception model */
|
|
POWERPC_EXCP_POWER7,
|
|
/* POWER8 exception model */
|
|
POWERPC_EXCP_POWER8,
|
|
/* POWER9 exception model */
|
|
POWERPC_EXCP_POWER9,
|
|
};
|
|
|
|
/*****************************************************************************/
|
|
/* PM instructions */
|
|
typedef enum {
|
|
PPC_PM_DOZE,
|
|
PPC_PM_NAP,
|
|
PPC_PM_SLEEP,
|
|
PPC_PM_RVWINKLE,
|
|
PPC_PM_STOP,
|
|
} powerpc_pm_insn_t;
|
|
|
|
/*****************************************************************************/
|
|
/* Input pins model */
|
|
typedef enum powerpc_input_t powerpc_input_t;
|
|
enum powerpc_input_t {
|
|
PPC_FLAGS_INPUT_UNKNOWN = 0,
|
|
/* PowerPC 6xx bus */
|
|
PPC_FLAGS_INPUT_6xx,
|
|
/* BookE bus */
|
|
PPC_FLAGS_INPUT_BookE,
|
|
/* PowerPC 405 bus */
|
|
PPC_FLAGS_INPUT_405,
|
|
/* PowerPC 970 bus */
|
|
PPC_FLAGS_INPUT_970,
|
|
/* PowerPC POWER7 bus */
|
|
PPC_FLAGS_INPUT_POWER7,
|
|
/* PowerPC POWER9 bus */
|
|
PPC_FLAGS_INPUT_POWER9,
|
|
/* PowerPC 401 bus */
|
|
PPC_FLAGS_INPUT_401,
|
|
/* Freescale RCPU bus */
|
|
PPC_FLAGS_INPUT_RCPU,
|
|
};
|
|
|
|
typedef struct PPCHash64Options PPCHash64Options;
|
|
|
|
/**
|
|
* PowerPCCPUClass:
|
|
* @parent_realize: The parent class' realize handler.
|
|
* @parent_reset: The parent class' reset handler.
|
|
*
|
|
* A PowerPC CPU model.
|
|
*/
|
|
typedef struct PowerPCCPUClass {
|
|
/*< private >*/
|
|
CPUClass parent_class;
|
|
/*< public >*/
|
|
|
|
DeviceRealize parent_realize;
|
|
DeviceUnrealize parent_unrealize;
|
|
DeviceReset parent_reset;
|
|
void (*parent_parse_features)(const char *type, char *str, Error **errp);
|
|
|
|
uint32_t pvr;
|
|
bool (*pvr_match)(struct PowerPCCPUClass *pcc, uint32_t pvr);
|
|
uint64_t pcr_mask; /* Available bits in PCR register */
|
|
uint64_t pcr_supported; /* Bits for supported PowerISA versions */
|
|
uint32_t svr;
|
|
uint64_t insns_flags;
|
|
uint64_t insns_flags2;
|
|
uint64_t msr_mask;
|
|
uint64_t lpcr_mask; /* Available bits in the LPCR */
|
|
uint64_t lpcr_pm; /* Power-saving mode Exit Cause Enable bits */
|
|
powerpc_mmu_t mmu_model;
|
|
powerpc_excp_t excp_model;
|
|
powerpc_input_t bus_model;
|
|
uint32_t flags;
|
|
int bfd_mach;
|
|
uint32_t l1_dcache_size, l1_icache_size;
|
|
#ifndef CONFIG_USER_ONLY
|
|
unsigned int gdb_num_sprs;
|
|
const char *gdb_spr_xml;
|
|
#endif
|
|
const PPCHash64Options *hash64_opts;
|
|
struct ppc_radix_page_info *radix_page_info;
|
|
uint32_t lrg_decr_bits;
|
|
int n_host_threads;
|
|
void (*init_proc)(CPUPPCState *env);
|
|
int (*check_pow)(CPUPPCState *env);
|
|
int (*handle_mmu_fault)(PowerPCCPU *cpu, vaddr eaddr, int rwx, int mmu_idx);
|
|
bool (*interrupts_big_endian)(PowerPCCPU *cpu);
|
|
} PowerPCCPUClass;
|
|
|
|
#ifndef CONFIG_USER_ONLY
|
|
typedef struct PPCTimebase {
|
|
uint64_t guest_timebase;
|
|
int64_t time_of_the_day_ns;
|
|
bool runstate_paused;
|
|
} PPCTimebase;
|
|
|
|
extern const VMStateDescription vmstate_ppc_timebase;
|
|
|
|
#define VMSTATE_PPC_TIMEBASE_V(_field, _state, _version) { \
|
|
.name = (stringify(_field)), \
|
|
.version_id = (_version), \
|
|
.size = sizeof(PPCTimebase), \
|
|
.vmsd = &vmstate_ppc_timebase, \
|
|
.flags = VMS_STRUCT, \
|
|
.offset = vmstate_offset_value(_state, _field, PPCTimebase), \
|
|
}
|
|
|
|
void cpu_ppc_clock_vm_state_change(void *opaque, int running,
|
|
RunState state);
|
|
#endif
|
|
|
|
#endif
|