return insn & 0x3f;
}
+static void
+rules_cleanup(struct regs_state *rs, int mode)
+{
+ int i, num_regs;
+
+ num_regs = (mode == DW_MODE_ARM32) ?
+ QUADD_AARCH32_REGISTERS :
+ QUADD_AARCH64_REGISTERS;
+
+ for (i = 0; i < num_regs; i++)
+ set_rule(rs, i, DW_WHERE_UNDEF, 0);
+}
+
static int
dwarf_read_encoded_value(struct ex_region_info *ri,
void *addr,
struct vm_area_struct *vma_sp,
int is_eh)
{
- int i;
+ int i, num_regs;
long err;
unsigned char *insn_end;
unsigned long addr, return_addr, val, user_reg_size;
rs->cfa_register = -1;
rs_initial->cfa_register = -1;
- set_rule(rs, regnum_lr(mode), DW_WHERE_UNDEF, 0);
+ rules_cleanup(rs, mode);
if (cie.initial_insn) {
insn_end = cie.initial_insn + cie.initial_insn_len;
if (err < 0)
return err;
- pr_debug("pc: %#lx, lr: %#lx\n", sf->pc, sf->vregs[regnum_lr(mode)]);
+ pr_debug("pc: %#lx, exec pc: %#lx, lr: %#lx\n",
+ pc, sf->pc, sf->vregs[regnum_lr(mode)]);
pr_debug("sp: %#lx, fp: %#lx, fp_thumb: %#lx\n",
sf->vregs[regnum_sp(mode)],
pr_debug("cfa_register: %u\n", rs->cfa_register);
pr_debug("new cfa: %#lx\n", sf->cfa);
- for (i = 0; i < QUADD_NUM_REGS; i++) {
+ num_regs = (mode == DW_MODE_ARM32) ?
+ QUADD_AARCH32_REGISTERS :
+ QUADD_AARCH64_REGISTERS;
+
+ for (i = 0; i < num_regs; i++) {
switch (rs->reg[i].where) {
case DW_WHERE_UNDEF:
break;
break;
default:
- pr_err_once("[r%d] error: unsupported rule\n",
- rs->reg[i].where);
+ pr_err_once("[r%d] error: unsupported rule (%d)\n",
+ i, rs->reg[i].where);
break;
}
}
struct task_struct *task)
{
long err;
- int i, mode, nr_prev = cc->nr;
+ int mode, nr_prev = cc->nr;
unsigned long ip, lr, sp, fp, fp_thumb;
struct vm_area_struct *vma, *vma_sp;
struct mm_struct *mm = task->mm;
#ifdef CONFIG_ARM64
if (compat_user_mode(regs)) {
- fp = regs->compat_usr(11);
- fp_thumb = regs->compat_usr(7);
+ fp = regs->compat_usr(ARM32_FP);
+ fp_thumb = regs->compat_usr(ARM32_FP_THUMB);
} else {
- fp = regs->regs[29];
+ fp = regs->regs[ARM64_FP];
fp_thumb = 0;
}
#else
}
#ifdef CONFIG_ARM64
- if (compat_user_mode(regs))
- mode = DW_MODE_ARM32;
- else
- mode = DW_MODE_ARM64;
+ mode = compat_user_mode(regs) ?
+ DW_MODE_ARM32 : DW_MODE_ARM64;
#else
mode = DW_MODE_ARM32;
#endif
sf.mode = mode;
sf.cfa = 0;
- for (i = 0; i < QUADD_NUM_REGS; i++)
- set_rule(&sf.rs, i, DW_WHERE_UNDEF, 0);
-
vma = find_vma(mm, ip);
if (!vma)
return 0;