Revision d8fd2954 target-arm/cpu.h
b/target-arm/cpu.h | ||
---|---|---|
216 | 216 |
uint32_t cregs[16]; |
217 | 217 |
} iwmmxt; |
218 | 218 |
|
219 |
/* For mixed endian mode. */ |
|
220 |
bool bswap_code; |
|
221 |
|
|
219 | 222 |
#if defined(CONFIG_USER_ONLY) |
220 | 223 |
/* For usermode syscall translation. */ |
221 | 224 |
int eabi; |
... | ... | |
491 | 494 |
#define ARM_TBFLAG_VFPEN_MASK (1 << ARM_TBFLAG_VFPEN_SHIFT) |
492 | 495 |
#define ARM_TBFLAG_CONDEXEC_SHIFT 8 |
493 | 496 |
#define ARM_TBFLAG_CONDEXEC_MASK (0xff << ARM_TBFLAG_CONDEXEC_SHIFT) |
494 |
/* Bits 31..16 are currently unused. */ |
|
497 |
#define ARM_TBFLAG_BSWAP_CODE_SHIFT 16 |
|
498 |
#define ARM_TBFLAG_BSWAP_CODE_MASK (1 << ARM_TBFLAG_BSWAP_CODE_SHIFT) |
|
499 |
/* Bits 31..17 are currently unused. */ |
|
495 | 500 |
|
496 | 501 |
/* some convenience accessor macros */ |
497 | 502 |
#define ARM_TBFLAG_THUMB(F) \ |
... | ... | |
506 | 511 |
(((F) & ARM_TBFLAG_VFPEN_MASK) >> ARM_TBFLAG_VFPEN_SHIFT) |
507 | 512 |
#define ARM_TBFLAG_CONDEXEC(F) \ |
508 | 513 |
(((F) & ARM_TBFLAG_CONDEXEC_MASK) >> ARM_TBFLAG_CONDEXEC_SHIFT) |
514 |
#define ARM_TBFLAG_BSWAP_CODE(F) \ |
|
515 |
(((F) & ARM_TBFLAG_BSWAP_CODE_MASK) >> ARM_TBFLAG_BSWAP_CODE_SHIFT) |
|
509 | 516 |
|
510 | 517 |
static inline void cpu_get_tb_cpu_state(CPUARMState *env, target_ulong *pc, |
511 | 518 |
target_ulong *cs_base, int *flags) |
... | ... | |
516 | 523 |
*flags = (env->thumb << ARM_TBFLAG_THUMB_SHIFT) |
517 | 524 |
| (env->vfp.vec_len << ARM_TBFLAG_VECLEN_SHIFT) |
518 | 525 |
| (env->vfp.vec_stride << ARM_TBFLAG_VECSTRIDE_SHIFT) |
519 |
| (env->condexec_bits << ARM_TBFLAG_CONDEXEC_SHIFT); |
|
526 |
| (env->condexec_bits << ARM_TBFLAG_CONDEXEC_SHIFT) |
|
527 |
| (env->bswap_code << ARM_TBFLAG_BSWAP_CODE_SHIFT); |
|
520 | 528 |
if (arm_feature(env, ARM_FEATURE_M)) { |
521 | 529 |
privmode = !((env->v7m.exception == 0) && (env->v7m.control & 1)); |
522 | 530 |
} else { |
... | ... | |
543 | 551 |
env->regs[15] = tb->pc; |
544 | 552 |
} |
545 | 553 |
|
554 |
/* Load an instruction and return it in the standard little-endian order */ |
|
555 |
static inline uint32_t arm_ldl_code(uint32_t addr, bool do_swap) |
|
556 |
{ |
|
557 |
uint32_t insn = ldl_code(addr); |
|
558 |
if (do_swap) { |
|
559 |
return bswap32(insn); |
|
560 |
} |
|
561 |
return insn; |
|
562 |
} |
|
563 |
|
|
564 |
/* Ditto, for a halfword (Thumb) instruction */ |
|
565 |
static inline uint16_t arm_lduw_code(uint32_t addr, bool do_swap) |
|
566 |
{ |
|
567 |
uint16_t insn = lduw_code(addr); |
|
568 |
if (do_swap) { |
|
569 |
return bswap16(insn); |
|
570 |
} |
|
571 |
return insn; |
|
572 |
} |
|
573 |
|
|
546 | 574 |
#endif |
Also available in: Unified diff