/* * Note: the next_sp - sp >= signal frame size check * is true when next_sp < sp, for example, when * transitioning from an alternate signal stack to the * normal stack.
*/ if (next_sp - sp >= sizeof(struct signal_frame_32) &&
is_sigreturn_32_address(next_ip, sp) &&
sane_signal_32_frame(sp)) {
sf = (struct signal_frame_32 __user *) (unsignedlong) sp;
mctx = &sf->mctx;
}
while (entry->nr < entry->max_stack) {
fp = (unsignedint __user *) (unsignedlong) sp; if (invalid_user_sp(sp) || read_user_stack_32(fp, &next_sp)) return; if (level > 0 && read_user_stack_32(&fp[1], &next_ip)) return;
uregs = signal_frame_32_regs(sp, next_sp, next_ip); if (!uregs && level <= 1)
uregs = signal_frame_32_regs(sp, next_sp, lr); if (uregs) { /* * This looks like an signal frame, so restart * the stack trace with the values in it.
*/ if (read_user_stack_32(&uregs[PT_NIP], &next_ip) ||
read_user_stack_32(&uregs[PT_LNK], &lr) ||
read_user_stack_32(&uregs[PT_R1], &sp)) return;
level = 0;
perf_callchain_store_context(entry, PERF_CONTEXT_USER);
perf_callchain_store(entry, next_ip); continue;
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.