Revision a1705768
b/target-arm/cpu.h | ||
---|---|---|
453 | 453 |
|
454 | 454 |
#include "cpu-all.h" |
455 | 455 |
|
456 |
/* Bit usage in the TB flags field: */ |
|
457 |
#define ARM_TBFLAG_THUMB_SHIFT 0 |
|
458 |
#define ARM_TBFLAG_THUMB_MASK (1 << ARM_TBFLAG_THUMB_SHIFT) |
|
459 |
#define ARM_TBFLAG_VECLEN_SHIFT 1 |
|
460 |
#define ARM_TBFLAG_VECLEN_MASK (0x7 << ARM_TBFLAG_VECLEN_SHIFT) |
|
461 |
#define ARM_TBFLAG_VECSTRIDE_SHIFT 4 |
|
462 |
#define ARM_TBFLAG_VECSTRIDE_MASK (0x3 << ARM_TBFLAG_VECSTRIDE_SHIFT) |
|
463 |
#define ARM_TBFLAG_PRIV_SHIFT 6 |
|
464 |
#define ARM_TBFLAG_PRIV_MASK (1 << ARM_TBFLAG_PRIV_SHIFT) |
|
465 |
#define ARM_TBFLAG_VFPEN_SHIFT 7 |
|
466 |
#define ARM_TBFLAG_VFPEN_MASK (1 << ARM_TBFLAG_VFPEN_SHIFT) |
|
467 |
#define ARM_TBFLAG_CONDEXEC_SHIFT 8 |
|
468 |
#define ARM_TBFLAG_CONDEXEC_MASK (0xff << ARM_TBFLAG_CONDEXEC_SHIFT) |
|
469 |
/* Bits 31..16 are currently unused. */ |
|
470 |
|
|
471 |
/* some convenience accessor macros */ |
|
472 |
#define ARM_TBFLAG_THUMB(F) \ |
|
473 |
(((F) & ARM_TBFLAG_THUMB_MASK) >> ARM_TBFLAG_THUMB_SHIFT) |
|
474 |
#define ARM_TBFLAG_VECLEN(F) \ |
|
475 |
(((F) & ARM_TBFLAG_VECLEN_MASK) >> ARM_TBFLAG_VECLEN_SHIFT) |
|
476 |
#define ARM_TBFLAG_VECSTRIDE(F) \ |
|
477 |
(((F) & ARM_TBFLAG_VECSTRIDE_MASK) >> ARM_TBFLAG_VECSTRIDE_SHIFT) |
|
478 |
#define ARM_TBFLAG_PRIV(F) \ |
|
479 |
(((F) & ARM_TBFLAG_PRIV_MASK) >> ARM_TBFLAG_PRIV_SHIFT) |
|
480 |
#define ARM_TBFLAG_VFPEN(F) \ |
|
481 |
(((F) & ARM_TBFLAG_VFPEN_MASK) >> ARM_TBFLAG_VFPEN_SHIFT) |
|
482 |
#define ARM_TBFLAG_CONDEXEC(F) \ |
|
483 |
(((F) & ARM_TBFLAG_CONDEXEC_MASK) >> ARM_TBFLAG_CONDEXEC_SHIFT) |
|
484 |
|
|
456 | 485 |
static inline void cpu_get_tb_cpu_state(CPUState *env, target_ulong *pc, |
457 | 486 |
target_ulong *cs_base, int *flags) |
458 | 487 |
{ |
459 | 488 |
*pc = env->regs[15]; |
460 | 489 |
*cs_base = 0; |
461 |
*flags = env->thumb | (env->vfp.vec_len << 1) |
|
462 |
| (env->vfp.vec_stride << 4) | (env->condexec_bits << 8); |
|
463 |
if ((env->uncached_cpsr & CPSR_M) != ARM_CPU_MODE_USR) |
|
464 |
*flags |= (1 << 6); |
|
465 |
if (env->vfp.xregs[ARM_VFP_FPEXC] & (1 << 30)) |
|
466 |
*flags |= (1 << 7); |
|
490 |
*flags = (env->thumb << ARM_TBFLAG_THUMB_SHIFT) |
|
491 |
| (env->vfp.vec_len << ARM_TBFLAG_VECLEN_SHIFT) |
|
492 |
| (env->vfp.vec_stride << ARM_TBFLAG_VECSTRIDE_SHIFT) |
|
493 |
| (env->condexec_bits << ARM_TBFLAG_CONDEXEC_SHIFT); |
|
494 |
if ((env->uncached_cpsr & CPSR_M) != ARM_CPU_MODE_USR) { |
|
495 |
*flags |= ARM_TBFLAG_PRIV_MASK; |
|
496 |
} |
|
497 |
if (env->vfp.xregs[ARM_VFP_FPEXC] & (1 << 30)) { |
|
498 |
*flags |= ARM_TBFLAG_VFPEN_MASK; |
|
499 |
} |
|
467 | 500 |
} |
468 | 501 |
|
469 | 502 |
#endif |
Also available in: Unified diff