target/arm: Implement v8M VLLDM and VLSTM
For v8M the instructions VLLDM and VLSTM support lazy saving and restoring of the secure floating-point registers. Even if the floating point extension is not implemented, these instructions must act as NOPs in Secure state, so they can be used as part of the secure-to-nonsecure call sequence. Fixes: https://bugs.launchpad.net/qemu/+bug/1768295 Cc: qemu-stable@nongnu.org Signed-off-by: Peter Maydell <peter.maydell@linaro.org> Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Message-id: 20180503105730.5958-1-peter.maydell@linaro.org
This commit is contained in:
		
							parent
							
								
									a82929a251
								
							
						
					
					
						commit
						b1e5336a98
					
				@ -10795,8 +10795,23 @@ static void disas_thumb2_insn(DisasContext *s, uint32_t insn)
 | 
			
		||||
        /* Coprocessor.  */
 | 
			
		||||
        if (arm_dc_feature(s, ARM_FEATURE_M)) {
 | 
			
		||||
            /* We don't currently implement M profile FP support,
 | 
			
		||||
             * so this entire space should give a NOCP fault.
 | 
			
		||||
             * so this entire space should give a NOCP fault, with
 | 
			
		||||
             * the exception of the v8M VLLDM and VLSTM insns, which
 | 
			
		||||
             * must be NOPs in Secure state and UNDEF in Nonsecure state.
 | 
			
		||||
             */
 | 
			
		||||
            if (arm_dc_feature(s, ARM_FEATURE_V8) &&
 | 
			
		||||
                (insn & 0xffa00f00) == 0xec200a00) {
 | 
			
		||||
                /* 0b1110_1100_0x1x_xxxx_xxxx_1010_xxxx_xxxx
 | 
			
		||||
                 *  - VLLDM, VLSTM
 | 
			
		||||
                 * We choose to UNDEF if the RAZ bits are non-zero.
 | 
			
		||||
                 */
 | 
			
		||||
                if (!s->v8m_secure || (insn & 0x0040f0ff)) {
 | 
			
		||||
                    goto illegal_op;
 | 
			
		||||
                }
 | 
			
		||||
                /* Just NOP since FP support is not implemented */
 | 
			
		||||
                break;
 | 
			
		||||
            }
 | 
			
		||||
            /* All other insns: NOCP */
 | 
			
		||||
            gen_exception_insn(s, 4, EXCP_NOCP, syn_uncategorized(),
 | 
			
		||||
                               default_exception_el(s));
 | 
			
		||||
            break;
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user