]> xenbits.xensource.com Git - qemu-xen.git/commitdiff
target-mips: update writing to CP0.Status.KX/SX/UX in MIPS Release R6
authorLeon Alrae <leon.alrae@imgtec.com>
Mon, 14 Sep 2015 12:51:31 +0000 (13:51 +0100)
committerLeon Alrae <leon.alrae@imgtec.com>
Thu, 29 Oct 2015 16:16:44 +0000 (16:16 +0000)
Implement the relationship between CP0.Status.KX, SX and UX. It should not
be possible to set UX bit if SX is 0, the same applies for setting SX if
KX is 0.

Signed-off-by: Leon Alrae <leon.alrae@imgtec.com>
target-mips/cpu.h

index 3799d26d227d07d8c7e684fc8bab936591f484ab..c68681dec808ab3fa6425294b4f0cb2dd41c1e92 100644 (file)
@@ -1001,7 +1001,12 @@ static inline void cpu_mips_store_status(CPUMIPSState *env, target_ulong val)
 
     if (env->insn_flags & ISA_MIPS32R6) {
         bool has_supervisor = extract32(mask, CP0St_KSU, 2) == 0x3;
-
+#if defined(TARGET_MIPS64)
+        uint32_t ksux = (1 << CP0St_KX) & val;
+        ksux |= (ksux >> 1) & val; /* KX = 0 forces SX to be 0 */
+        ksux |= (ksux >> 1) & val; /* SX = 0 forces UX to be 0 */
+        val = (val & ~(7 << CP0St_UX)) | ksux;
+#endif
         if (has_supervisor && extract32(val, CP0St_KSU, 2) == 0x3) {
             mask &= ~(3 << CP0St_KSU);
         }