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