Revision b0109805 target-arm/op_helper.c
b/target-arm/op_helper.c | ||
---|---|---|
459 | 459 |
{ |
460 | 460 |
cpsr_write(env, val, mask); |
461 | 461 |
} |
462 |
|
|
463 |
/* Access to user mode registers from privileged modes. */ |
|
464 |
uint32_t HELPER(get_user_reg)(uint32_t regno) |
|
465 |
{ |
|
466 |
uint32_t val; |
|
467 |
|
|
468 |
if (regno == 13) { |
|
469 |
val = env->banked_r13[0]; |
|
470 |
} else if (regno == 14) { |
|
471 |
val = env->banked_r14[0]; |
|
472 |
} else if (regno >= 8 |
|
473 |
&& (env->uncached_cpsr & 0x1f) == ARM_CPU_MODE_FIQ) { |
|
474 |
val = env->usr_regs[regno - 8]; |
|
475 |
} else { |
|
476 |
val = env->regs[regno]; |
|
477 |
} |
|
478 |
return val; |
|
479 |
} |
|
480 |
|
|
481 |
void HELPER(set_user_reg)(uint32_t regno, uint32_t val) |
|
482 |
{ |
|
483 |
if (regno == 13) { |
|
484 |
env->banked_r13[0] = val; |
|
485 |
} else if (regno == 14) { |
|
486 |
env->banked_r14[0] = val; |
|
487 |
} else if (regno >= 8 |
|
488 |
&& (env->uncached_cpsr & 0x1f) == ARM_CPU_MODE_FIQ) { |
|
489 |
env->usr_regs[regno - 8] = val; |
|
490 |
} else { |
|
491 |
env->regs[regno] = val; |
|
492 |
} |
|
493 |
} |
|
494 |
|
Also available in: Unified diff