target-ppc: Add POWER8's Event Based Branch (EBB) control SPRs
POWER8 supports Event-Based Branch Facility (EBB). It is controlled via set of SPRs access to which should generate an "Facility Unavailable" interrupt if the facilities are not enabled in FSCR for problem state. This adds EBB SPRs. Signed-off-by: Alexey Kardashevskiy <aik@ozlabs.ru> Reviewed-by: Tom Musta <tommusta@gmail.com> Signed-off-by: Alexander Graf <agraf@suse.de>
This commit is contained in:
parent
80b3f79b99
commit
4ee4a03b38
@ -1578,11 +1578,18 @@ static inline int cpu_mmu_index (CPUPPCState *env)
|
||||
#define SPR_UPERFF (0x31F)
|
||||
#define SPR_RCPU_MI_RA0 (0x320)
|
||||
#define SPR_MPC_MI_DBCAM (0x320)
|
||||
#define SPR_BESCRS (0x320)
|
||||
#define SPR_RCPU_MI_RA1 (0x321)
|
||||
#define SPR_MPC_MI_DBRAM0 (0x321)
|
||||
#define SPR_BESCRSU (0x321)
|
||||
#define SPR_RCPU_MI_RA2 (0x322)
|
||||
#define SPR_MPC_MI_DBRAM1 (0x322)
|
||||
#define SPR_BESCRR (0x322)
|
||||
#define SPR_RCPU_MI_RA3 (0x323)
|
||||
#define SPR_BESCRRU (0x323)
|
||||
#define SPR_EBBHR (0x324)
|
||||
#define SPR_EBBRR (0x325)
|
||||
#define SPR_BESCR (0x326)
|
||||
#define SPR_RCPU_L2U_RA0 (0x328)
|
||||
#define SPR_MPC_MD_DBCAM (0x328)
|
||||
#define SPR_RCPU_L2U_RA1 (0x329)
|
||||
|
@ -7717,6 +7717,62 @@ static void gen_spr_power8_tm(CPUPPCState *env)
|
||||
0x00000000);
|
||||
}
|
||||
|
||||
static void spr_read_ebb(void *opaque, int gprn, int sprn)
|
||||
{
|
||||
gen_fscr_facility_check(opaque, SPR_FSCR, FSCR_EBB, sprn, FSCR_IC_EBB);
|
||||
spr_read_generic(opaque, gprn, sprn);
|
||||
}
|
||||
|
||||
static void spr_write_ebb(void *opaque, int sprn, int gprn)
|
||||
{
|
||||
gen_fscr_facility_check(opaque, SPR_FSCR, FSCR_EBB, sprn, FSCR_IC_EBB);
|
||||
spr_write_generic(opaque, sprn, gprn);
|
||||
}
|
||||
|
||||
static void spr_read_ebb_upper32(void *opaque, int gprn, int sprn)
|
||||
{
|
||||
gen_fscr_facility_check(opaque, SPR_FSCR, FSCR_EBB, sprn, FSCR_IC_EBB);
|
||||
spr_read_prev_upper32(opaque, gprn, sprn);
|
||||
}
|
||||
|
||||
static void spr_write_ebb_upper32(void *opaque, int sprn, int gprn)
|
||||
{
|
||||
gen_fscr_facility_check(opaque, SPR_FSCR, FSCR_EBB, sprn, FSCR_IC_EBB);
|
||||
spr_write_prev_upper32(opaque, sprn, gprn);
|
||||
}
|
||||
|
||||
static void gen_spr_power8_ebb(CPUPPCState *env)
|
||||
{
|
||||
spr_register(env, SPR_BESCRS, "BESCRS",
|
||||
&spr_read_ebb, &spr_write_ebb,
|
||||
&spr_read_generic, &spr_write_generic,
|
||||
0x00000000);
|
||||
spr_register(env, SPR_BESCRSU, "BESCRSU",
|
||||
&spr_read_ebb_upper32, &spr_write_ebb_upper32,
|
||||
&spr_read_prev_upper32, &spr_write_prev_upper32,
|
||||
0x00000000);
|
||||
spr_register(env, SPR_BESCRR, "BESCRR",
|
||||
&spr_read_ebb, &spr_write_ebb,
|
||||
&spr_read_generic, &spr_write_generic,
|
||||
0x00000000);
|
||||
spr_register(env, SPR_BESCRRU, "BESCRRU",
|
||||
&spr_read_ebb_upper32, &spr_write_ebb_upper32,
|
||||
&spr_read_prev_upper32, &spr_write_prev_upper32,
|
||||
0x00000000);
|
||||
spr_register_kvm(env, SPR_EBBHR, "EBBHR",
|
||||
&spr_read_ebb, &spr_write_ebb,
|
||||
&spr_read_generic, &spr_write_generic,
|
||||
KVM_REG_PPC_EBBHR, 0x00000000);
|
||||
spr_register_kvm(env, SPR_EBBRR, "EBBRR",
|
||||
&spr_read_ebb, &spr_write_ebb,
|
||||
&spr_read_generic, &spr_write_generic,
|
||||
KVM_REG_PPC_EBBRR, 0x00000000);
|
||||
spr_register_kvm(env, SPR_BESCR, "BESCR",
|
||||
&spr_read_ebb, &spr_write_ebb,
|
||||
&spr_read_generic, &spr_write_generic,
|
||||
KVM_REG_PPC_BESCR, 0x00000000);
|
||||
}
|
||||
|
||||
static void gen_spr_power8_fscr(CPUPPCState *env)
|
||||
{
|
||||
#if defined(CONFIG_USER_ONLY)
|
||||
@ -7775,6 +7831,7 @@ static void init_proc_book3s_64(CPUPPCState *env, int version)
|
||||
if (version >= BOOK3S_CPU_POWER8) {
|
||||
gen_spr_power8_tce_address_control(env);
|
||||
gen_spr_power8_ids(env);
|
||||
gen_spr_power8_ebb(env);
|
||||
gen_spr_power8_fscr(env);
|
||||
gen_spr_power8_pmu_sup(env);
|
||||
gen_spr_power8_pmu_user(env);
|
||||
|
Loading…
Reference in New Issue
Block a user