162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
262306a36Sopenharmony_ci#include <linux/linkage.h>
362306a36Sopenharmony_ci
462306a36Sopenharmony_ci/* Offset is based on macros from arch/powerpc/include/uapi/asm/ptrace.h. */
562306a36Sopenharmony_ci#define R0	 0
662306a36Sopenharmony_ci#define R1	 1 * 8
762306a36Sopenharmony_ci#define R2	 2 * 8
862306a36Sopenharmony_ci#define R3	 3 * 8
962306a36Sopenharmony_ci#define R4	 4 * 8
1062306a36Sopenharmony_ci#define R5	 5 * 8
1162306a36Sopenharmony_ci#define R6	 6 * 8
1262306a36Sopenharmony_ci#define R7	 7 * 8
1362306a36Sopenharmony_ci#define R8	 8 * 8
1462306a36Sopenharmony_ci#define R9	 9 * 8
1562306a36Sopenharmony_ci#define R10	10 * 8
1662306a36Sopenharmony_ci#define R11	11 * 8
1762306a36Sopenharmony_ci#define R12	12 * 8
1862306a36Sopenharmony_ci#define R13	13 * 8
1962306a36Sopenharmony_ci#define R14	14 * 8
2062306a36Sopenharmony_ci#define R15	15 * 8
2162306a36Sopenharmony_ci#define R16	16 * 8
2262306a36Sopenharmony_ci#define R17	17 * 8
2362306a36Sopenharmony_ci#define R18	18 * 8
2462306a36Sopenharmony_ci#define R19	19 * 8
2562306a36Sopenharmony_ci#define R20	20 * 8
2662306a36Sopenharmony_ci#define R21	21 * 8
2762306a36Sopenharmony_ci#define R22	22 * 8
2862306a36Sopenharmony_ci#define R23	23 * 8
2962306a36Sopenharmony_ci#define R24	24 * 8
3062306a36Sopenharmony_ci#define R25	25 * 8
3162306a36Sopenharmony_ci#define R26	26 * 8
3262306a36Sopenharmony_ci#define R27	27 * 8
3362306a36Sopenharmony_ci#define R28	28 * 8
3462306a36Sopenharmony_ci#define R29	29 * 8
3562306a36Sopenharmony_ci#define R30	30 * 8
3662306a36Sopenharmony_ci#define R31	31 * 8
3762306a36Sopenharmony_ci#define NIP	32 * 8
3862306a36Sopenharmony_ci#define CTR	35 * 8
3962306a36Sopenharmony_ci#define LINK	36 * 8
4062306a36Sopenharmony_ci#define XER	37 * 8
4162306a36Sopenharmony_ci
4262306a36Sopenharmony_ci.globl perf_regs_load
4362306a36Sopenharmony_ciperf_regs_load:
4462306a36Sopenharmony_ci	std 0, R0(3)
4562306a36Sopenharmony_ci	std 1, R1(3)
4662306a36Sopenharmony_ci	std 2, R2(3)
4762306a36Sopenharmony_ci	std 3, R3(3)
4862306a36Sopenharmony_ci	std 4, R4(3)
4962306a36Sopenharmony_ci	std 5, R5(3)
5062306a36Sopenharmony_ci	std 6, R6(3)
5162306a36Sopenharmony_ci	std 7, R7(3)
5262306a36Sopenharmony_ci	std 8, R8(3)
5362306a36Sopenharmony_ci	std 9, R9(3)
5462306a36Sopenharmony_ci	std 10, R10(3)
5562306a36Sopenharmony_ci	std 11, R11(3)
5662306a36Sopenharmony_ci	std 12, R12(3)
5762306a36Sopenharmony_ci	std 13, R13(3)
5862306a36Sopenharmony_ci	std 14, R14(3)
5962306a36Sopenharmony_ci	std 15, R15(3)
6062306a36Sopenharmony_ci	std 16, R16(3)
6162306a36Sopenharmony_ci	std 17, R17(3)
6262306a36Sopenharmony_ci	std 18, R18(3)
6362306a36Sopenharmony_ci	std 19, R19(3)
6462306a36Sopenharmony_ci	std 20, R20(3)
6562306a36Sopenharmony_ci	std 21, R21(3)
6662306a36Sopenharmony_ci	std 22, R22(3)
6762306a36Sopenharmony_ci	std 23, R23(3)
6862306a36Sopenharmony_ci	std 24, R24(3)
6962306a36Sopenharmony_ci	std 25, R25(3)
7062306a36Sopenharmony_ci	std 26, R26(3)
7162306a36Sopenharmony_ci	std 27, R27(3)
7262306a36Sopenharmony_ci	std 28, R28(3)
7362306a36Sopenharmony_ci	std 29, R29(3)
7462306a36Sopenharmony_ci	std 30, R30(3)
7562306a36Sopenharmony_ci	std 31, R31(3)
7662306a36Sopenharmony_ci
7762306a36Sopenharmony_ci	/* store NIP */
7862306a36Sopenharmony_ci	mflr 4
7962306a36Sopenharmony_ci	std 4, NIP(3)
8062306a36Sopenharmony_ci
8162306a36Sopenharmony_ci	/* Store LR */
8262306a36Sopenharmony_ci	std 4, LINK(3)
8362306a36Sopenharmony_ci
8462306a36Sopenharmony_ci	/* Store XER */
8562306a36Sopenharmony_ci	mfxer 4
8662306a36Sopenharmony_ci	std 4, XER(3)
8762306a36Sopenharmony_ci
8862306a36Sopenharmony_ci	/* Store CTR */
8962306a36Sopenharmony_ci	mfctr 4
9062306a36Sopenharmony_ci	std 4, CTR(3)
9162306a36Sopenharmony_ci
9262306a36Sopenharmony_ci	/* Restore original value of r4 */
9362306a36Sopenharmony_ci	ld 4, R4(3)
9462306a36Sopenharmony_ci
9562306a36Sopenharmony_ci	blr
96