|
@@ -4461,18 +4461,14 @@ perf_output_sample_regs(struct perf_output_handle *handle,
|
|
|
}
|
|
|
|
|
|
static void perf_sample_regs_user(struct perf_regs *regs_user,
|
|
|
- struct pt_regs *regs)
|
|
|
+ struct pt_regs *regs,
|
|
|
+ struct pt_regs *regs_user_copy)
|
|
|
{
|
|
|
- if (!user_mode(regs)) {
|
|
|
- if (current->mm)
|
|
|
- regs = task_pt_regs(current);
|
|
|
- else
|
|
|
- regs = NULL;
|
|
|
- }
|
|
|
-
|
|
|
- if (regs) {
|
|
|
- regs_user->abi = perf_reg_abi(current);
|
|
|
+ if (user_mode(regs)) {
|
|
|
+ regs_user->abi = perf_reg_abi(current);
|
|
|
regs_user->regs = regs;
|
|
|
+ } else if (current->mm) {
|
|
|
+ perf_get_regs_user(regs_user, regs, regs_user_copy);
|
|
|
} else {
|
|
|
regs_user->abi = PERF_SAMPLE_REGS_ABI_NONE;
|
|
|
regs_user->regs = NULL;
|
|
@@ -4951,7 +4947,8 @@ void perf_prepare_sample(struct perf_event_header *header,
|
|
|
}
|
|
|
|
|
|
if (sample_type & (PERF_SAMPLE_REGS_USER | PERF_SAMPLE_STACK_USER))
|
|
|
- perf_sample_regs_user(&data->regs_user, regs);
|
|
|
+ perf_sample_regs_user(&data->regs_user, regs,
|
|
|
+ &data->regs_user_copy);
|
|
|
|
|
|
if (sample_type & PERF_SAMPLE_REGS_USER) {
|
|
|
/* regs dump ABI info */
|