Skip to content

Commit

Permalink
powerpc/code-patching: Add boot selftest for data patching
Browse files Browse the repository at this point in the history
Extend the code patching selftests with some basic coverage of the new
data patching variants too.

Signed-off-by: Benjamin Gray <[email protected]>
Reviewed-by: Hari Bathini <[email protected]>
Signed-off-by: Michael Ellerman <[email protected]>
Link: https://msgid.link/[email protected]
  • Loading branch information
BenjaminGrayNp1 authored and mpe committed Aug 21, 2024
1 parent 5799cd7 commit b7d4733
Showing 1 changed file with 41 additions and 0 deletions.
41 changes: 41 additions & 0 deletions arch/powerpc/lib/test-code-patching.c
Original file line number Diff line number Diff line change
Expand Up @@ -438,6 +438,46 @@ static void __init test_multi_instruction_patching(void)
vfree(buf);
}

static void __init test_data_patching(void)
{
void *buf;
u32 *addr32;

buf = vzalloc(PAGE_SIZE);
check(buf);
if (!buf)
return;

addr32 = buf + 128;

addr32[1] = 0xA0A1A2A3;
addr32[2] = 0xB0B1B2B3;

check(!patch_uint(&addr32[1], 0xC0C1C2C3));

check(addr32[0] == 0);
check(addr32[1] == 0xC0C1C2C3);
check(addr32[2] == 0xB0B1B2B3);
check(addr32[3] == 0);

/* Unaligned patch_ulong() should fail */
if (IS_ENABLED(CONFIG_PPC64))
check(patch_ulong(&addr32[1], 0xD0D1D2D3) == -EINVAL);

check(!patch_ulong(&addr32[2], 0xD0D1D2D3));

check(addr32[0] == 0);
check(addr32[1] == 0xC0C1C2C3);
check(*(unsigned long *)(&addr32[2]) == 0xD0D1D2D3);

if (!IS_ENABLED(CONFIG_PPC64))
check(addr32[3] == 0);

check(addr32[4] == 0);

vfree(buf);
}

static int __init test_code_patching(void)
{
pr_info("Running code patching self-tests ...\n");
Expand All @@ -448,6 +488,7 @@ static int __init test_code_patching(void)
test_translate_branch();
test_prefixed_patching();
test_multi_instruction_patching();
test_data_patching();

return 0;
}
Expand Down

0 comments on commit b7d4733

Please sign in to comment.