2019-05-29 00:57:18 +08:00
|
|
|
/* SPDX-License-Identifier: GPL-2.0-only */
|
2014-06-10 20:23:10 +08:00
|
|
|
/*
|
|
|
|
* Copyright 2014, Michael Ellerman, IBM Corp.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef _SELFTESTS_POWERPC_REG_H
|
|
|
|
#define _SELFTESTS_POWERPC_REG_H
|
|
|
|
|
|
|
|
#define __stringify_1(x) #x
|
|
|
|
#define __stringify(x) __stringify_1(x)
|
|
|
|
|
2015-12-23 13:49:50 +08:00
|
|
|
#define mfspr(rn) ({unsigned long rval; \
|
|
|
|
asm volatile("mfspr %0," _str(rn) \
|
|
|
|
: "=r" (rval)); rval; })
|
|
|
|
#define mtspr(rn, v) asm volatile("mtspr " _str(rn) ",%0" : \
|
|
|
|
: "r" ((unsigned long)(v)) \
|
|
|
|
: "memory")
|
2014-06-10 20:23:10 +08:00
|
|
|
|
|
|
|
#define mb() asm volatile("sync" : : : "memory");
|
2018-07-24 13:53:22 +08:00
|
|
|
#define barrier() asm volatile("" : : : "memory");
|
2014-06-10 20:23:10 +08:00
|
|
|
|
|
|
|
#define SPRN_MMCR2 769
|
|
|
|
#define SPRN_MMCRA 770
|
|
|
|
#define SPRN_MMCR0 779
|
|
|
|
#define MMCR0_PMAO 0x00000080
|
|
|
|
#define MMCR0_PMAE 0x04000000
|
|
|
|
#define MMCR0_FC 0x80000000
|
|
|
|
#define SPRN_EBBHR 804
|
|
|
|
#define SPRN_EBBRR 805
|
|
|
|
#define SPRN_BESCR 806 /* Branch event status & control register */
|
|
|
|
#define SPRN_BESCRS 800 /* Branch event status & control set (1 bits set to 1) */
|
|
|
|
#define SPRN_BESCRSU 801 /* Branch event status & control set upper */
|
|
|
|
#define SPRN_BESCRR 802 /* Branch event status & control REset (1 bits set to 0) */
|
|
|
|
#define SPRN_BESCRRU 803 /* Branch event status & control REset upper */
|
|
|
|
|
|
|
|
#define BESCR_PMEO 0x1 /* PMU Event-based exception Occurred */
|
|
|
|
#define BESCR_PME (0x1ul << 32) /* PMU Event-based exception Enable */
|
|
|
|
|
|
|
|
#define SPRN_PMC1 771
|
|
|
|
#define SPRN_PMC2 772
|
|
|
|
#define SPRN_PMC3 773
|
|
|
|
#define SPRN_PMC4 774
|
|
|
|
#define SPRN_PMC5 775
|
|
|
|
#define SPRN_PMC6 776
|
|
|
|
|
|
|
|
#define SPRN_SIAR 780
|
|
|
|
#define SPRN_SDAR 781
|
|
|
|
#define SPRN_SIER 768
|
|
|
|
|
2016-09-30 10:32:50 +08:00
|
|
|
#define SPRN_TEXASR 0x82 /* Transaction Exception and Status Register */
|
2015-12-23 13:49:50 +08:00
|
|
|
#define SPRN_TFIAR 0x81 /* Transaction Failure Inst Addr */
|
|
|
|
#define SPRN_TFHAR 0x80 /* Transaction Failure Handler Addr */
|
2016-09-30 10:32:50 +08:00
|
|
|
#define SPRN_TAR 0x32f /* Target Address Register */
|
|
|
|
|
|
|
|
#define SPRN_DSCR_PRIV 0x11 /* Privilege State DSCR */
|
|
|
|
#define SPRN_DSCR 0x03 /* Data Stream Control Register */
|
|
|
|
#define SPRN_PPR 896 /* Program Priority Register */
|
2018-05-25 10:11:44 +08:00
|
|
|
#define SPRN_AMR 13 /* Authority Mask Register - problem state */
|
2016-09-30 10:32:50 +08:00
|
|
|
|
2020-06-04 20:56:08 +08:00
|
|
|
#define set_amr(v) asm volatile("isync;" \
|
|
|
|
"mtspr " __stringify(SPRN_AMR) ",%0;" \
|
|
|
|
"isync" : \
|
|
|
|
: "r" ((unsigned long)(v)) \
|
|
|
|
: "memory")
|
|
|
|
|
2016-09-30 10:32:50 +08:00
|
|
|
/* TEXASR register bits */
|
|
|
|
#define TEXASR_FC 0xFE00000000000000
|
|
|
|
#define TEXASR_FP 0x0100000000000000
|
|
|
|
#define TEXASR_DA 0x0080000000000000
|
|
|
|
#define TEXASR_NO 0x0040000000000000
|
|
|
|
#define TEXASR_FO 0x0020000000000000
|
|
|
|
#define TEXASR_SIC 0x0010000000000000
|
|
|
|
#define TEXASR_NTC 0x0008000000000000
|
|
|
|
#define TEXASR_TC 0x0004000000000000
|
|
|
|
#define TEXASR_TIC 0x0002000000000000
|
|
|
|
#define TEXASR_IC 0x0001000000000000
|
|
|
|
#define TEXASR_IFC 0x0000800000000000
|
|
|
|
#define TEXASR_ABT 0x0000000100000000
|
|
|
|
#define TEXASR_SPD 0x0000000080000000
|
|
|
|
#define TEXASR_HV 0x0000000020000000
|
|
|
|
#define TEXASR_PR 0x0000000010000000
|
|
|
|
#define TEXASR_FS 0x0000000008000000
|
|
|
|
#define TEXASR_TE 0x0000000004000000
|
|
|
|
#define TEXASR_ROT 0x0000000002000000
|
|
|
|
|
selftests/powerpc: New TM signal self test
A new self test that forces MSR[TS] to be set without calling any TM
instruction. This test also tries to cause a page fault at a signal
handler, exactly between MSR[TS] set and tm_recheckpoint(), forcing
thread->texasr to be rewritten with TEXASR[FS] = 0, which will cause a BUG
when tm_recheckpoint() is called.
This test is not deterministic, since it is hard to guarantee that the page
access will cause a page fault. In order to force more page faults at
signal context, the signal handler and the ucontext are being mapped into a
MADV_DONTNEED memory chunks.
Tests have shown that the bug could be exposed with few interactions in a
buggy kernel. This test is configured to loop 5000x, having a good chance
to hit the kernel issue in just one run. This self test takes less than
two seconds to run.
This test uses set/getcontext because the kernel will recheckpoint
zeroed structures, causing the test to segfault, which is undesired because
the test needs to rerun, so, there is a signal handler for SIGSEGV which
will restart the test.
v2: Uses the MADV_DONTNEED memory advice
v3: Fix memcpy and 32-bits compilation
v4: Does not define unused macros
Signed-off-by: Breno Leitao <leitao@debian.org>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
2019-01-08 19:31:21 +08:00
|
|
|
/* MSR register bits */
|
|
|
|
#define MSR_TS_S_LG 33 /* Trans Mem state: Suspended */
|
selftests/powerpc: Add a signal fuzzer selftest
This is a new selftest that raises SIGUSR1 signals and handles it in a
set of different ways, trying to create different scenario for testing
purpose.
This test works raising a signal and calling sigreturn interleaved
with TM operations, as starting, suspending and terminating a
transaction. The test depends on random numbers, and, based on them,
it sets different TM states.
Other than that, the test fills out the user context struct that is
passed to the sigreturn system call with random data, in order to make
sure that the signal handler syscall can handle different and invalid
states properly.
This selftest has command line parameters to control what kind of
tests the user wants to run, as for example, if a transaction should
be started prior to signal being raised, or, after the signal being
raised and before the sigreturn. If no parameter is given, the default
is enabling all options.
This test does not check if the user context is being read and set
properly by the kernel. Its purpose, at this time, is basically
guaranteeing that the kernel does not crash on invalid scenarios.
Signed-off-by: Breno Leitao <leitao@debian.org>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
2019-01-18 01:01:54 +08:00
|
|
|
#define MSR_TS_T_LG 34 /* Trans Mem state: Active */
|
selftests/powerpc: New TM signal self test
A new self test that forces MSR[TS] to be set without calling any TM
instruction. This test also tries to cause a page fault at a signal
handler, exactly between MSR[TS] set and tm_recheckpoint(), forcing
thread->texasr to be rewritten with TEXASR[FS] = 0, which will cause a BUG
when tm_recheckpoint() is called.
This test is not deterministic, since it is hard to guarantee that the page
access will cause a page fault. In order to force more page faults at
signal context, the signal handler and the ucontext are being mapped into a
MADV_DONTNEED memory chunks.
Tests have shown that the bug could be exposed with few interactions in a
buggy kernel. This test is configured to loop 5000x, having a good chance
to hit the kernel issue in just one run. This self test takes less than
two seconds to run.
This test uses set/getcontext because the kernel will recheckpoint
zeroed structures, causing the test to segfault, which is undesired because
the test needs to rerun, so, there is a signal handler for SIGSEGV which
will restart the test.
v2: Uses the MADV_DONTNEED memory advice
v3: Fix memcpy and 32-bits compilation
v4: Does not define unused macros
Signed-off-by: Breno Leitao <leitao@debian.org>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
2019-01-08 19:31:21 +08:00
|
|
|
|
|
|
|
#define __MASK(X) (1UL<<(X))
|
|
|
|
|
|
|
|
/* macro to check TM MSR bits */
|
|
|
|
#define MSR_TS_S __MASK(MSR_TS_S_LG) /* Transaction Suspended */
|
selftests/powerpc: Add a signal fuzzer selftest
This is a new selftest that raises SIGUSR1 signals and handles it in a
set of different ways, trying to create different scenario for testing
purpose.
This test works raising a signal and calling sigreturn interleaved
with TM operations, as starting, suspending and terminating a
transaction. The test depends on random numbers, and, based on them,
it sets different TM states.
Other than that, the test fills out the user context struct that is
passed to the sigreturn system call with random data, in order to make
sure that the signal handler syscall can handle different and invalid
states properly.
This selftest has command line parameters to control what kind of
tests the user wants to run, as for example, if a transaction should
be started prior to signal being raised, or, after the signal being
raised and before the sigreturn. If no parameter is given, the default
is enabling all options.
This test does not check if the user context is being read and set
properly by the kernel. Its purpose, at this time, is basically
guaranteeing that the kernel does not crash on invalid scenarios.
Signed-off-by: Breno Leitao <leitao@debian.org>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
2019-01-18 01:01:54 +08:00
|
|
|
#define MSR_TS_T __MASK(MSR_TS_T_LG) /* Transaction Transactional */
|
selftests/powerpc: New TM signal self test
A new self test that forces MSR[TS] to be set without calling any TM
instruction. This test also tries to cause a page fault at a signal
handler, exactly between MSR[TS] set and tm_recheckpoint(), forcing
thread->texasr to be rewritten with TEXASR[FS] = 0, which will cause a BUG
when tm_recheckpoint() is called.
This test is not deterministic, since it is hard to guarantee that the page
access will cause a page fault. In order to force more page faults at
signal context, the signal handler and the ucontext are being mapped into a
MADV_DONTNEED memory chunks.
Tests have shown that the bug could be exposed with few interactions in a
buggy kernel. This test is configured to loop 5000x, having a good chance
to hit the kernel issue in just one run. This self test takes less than
two seconds to run.
This test uses set/getcontext because the kernel will recheckpoint
zeroed structures, causing the test to segfault, which is undesired because
the test needs to rerun, so, there is a signal handler for SIGSEGV which
will restart the test.
v2: Uses the MADV_DONTNEED memory advice
v3: Fix memcpy and 32-bits compilation
v4: Does not define unused macros
Signed-off-by: Breno Leitao <leitao@debian.org>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
2019-01-08 19:31:21 +08:00
|
|
|
|
2016-09-30 10:32:50 +08:00
|
|
|
/* Vector Instructions */
|
|
|
|
#define VSX_XX1(xs, ra, rb) (((xs) & 0x1f) << 21 | ((ra) << 16) | \
|
|
|
|
((rb) << 11) | (((xs) >> 5)))
|
|
|
|
#define STXVD2X(xs, ra, rb) .long (0x7c000798 | VSX_XX1((xs), (ra), (rb)))
|
|
|
|
#define LXVD2X(xs, ra, rb) .long (0x7c000698 | VSX_XX1((xs), (ra), (rb)))
|
2015-12-23 13:49:50 +08:00
|
|
|
|
2016-09-30 10:32:52 +08:00
|
|
|
#define ASM_LOAD_GPR_IMMED(_asm_symbol_name_immed) \
|
|
|
|
"li 14, %[" #_asm_symbol_name_immed "];" \
|
|
|
|
"li 15, %[" #_asm_symbol_name_immed "];" \
|
|
|
|
"li 16, %[" #_asm_symbol_name_immed "];" \
|
|
|
|
"li 17, %[" #_asm_symbol_name_immed "];" \
|
|
|
|
"li 18, %[" #_asm_symbol_name_immed "];" \
|
|
|
|
"li 19, %[" #_asm_symbol_name_immed "];" \
|
|
|
|
"li 20, %[" #_asm_symbol_name_immed "];" \
|
|
|
|
"li 21, %[" #_asm_symbol_name_immed "];" \
|
|
|
|
"li 22, %[" #_asm_symbol_name_immed "];" \
|
|
|
|
"li 23, %[" #_asm_symbol_name_immed "];" \
|
|
|
|
"li 24, %[" #_asm_symbol_name_immed "];" \
|
|
|
|
"li 25, %[" #_asm_symbol_name_immed "];" \
|
|
|
|
"li 26, %[" #_asm_symbol_name_immed "];" \
|
|
|
|
"li 27, %[" #_asm_symbol_name_immed "];" \
|
|
|
|
"li 28, %[" #_asm_symbol_name_immed "];" \
|
|
|
|
"li 29, %[" #_asm_symbol_name_immed "];" \
|
|
|
|
"li 30, %[" #_asm_symbol_name_immed "];" \
|
|
|
|
"li 31, %[" #_asm_symbol_name_immed "];"
|
|
|
|
|
|
|
|
#define ASM_LOAD_FPR_SINGLE_PRECISION(_asm_symbol_name_addr) \
|
|
|
|
"lfs 0, 0(%[" #_asm_symbol_name_addr "]);" \
|
|
|
|
"lfs 1, 0(%[" #_asm_symbol_name_addr "]);" \
|
|
|
|
"lfs 2, 0(%[" #_asm_symbol_name_addr "]);" \
|
|
|
|
"lfs 3, 0(%[" #_asm_symbol_name_addr "]);" \
|
|
|
|
"lfs 4, 0(%[" #_asm_symbol_name_addr "]);" \
|
|
|
|
"lfs 5, 0(%[" #_asm_symbol_name_addr "]);" \
|
|
|
|
"lfs 6, 0(%[" #_asm_symbol_name_addr "]);" \
|
|
|
|
"lfs 7, 0(%[" #_asm_symbol_name_addr "]);" \
|
|
|
|
"lfs 8, 0(%[" #_asm_symbol_name_addr "]);" \
|
|
|
|
"lfs 9, 0(%[" #_asm_symbol_name_addr "]);" \
|
|
|
|
"lfs 10, 0(%[" #_asm_symbol_name_addr "]);" \
|
|
|
|
"lfs 11, 0(%[" #_asm_symbol_name_addr "]);" \
|
|
|
|
"lfs 12, 0(%[" #_asm_symbol_name_addr "]);" \
|
|
|
|
"lfs 13, 0(%[" #_asm_symbol_name_addr "]);" \
|
|
|
|
"lfs 14, 0(%[" #_asm_symbol_name_addr "]);" \
|
|
|
|
"lfs 15, 0(%[" #_asm_symbol_name_addr "]);" \
|
|
|
|
"lfs 16, 0(%[" #_asm_symbol_name_addr "]);" \
|
|
|
|
"lfs 17, 0(%[" #_asm_symbol_name_addr "]);" \
|
|
|
|
"lfs 18, 0(%[" #_asm_symbol_name_addr "]);" \
|
|
|
|
"lfs 19, 0(%[" #_asm_symbol_name_addr "]);" \
|
|
|
|
"lfs 20, 0(%[" #_asm_symbol_name_addr "]);" \
|
|
|
|
"lfs 21, 0(%[" #_asm_symbol_name_addr "]);" \
|
|
|
|
"lfs 22, 0(%[" #_asm_symbol_name_addr "]);" \
|
|
|
|
"lfs 23, 0(%[" #_asm_symbol_name_addr "]);" \
|
|
|
|
"lfs 24, 0(%[" #_asm_symbol_name_addr "]);" \
|
|
|
|
"lfs 25, 0(%[" #_asm_symbol_name_addr "]);" \
|
|
|
|
"lfs 26, 0(%[" #_asm_symbol_name_addr "]);" \
|
|
|
|
"lfs 27, 0(%[" #_asm_symbol_name_addr "]);" \
|
|
|
|
"lfs 28, 0(%[" #_asm_symbol_name_addr "]);" \
|
|
|
|
"lfs 29, 0(%[" #_asm_symbol_name_addr "]);" \
|
|
|
|
"lfs 30, 0(%[" #_asm_symbol_name_addr "]);" \
|
|
|
|
"lfs 31, 0(%[" #_asm_symbol_name_addr "]);"
|
|
|
|
|
|
|
|
#ifndef __ASSEMBLER__
|
|
|
|
void store_gpr(unsigned long *addr);
|
|
|
|
void load_gpr(unsigned long *addr);
|
|
|
|
void load_fpr_single_precision(float *addr);
|
|
|
|
void store_fpr_single_precision(float *addr);
|
|
|
|
#endif /* end of __ASSEMBLER__ */
|
|
|
|
|
2014-06-10 20:23:10 +08:00
|
|
|
#endif /* _SELFTESTS_POWERPC_REG_H */
|