[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-ppc] [PATCH 2/7] Add MSR VSX and Associated Exception
From: |
Tom Musta |
Subject: |
[Qemu-ppc] [PATCH 2/7] Add MSR VSX and Associated Exception |
Date: |
Tue, 24 Sep 2013 10:01:31 -0500 |
User-agent: |
Mozilla/5.0 (Windows NT 6.1; WOW64; rv:17.0) Gecko/20130801 Thunderbird/17.0.8 |
This patch adds support for the VSX bit of the PowerPC Machine
State Register (MSR) as well as the corresponding VSX Unavailable
exception.
The VSX bit is added to the defined bits masks of the Power7 and
Power8 CPU models.
Signed-off-by: Tom Musta <address@hidden>
diff --git a/target-ppc/cpu.h b/target-ppc/cpu.h
index 055a160..68de78b 100644
--- a/target-ppc/cpu.h
+++ b/target-ppc/cpu.h
@@ -236,6 +236,8 @@ enum {
POWERPC_EXCP_NMEXTBR = 91, /* Non maskable external
breakpoint */
POWERPC_EXCP_ITLBE = 92, /* Instruction TLB
error */
POWERPC_EXCP_DTLBE = 93, /* Data TLB
error */
+ /* VSX Unavailable (Power ISA 2.06 and
later) */
+ POWERPC_EXCP_VSXU = 94, /* VSX
Unavailable */
/* EOL */
POWERPC_EXCP_NB = 96,
/* QEMU exceptions: used internally during code
translation */
@@ -426,6 +428,7 @@ struct ppc_slb_t {
#define MSR_VR 25 /* altivec available x hflags */
#define MSR_SPE 25 /* SPE enable for BookE x hflags */
#define MSR_AP 23 /* Access privilege state on 602
hflags */
+#define MSR_VSX 23 /* Vector Scalar Extension (ISA 2.06 and later) x
hflags */
#define MSR_SA 22 /* Supervisor access mode on 602
hflags */
#define MSR_KEY 19 /* key bit on
603e */
#define MSR_POW 18 /* Power
management */
@@ -466,6 +469,7 @@ struct ppc_slb_t {
#define msr_vr ((env->msr >> MSR_VR) & 1)
#define msr_spe ((env->msr >> MSR_SPE) & 1)
#define msr_ap ((env->msr >> MSR_AP) & 1)
+#define msr_vsx ((env->msr >> MSR_VSX) & 1)
#define msr_sa ((env->msr >> MSR_SA) & 1)
#define msr_key ((env->msr >> MSR_KEY) & 1)
#define msr_pow ((env->msr >> MSR_POW) & 1)
diff --git a/target-ppc/excp_helper.c b/target-ppc/excp_helper.c
index c959460..26c57d9 100644
--- a/target-ppc/excp_helper.c
+++ b/target-ppc/excp_helper.c
@@ -390,6 +390,11 @@ static inline void powerpc_excp(PowerPCCPU *cpu,
int excp_model, int excp)
new_msr |= (target_ulong)MSR_HVB;
}
goto store_current;
+ case POWERPC_EXCP_VSXU: /* VSX unavailable
exception */
+ if (lpes1 == 0) {
+ new_msr |= (target_ulong)MSR_HVB;
+ }
+ goto store_current;
case POWERPC_EXCP_PIT: /* Programmable interval timer
interrupt */
LOG_EXCP("PIT exception\n");
goto store_next;
diff --git a/target-ppc/translate.c b/target-ppc/translate.c
index 2da7bc7..21c272f 100644
--- a/target-ppc/translate.c
+++ b/target-ppc/translate.c
@@ -199,6 +199,7 @@ typedef struct DisasContext {
#endif
int fpu_enabled;
int altivec_enabled;
+ int vsx_enabled;
int spe_enabled;
ppc_spr_t *spr_cb; /* Needed to check rights for mfspr/mtspr */
int singlestep_enabled;
@@ -9765,6 +9766,11 @@ static inline void
gen_intermediate_code_internal(PowerPCCPU *cpu,
ctx.altivec_enabled = msr_vr;
else
ctx.altivec_enabled = 0;
+ if ((env->flags & POWERPC_FLAG_VSX) && msr_vsx) {
+ ctx.vsx_enabled = msr_vsx;
+ } else {
+ ctx.vsx_enabled = 0;
+ }
if ((env->flags & POWERPC_FLAG_SE) && msr_se)
ctx.singlestep_enabled = CPU_SINGLE_STEP;
else
diff --git a/target-ppc/translate_init.c b/target-ppc/translate_init.c
index faea21e..85c66e9 100644
--- a/target-ppc/translate_init.c
+++ b/target-ppc/translate_init.c
@@ -3056,6 +3056,7 @@ static void init_excp_POWER7 (CPUPPCState *env)
env->excp_vectors[POWERPC_EXCP_TRACE] = 0x00000D00;
env->excp_vectors[POWERPC_EXCP_PERFM] = 0x00000F00;
env->excp_vectors[POWERPC_EXCP_VPU] = 0x00000F20;
+ env->excp_vectors[POWERPC_EXCP_VSXU] = 0x00000F40;
env->excp_vectors[POWERPC_EXCP_IABR] = 0x00001300;
env->excp_vectors[POWERPC_EXCP_MAINT] = 0x00001600;
env->excp_vectors[POWERPC_EXCP_VPUA] = 0x00001700;
@@ -7227,7 +7228,7 @@ POWERPC_FAMILY(POWER7)(ObjectClass *oc, void *data)
PPC_SEGMENT_64B | PPC_SLBI |
PPC_POPCNTB | PPC_POPCNTWD;
pcc->insns_flags2 = PPC2_VSX | PPC2_DFP | PPC2_DBRX | PPC2_ISA205;
- pcc->msr_mask = 0x800000000204FF37ULL;
+ pcc->msr_mask = 0x800000000284FF37ULL;
pcc->mmu_model = POWERPC_MMU_2_06;
#if defined(CONFIG_SOFTMMU)
pcc->handle_mmu_fault = ppc_hash64_handle_mmu_fault;
@@ -7262,7 +7263,7 @@ POWERPC_FAMILY(POWER8)(ObjectClass *oc, void *data)
PPC_SEGMENT_64B | PPC_SLBI |
PPC_POPCNTB | PPC_POPCNTWD;
pcc->insns_flags2 = PPC2_VSX | PPC2_DFP | PPC2_DBRX;
- pcc->msr_mask = 0x800000000204FF36ULL;
+ pcc->msr_mask = 0x800000000284FF36ULL;
pcc->mmu_model = POWERPC_MMU_2_06;
#if defined(CONFIG_SOFTMMU)
pcc->handle_mmu_fault = ppc_hash64_handle_mmu_fault;
--
1.7.1
- [Qemu-ppc] [PATCH 0/7] Stage 1 VSX Support, Tom Musta, 2013/09/24
- [Qemu-ppc] [PATCH 1/7] Declare and Enable VSX, Tom Musta, 2013/09/24
- [Qemu-ppc] [PATCH 2/7] Add MSR VSX and Associated Exception,
Tom Musta <=
- [Qemu-ppc] [PATCH 3/7] Add VSX Instruction Decoders, Tom Musta, 2013/09/24
- [Qemu-ppc] [PATCH 4/7] Add VSR to Global Registers, Tom Musta, 2013/09/24
- [Qemu-ppc] [PATCH 5/7] Add lxvd2x, Tom Musta, 2013/09/24
- [Qemu-ppc] [PATCH 6/7] Add stxvd2x, Tom Musta, 2013/09/24
- [Qemu-ppc] [PATCH 7/7] Add xxpermdi, Tom Musta, 2013/09/24
- Re: [Qemu-ppc] [PATCH 0/7] Stage 1 VSX Support, Alexander Graf, 2013/09/25