-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge tag 'perf-core-for-mingo' of git://git.kernel.org/pub/scm/linux…
…/kernel/git/jolsa/perf into perf/core Pull perf/core improvements and fixes from Jiri Olsa: * Add libdw DWARF post unwind support for ARM (Jean Pihet) * Consolidate types.h for ARM and ARM64 (Jean Pihet) * Fix possible null pointer dereference in session.c (Masanari Iida) * Cleanup, remove unused variables in map_switch_event() (Dongsheng Yang) * Remove nr_state_machine_bugs in perf latency (Dongsheng Yang) * Remove usage of trace_sched_wakeup(.success) (Peter Zijlstra) Signed-off-by: Jiri Olsa <jolsa@kernel.org> Signed-off-by: Ingo Molnar <mingo@kernel.org>
- Loading branch information
Showing
13 changed files
with
187 additions
and
33 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,60 @@ | ||
#include <string.h> | ||
#include "perf_regs.h" | ||
#include "thread.h" | ||
#include "map.h" | ||
#include "event.h" | ||
#include "tests/tests.h" | ||
|
||
#define STACK_SIZE 8192 | ||
|
||
static int sample_ustack(struct perf_sample *sample, | ||
struct thread *thread, u64 *regs) | ||
{ | ||
struct stack_dump *stack = &sample->user_stack; | ||
struct map *map; | ||
unsigned long sp; | ||
u64 stack_size, *buf; | ||
|
||
buf = malloc(STACK_SIZE); | ||
if (!buf) { | ||
pr_debug("failed to allocate sample uregs data\n"); | ||
return -1; | ||
} | ||
|
||
sp = (unsigned long) regs[PERF_REG_ARM_SP]; | ||
|
||
map = map_groups__find(thread->mg, MAP__VARIABLE, (u64) sp); | ||
if (!map) { | ||
pr_debug("failed to get stack map\n"); | ||
free(buf); | ||
return -1; | ||
} | ||
|
||
stack_size = map->end - sp; | ||
stack_size = stack_size > STACK_SIZE ? STACK_SIZE : stack_size; | ||
|
||
memcpy(buf, (void *) sp, stack_size); | ||
stack->data = (char *) buf; | ||
stack->size = stack_size; | ||
return 0; | ||
} | ||
|
||
int test__arch_unwind_sample(struct perf_sample *sample, | ||
struct thread *thread) | ||
{ | ||
struct regs_dump *regs = &sample->user_regs; | ||
u64 *buf; | ||
|
||
buf = calloc(1, sizeof(u64) * PERF_REGS_MAX); | ||
if (!buf) { | ||
pr_debug("failed to allocate sample uregs data\n"); | ||
return -1; | ||
} | ||
|
||
perf_regs_load(buf); | ||
regs->abi = PERF_SAMPLE_REGS_ABI; | ||
regs->regs = buf; | ||
regs->mask = PERF_REGS_MASK; | ||
|
||
return sample_ustack(sample, thread, buf); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,58 @@ | ||
#include <linux/linkage.h> | ||
|
||
#define R0 0x00 | ||
#define R1 0x08 | ||
#define R2 0x10 | ||
#define R3 0x18 | ||
#define R4 0x20 | ||
#define R5 0x28 | ||
#define R6 0x30 | ||
#define R7 0x38 | ||
#define R8 0x40 | ||
#define R9 0x48 | ||
#define SL 0x50 | ||
#define FP 0x58 | ||
#define IP 0x60 | ||
#define SP 0x68 | ||
#define LR 0x70 | ||
#define PC 0x78 | ||
|
||
/* | ||
* Implementation of void perf_regs_load(u64 *regs); | ||
* | ||
* This functions fills in the 'regs' buffer from the actual registers values, | ||
* in the way the perf built-in unwinding test expects them: | ||
* - the PC at the time at the call to this function. Since this function | ||
* is called using a bl instruction, the PC value is taken from LR. | ||
* The built-in unwinding test then unwinds the call stack from the dwarf | ||
* information in unwind__get_entries. | ||
* | ||
* Notes: | ||
* - the 8 bytes stride in the registers offsets comes from the fact | ||
* that the registers are stored in an u64 array (u64 *regs), | ||
* - the regs buffer needs to be zeroed before the call to this function, | ||
* in this case using a calloc in dwarf-unwind.c. | ||
*/ | ||
|
||
.text | ||
.type perf_regs_load,%function | ||
ENTRY(perf_regs_load) | ||
str r0, [r0, #R0] | ||
str r1, [r0, #R1] | ||
str r2, [r0, #R2] | ||
str r3, [r0, #R3] | ||
str r4, [r0, #R4] | ||
str r5, [r0, #R5] | ||
str r6, [r0, #R6] | ||
str r7, [r0, #R7] | ||
str r8, [r0, #R8] | ||
str r9, [r0, #R9] | ||
str sl, [r0, #SL] | ||
str fp, [r0, #FP] | ||
str ip, [r0, #IP] | ||
str sp, [r0, #SP] | ||
str lr, [r0, #LR] | ||
str lr, [r0, #PC] // store pc as lr in order to skip the call | ||
// to this function | ||
mov pc, lr | ||
ENDPROC(perf_regs_load) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,36 @@ | ||
#include <elfutils/libdwfl.h> | ||
#include "../../util/unwind-libdw.h" | ||
#include "../../util/perf_regs.h" | ||
|
||
bool libdw__arch_set_initial_registers(Dwfl_Thread *thread, void *arg) | ||
{ | ||
struct unwind_info *ui = arg; | ||
struct regs_dump *user_regs = &ui->sample->user_regs; | ||
Dwarf_Word dwarf_regs[PERF_REG_ARM_MAX]; | ||
|
||
#define REG(r) ({ \ | ||
Dwarf_Word val = 0; \ | ||
perf_reg_value(&val, user_regs, PERF_REG_ARM_##r); \ | ||
val; \ | ||
}) | ||
|
||
dwarf_regs[0] = REG(R0); | ||
dwarf_regs[1] = REG(R1); | ||
dwarf_regs[2] = REG(R2); | ||
dwarf_regs[3] = REG(R3); | ||
dwarf_regs[4] = REG(R4); | ||
dwarf_regs[5] = REG(R5); | ||
dwarf_regs[6] = REG(R6); | ||
dwarf_regs[7] = REG(R7); | ||
dwarf_regs[8] = REG(R8); | ||
dwarf_regs[9] = REG(R9); | ||
dwarf_regs[10] = REG(R10); | ||
dwarf_regs[11] = REG(FP); | ||
dwarf_regs[12] = REG(IP); | ||
dwarf_regs[13] = REG(SP); | ||
dwarf_regs[14] = REG(LR); | ||
dwarf_regs[15] = REG(PC); | ||
|
||
return dwfl_thread_state_registers(thread, 0, PERF_REG_ARM_MAX, | ||
dwarf_regs); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters