Revision 8e71621f target-arm/helper.c

b/target-arm/helper.c
105 105

  
106 106
#else
107 107

  
108
extern int semihosting_enabled;
109

  
108 110
/* Map CPU modes onto saved register banks.  */
109 111
static inline int bank_number (int mode)
110 112
{
......
175 177
            offset = 4;
176 178
        break;
177 179
    case EXCP_SWI:
180
        if (semihosting_enabled) {
181
            /* Check for semihosting interrupt.  */
182
            if (env->thumb) {
183
                mask = lduw_code(env->regs[15] - 2) & 0xff;
184
            } else {
185
                mask = ldl_code(env->regs[15] - 4) & 0xffffff;
186
            }
187
            /* Only intercept calls from privileged modes, to provide some
188
               semblance of security.  */
189
            if (((mask == 0x123456 && !env->thumb)
190
                    || (mask == 0xab && env->thumb))
191
                  && (env->uncached_cpsr & CPSR_M) != ARM_CPU_MODE_USR) {
192
                env->regs[0] = do_arm_semihosting(env);
193
                return;
194
            }
195
        }
178 196
        new_mode = ARM_CPU_MODE_SVC;
179 197
        addr = 0x08;
180 198
        mask = CPSR_I;

Also available in: Unified diff