target-arm: A32: Emulate the SMC instruction
Implements SMC instruction in AArch32 using the A32 syndrome. When executing SMC instruction from monitor CPU mode SCR.NS bit is reset. Signed-off-by: Sergey Fedorov <s.fedorov@samsung.com> Signed-off-by: Fabian Aggeler <aggelerf@ethz.ch> Signed-off-by: Greg Bellows <greg.bellows@linaro.org> Message-id: 1413910544-20150-7-git-send-email-greg.bellows@linaro.org Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
		
							parent
							
								
									592125f83a
								
							
						
					
					
						commit
						dbe9d16367
					
				@ -4091,6 +4091,12 @@ void arm_cpu_do_interrupt(CPUState *cs)
 | 
				
			|||||||
        mask = CPSR_A | CPSR_I | CPSR_F;
 | 
					        mask = CPSR_A | CPSR_I | CPSR_F;
 | 
				
			||||||
        offset = 4;
 | 
					        offset = 4;
 | 
				
			||||||
        break;
 | 
					        break;
 | 
				
			||||||
 | 
					    case EXCP_SMC:
 | 
				
			||||||
 | 
					        new_mode = ARM_CPU_MODE_MON;
 | 
				
			||||||
 | 
					        addr = 0x08;
 | 
				
			||||||
 | 
					        mask = CPSR_A | CPSR_I | CPSR_F;
 | 
				
			||||||
 | 
					        offset = 0;
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
    default:
 | 
					    default:
 | 
				
			||||||
        cpu_abort(cs, "Unhandled exception 0x%x\n", cs->exception_index);
 | 
					        cpu_abort(cs, "Unhandled exception 0x%x\n", cs->exception_index);
 | 
				
			||||||
        return; /* Never happens.  Keep compiler happy.  */
 | 
					        return; /* Never happens.  Keep compiler happy.  */
 | 
				
			||||||
@ -4109,6 +4115,11 @@ void arm_cpu_do_interrupt(CPUState *cs)
 | 
				
			|||||||
         */
 | 
					         */
 | 
				
			||||||
        addr += env->cp15.vbar_el[1];
 | 
					        addr += env->cp15.vbar_el[1];
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if ((env->uncached_cpsr & CPSR_M) == ARM_CPU_MODE_MON) {
 | 
				
			||||||
 | 
					        env->cp15.scr_el3 &= ~SCR_NS;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    switch_mode (env, new_mode);
 | 
					    switch_mode (env, new_mode);
 | 
				
			||||||
    /* For exceptions taken to AArch32 we must clear the SS bit in both
 | 
					    /* For exceptions taken to AArch32 we must clear the SS bit in both
 | 
				
			||||||
     * PSTATE and in the old-state value we save to SPSR_<mode>, so zero it now.
 | 
					     * PSTATE and in the old-state value we save to SPSR_<mode>, so zero it now.
 | 
				
			||||||
 | 
				
			|||||||
@ -429,8 +429,7 @@ void HELPER(pre_smc)(CPUARMState *env, uint32_t syndrome)
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
    ARMCPU *cpu = arm_env_get_cpu(env);
 | 
					    ARMCPU *cpu = arm_env_get_cpu(env);
 | 
				
			||||||
    int cur_el = arm_current_el(env);
 | 
					    int cur_el = arm_current_el(env);
 | 
				
			||||||
    /* FIXME: Use real secure state.  */
 | 
					    bool secure = arm_is_secure(env);
 | 
				
			||||||
    bool secure = false;
 | 
					 | 
				
			||||||
    bool smd = env->cp15.scr_el3 & SCR_SMD;
 | 
					    bool smd = env->cp15.scr_el3 & SCR_SMD;
 | 
				
			||||||
    /* On ARMv8 AArch32, SMD only applies to NS state.
 | 
					    /* On ARMv8 AArch32, SMD only applies to NS state.
 | 
				
			||||||
     * On ARMv7 SMD only applies to NS state and only if EL2 is available.
 | 
					     * On ARMv7 SMD only applies to NS state and only if EL2 is available.
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user