forked from Minki/linux
powerpc: Test prefixed instructions in feature fixups
Expand the feature-fixups self-tests to includes tests for prefixed instructions. Signed-off-by: Jordan Niethe <jniethe5@gmail.com> [mpe: Use CONFIG_PPC64 not __powerpc64__, add empty inlines] Signed-off-by: Michael Ellerman <mpe@ellerman.id.au> Link: https://lore.kernel.org/r/20200506034050.24806-26-jniethe5@gmail.com
This commit is contained in:
parent
f77f8ff7f1
commit
785b79d1e0
@ -7,6 +7,7 @@
|
||||
#include <asm/ppc_asm.h>
|
||||
#include <asm/synch.h>
|
||||
#include <asm/asm-compat.h>
|
||||
#include <asm/ppc-opcode.h>
|
||||
|
||||
.text
|
||||
|
||||
@ -791,3 +792,71 @@ globl(lwsync_fixup_test_expected_SYNC)
|
||||
1: or 1,1,1
|
||||
sync
|
||||
|
||||
globl(ftr_fixup_prefix1)
|
||||
or 1,1,1
|
||||
.long OP_PREFIX << 26
|
||||
.long 0x0000000
|
||||
or 2,2,2
|
||||
globl(end_ftr_fixup_prefix1)
|
||||
|
||||
globl(ftr_fixup_prefix1_orig)
|
||||
or 1,1,1
|
||||
.long OP_PREFIX << 26
|
||||
.long 0x0000000
|
||||
or 2,2,2
|
||||
|
||||
globl(ftr_fixup_prefix1_expected)
|
||||
or 1,1,1
|
||||
nop
|
||||
nop
|
||||
or 2,2,2
|
||||
|
||||
globl(ftr_fixup_prefix2)
|
||||
or 1,1,1
|
||||
.long OP_PREFIX << 26
|
||||
.long 0x0000000
|
||||
or 2,2,2
|
||||
globl(end_ftr_fixup_prefix2)
|
||||
|
||||
globl(ftr_fixup_prefix2_orig)
|
||||
or 1,1,1
|
||||
.long OP_PREFIX << 26
|
||||
.long 0x0000000
|
||||
or 2,2,2
|
||||
|
||||
globl(ftr_fixup_prefix2_alt)
|
||||
.long OP_PREFIX << 26
|
||||
.long 0x0000001
|
||||
|
||||
globl(ftr_fixup_prefix2_expected)
|
||||
or 1,1,1
|
||||
.long OP_PREFIX << 26
|
||||
.long 0x0000001
|
||||
or 2,2,2
|
||||
|
||||
globl(ftr_fixup_prefix3)
|
||||
or 1,1,1
|
||||
.long OP_PREFIX << 26
|
||||
.long 0x0000000
|
||||
or 2,2,2
|
||||
or 3,3,3
|
||||
globl(end_ftr_fixup_prefix3)
|
||||
|
||||
globl(ftr_fixup_prefix3_orig)
|
||||
or 1,1,1
|
||||
.long OP_PREFIX << 26
|
||||
.long 0x0000000
|
||||
or 2,2,2
|
||||
or 3,3,3
|
||||
|
||||
globl(ftr_fixup_prefix3_alt)
|
||||
.long OP_PREFIX << 26
|
||||
.long 0x0000001
|
||||
nop
|
||||
|
||||
globl(ftr_fixup_prefix3_expected)
|
||||
or 1,1,1
|
||||
.long OP_PREFIX << 26
|
||||
.long 0x0000001
|
||||
nop
|
||||
or 3,3,3
|
||||
|
@ -689,6 +689,78 @@ static void test_lwsync_macros(void)
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PPC64
|
||||
static void __init test_prefix_patching(void)
|
||||
{
|
||||
extern unsigned int ftr_fixup_prefix1[];
|
||||
extern unsigned int end_ftr_fixup_prefix1[];
|
||||
extern unsigned int ftr_fixup_prefix1_orig[];
|
||||
extern unsigned int ftr_fixup_prefix1_expected[];
|
||||
int size = sizeof(unsigned int) * (end_ftr_fixup_prefix1 - ftr_fixup_prefix1);
|
||||
|
||||
fixup.value = fixup.mask = 8;
|
||||
fixup.start_off = calc_offset(&fixup, ftr_fixup_prefix1 + 1);
|
||||
fixup.end_off = calc_offset(&fixup, ftr_fixup_prefix1 + 3);
|
||||
fixup.alt_start_off = fixup.alt_end_off = 0;
|
||||
|
||||
/* Sanity check */
|
||||
check(memcmp(ftr_fixup_prefix1, ftr_fixup_prefix1_orig, size) == 0);
|
||||
|
||||
patch_feature_section(0, &fixup);
|
||||
check(memcmp(ftr_fixup_prefix1, ftr_fixup_prefix1_expected, size) == 0);
|
||||
check(memcmp(ftr_fixup_prefix1, ftr_fixup_prefix1_orig, size) != 0);
|
||||
}
|
||||
|
||||
static void __init test_prefix_alt_patching(void)
|
||||
{
|
||||
extern unsigned int ftr_fixup_prefix2[];
|
||||
extern unsigned int end_ftr_fixup_prefix2[];
|
||||
extern unsigned int ftr_fixup_prefix2_orig[];
|
||||
extern unsigned int ftr_fixup_prefix2_expected[];
|
||||
extern unsigned int ftr_fixup_prefix2_alt[];
|
||||
int size = sizeof(unsigned int) * (end_ftr_fixup_prefix2 - ftr_fixup_prefix2);
|
||||
|
||||
fixup.value = fixup.mask = 8;
|
||||
fixup.start_off = calc_offset(&fixup, ftr_fixup_prefix2 + 1);
|
||||
fixup.end_off = calc_offset(&fixup, ftr_fixup_prefix2 + 3);
|
||||
fixup.alt_start_off = calc_offset(&fixup, ftr_fixup_prefix2_alt);
|
||||
fixup.alt_end_off = calc_offset(&fixup, ftr_fixup_prefix2_alt + 2);
|
||||
/* Sanity check */
|
||||
check(memcmp(ftr_fixup_prefix2, ftr_fixup_prefix2_orig, size) == 0);
|
||||
|
||||
patch_feature_section(0, &fixup);
|
||||
check(memcmp(ftr_fixup_prefix2, ftr_fixup_prefix2_expected, size) == 0);
|
||||
check(memcmp(ftr_fixup_prefix2, ftr_fixup_prefix2_orig, size) != 0);
|
||||
}
|
||||
|
||||
static void __init test_prefix_word_alt_patching(void)
|
||||
{
|
||||
extern unsigned int ftr_fixup_prefix3[];
|
||||
extern unsigned int end_ftr_fixup_prefix3[];
|
||||
extern unsigned int ftr_fixup_prefix3_orig[];
|
||||
extern unsigned int ftr_fixup_prefix3_expected[];
|
||||
extern unsigned int ftr_fixup_prefix3_alt[];
|
||||
int size = sizeof(unsigned int) * (end_ftr_fixup_prefix3 - ftr_fixup_prefix3);
|
||||
|
||||
fixup.value = fixup.mask = 8;
|
||||
fixup.start_off = calc_offset(&fixup, ftr_fixup_prefix3 + 1);
|
||||
fixup.end_off = calc_offset(&fixup, ftr_fixup_prefix3 + 4);
|
||||
fixup.alt_start_off = calc_offset(&fixup, ftr_fixup_prefix3_alt);
|
||||
fixup.alt_end_off = calc_offset(&fixup, ftr_fixup_prefix3_alt + 3);
|
||||
/* Sanity check */
|
||||
check(memcmp(ftr_fixup_prefix3, ftr_fixup_prefix3_orig, size) == 0);
|
||||
|
||||
patch_feature_section(0, &fixup);
|
||||
check(memcmp(ftr_fixup_prefix3, ftr_fixup_prefix3_expected, size) == 0);
|
||||
patch_feature_section(0, &fixup);
|
||||
check(memcmp(ftr_fixup_prefix3, ftr_fixup_prefix3_orig, size) != 0);
|
||||
}
|
||||
#else
|
||||
static inline void test_prefix_patching(void) {}
|
||||
static inline void test_prefix_alt_patching(void) {}
|
||||
static inline void test_prefix_word_alt_patching(void) {}
|
||||
#endif /* CONFIG_PPC64 */
|
||||
|
||||
static int __init test_feature_fixups(void)
|
||||
{
|
||||
printk(KERN_DEBUG "Running feature fixup self-tests ...\n");
|
||||
@ -703,6 +775,9 @@ static int __init test_feature_fixups(void)
|
||||
test_cpu_macros();
|
||||
test_fw_macros();
|
||||
test_lwsync_macros();
|
||||
test_prefix_patching();
|
||||
test_prefix_alt_patching();
|
||||
test_prefix_word_alt_patching();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user