microblaze: User-mode emulation of hw-excp signals
Signed-off-by: Edgar E. Iglesias <edgar.iglesias@petalogix.com>
This commit is contained in:
		
							parent
							
								
									97694c57d7
								
							
						
					
					
						commit
						b76da7e376
					
				| 
						 | 
				
			
			@ -2233,6 +2233,37 @@ void cpu_loop (CPUState *env)
 | 
			
		|||
            env->regs[3] = ret;
 | 
			
		||||
            env->sregs[SR_PC] = env->regs[14];
 | 
			
		||||
            break;
 | 
			
		||||
        case EXCP_HW_EXCP:
 | 
			
		||||
            env->regs[17] = env->sregs[SR_PC] + 4;
 | 
			
		||||
            if (env->iflags & D_FLAG) {
 | 
			
		||||
                env->sregs[SR_ESR] |= 1 << 12;
 | 
			
		||||
                env->sregs[SR_PC] -= 4;
 | 
			
		||||
                /* FIXME: if branch was immed, replay the imm aswell.  */
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            env->iflags &= ~(IMM_FLAG | D_FLAG);
 | 
			
		||||
 | 
			
		||||
            switch (env->sregs[SR_ESR] & 31) {
 | 
			
		||||
                case ESR_EC_FPU:
 | 
			
		||||
                    info.si_signo = SIGFPE;
 | 
			
		||||
                    info.si_errno = 0;
 | 
			
		||||
                    if (env->sregs[SR_FSR] & FSR_IO) {
 | 
			
		||||
                        info.si_code = TARGET_FPE_FLTINV;
 | 
			
		||||
                    }
 | 
			
		||||
                    if (env->sregs[SR_FSR] & FSR_DZ) {
 | 
			
		||||
                        info.si_code = TARGET_FPE_FLTDIV;
 | 
			
		||||
                    }
 | 
			
		||||
                    info._sifields._sigfault._addr = 0;
 | 
			
		||||
                    queue_signal(env, info.si_signo, &info);
 | 
			
		||||
                    break;
 | 
			
		||||
                default:
 | 
			
		||||
                    printf ("Unhandled hw-exception: 0x%x\n",
 | 
			
		||||
                            env->sregs[SR_ESR] & 5);
 | 
			
		||||
                    cpu_dump_state(env, stderr, fprintf, 0);
 | 
			
		||||
                    exit (1);
 | 
			
		||||
                    break;
 | 
			
		||||
            }
 | 
			
		||||
            break;
 | 
			
		||||
        case EXCP_DEBUG:
 | 
			
		||||
            {
 | 
			
		||||
                int sig;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue