-
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.
csky: Add support for perf registers sampling
This patch implements the perf registers sampling and validation API for csky arch. The valid registers and their register ID are defined in perf_regs.h. Perf tool can backtrace in userspace with unwind library and the registers/user stack dump support. Signed-off-by: Mao Han <han_mao@c-sky.com> Signed-off-by: Guo Ren <ren_guo@c-sky.com>
- Loading branch information
Mao Han
authored and
Guo Ren
committed
Apr 22, 2019
1 parent
0eaf50d
commit daac95e
Showing
4 changed files
with
94 additions
and
0 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
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,51 @@ | ||
/* SPDX-License-Identifier: GPL-2.0 */ | ||
// Copyright (C) 2019 Hangzhou C-SKY Microsystems co.,ltd. | ||
|
||
#ifndef _ASM_CSKY_PERF_REGS_H | ||
#define _ASM_CSKY_PERF_REGS_H | ||
|
||
/* Index of struct pt_regs */ | ||
enum perf_event_csky_regs { | ||
PERF_REG_CSKY_TLS, | ||
PERF_REG_CSKY_LR, | ||
PERF_REG_CSKY_PC, | ||
PERF_REG_CSKY_SR, | ||
PERF_REG_CSKY_SP, | ||
PERF_REG_CSKY_ORIG_A0, | ||
PERF_REG_CSKY_A0, | ||
PERF_REG_CSKY_A1, | ||
PERF_REG_CSKY_A2, | ||
PERF_REG_CSKY_A3, | ||
PERF_REG_CSKY_REGS0, | ||
PERF_REG_CSKY_REGS1, | ||
PERF_REG_CSKY_REGS2, | ||
PERF_REG_CSKY_REGS3, | ||
PERF_REG_CSKY_REGS4, | ||
PERF_REG_CSKY_REGS5, | ||
PERF_REG_CSKY_REGS6, | ||
PERF_REG_CSKY_REGS7, | ||
PERF_REG_CSKY_REGS8, | ||
PERF_REG_CSKY_REGS9, | ||
#if defined(__CSKYABIV2__) | ||
PERF_REG_CSKY_EXREGS0, | ||
PERF_REG_CSKY_EXREGS1, | ||
PERF_REG_CSKY_EXREGS2, | ||
PERF_REG_CSKY_EXREGS3, | ||
PERF_REG_CSKY_EXREGS4, | ||
PERF_REG_CSKY_EXREGS5, | ||
PERF_REG_CSKY_EXREGS6, | ||
PERF_REG_CSKY_EXREGS7, | ||
PERF_REG_CSKY_EXREGS8, | ||
PERF_REG_CSKY_EXREGS9, | ||
PERF_REG_CSKY_EXREGS10, | ||
PERF_REG_CSKY_EXREGS11, | ||
PERF_REG_CSKY_EXREGS12, | ||
PERF_REG_CSKY_EXREGS13, | ||
PERF_REG_CSKY_EXREGS14, | ||
PERF_REG_CSKY_HI, | ||
PERF_REG_CSKY_LO, | ||
PERF_REG_CSKY_DCSR, | ||
#endif | ||
PERF_REG_CSKY_MAX, | ||
}; | ||
#endif /* _ASM_CSKY_PERF_REGS_H */ |
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,40 @@ | ||
// SPDX-License-Identifier: GPL-2.0 | ||
// Copyright (C) 2019 Hangzhou C-SKY Microsystems co.,ltd. | ||
|
||
#include <linux/errno.h> | ||
#include <linux/kernel.h> | ||
#include <linux/perf_event.h> | ||
#include <linux/bug.h> | ||
#include <asm/perf_regs.h> | ||
#include <asm/ptrace.h> | ||
|
||
u64 perf_reg_value(struct pt_regs *regs, int idx) | ||
{ | ||
if (WARN_ON_ONCE((u32)idx >= PERF_REG_CSKY_MAX)) | ||
return 0; | ||
|
||
return (u64)*((u32 *)regs + idx); | ||
} | ||
|
||
#define REG_RESERVED (~((1ULL << PERF_REG_CSKY_MAX) - 1)) | ||
|
||
int perf_reg_validate(u64 mask) | ||
{ | ||
if (!mask || mask & REG_RESERVED) | ||
return -EINVAL; | ||
|
||
return 0; | ||
} | ||
|
||
u64 perf_reg_abi(struct task_struct *task) | ||
{ | ||
return PERF_SAMPLE_REGS_ABI_32; | ||
} | ||
|
||
void perf_get_regs_user(struct perf_regs *regs_user, | ||
struct pt_regs *regs, | ||
struct pt_regs *regs_user_copy) | ||
{ | ||
regs_user->regs = task_pt_regs(current); | ||
regs_user->abi = perf_reg_abi(current); | ||
} |