kselftest/arm64/mte: Register mte signal handler with SA_EXPOSE_TAGBITS

To test address tag[63:60] and memory tag[59:56] is preserved
when memory tag fault happen, Let mte_register_signal() to register
signal handler with SA_EXPOSE_TAGBITS.

Signed-off-by: Yeoreum Yun <yeoreum.yun@arm.com>
Reviewed-by: Mark Brown <broonie@kernel.org>
Link: https://lore.kernel.org/r/20250618084513.1761345-6-yeoreum.yun@arm.com
Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>
This commit is contained in:
Yeoreum Yun 2025-06-18 09:45:08 +01:00 committed by Catalin Marinas
parent 49a9942ff8
commit cfafa517c9
9 changed files with 23 additions and 13 deletions

View File

@ -415,7 +415,7 @@ int main(int argc, char *argv[])
return err;
/* Register SIGSEGV handler */
mte_register_signal(SIGSEGV, mte_default_handler);
mte_register_signal(SIGSEGV, mte_default_handler, false);
/* Set test plan */
ksft_set_plan(20);

View File

@ -160,8 +160,8 @@ int main(int argc, char *argv[])
return err;
/* Register SIGSEGV handler */
mte_register_signal(SIGSEGV, mte_default_handler);
mte_register_signal(SIGBUS, mte_default_handler);
mte_register_signal(SIGSEGV, mte_default_handler, false);
mte_register_signal(SIGBUS, mte_default_handler, false);
/* Set test plan */
ksft_set_plan(12);

View File

@ -235,8 +235,8 @@ int main(int argc, char *argv[])
return err;
/* Register signal handlers */
mte_register_signal(SIGBUS, mte_default_handler);
mte_register_signal(SIGSEGV, mte_default_handler);
mte_register_signal(SIGBUS, mte_default_handler, false);
mte_register_signal(SIGSEGV, mte_default_handler, false);
allocate_hugetlb();

View File

@ -141,8 +141,8 @@ int main(int argc, char *argv[])
return KSFT_FAIL;
}
/* Register signal handlers */
mte_register_signal(SIGBUS, mte_default_handler);
mte_register_signal(SIGSEGV, mte_default_handler);
mte_register_signal(SIGBUS, mte_default_handler, false);
mte_register_signal(SIGSEGV, mte_default_handler, false);
/* Set test plan */
ksft_set_plan(4);

View File

@ -201,8 +201,8 @@ int main(int argc, char *argv[])
sizes[item - 1] = page_size + 1;
/* Register signal handlers */
mte_register_signal(SIGBUS, mte_default_handler);
mte_register_signal(SIGSEGV, mte_default_handler);
mte_register_signal(SIGBUS, mte_default_handler, false);
mte_register_signal(SIGSEGV, mte_default_handler, false);
/* Set test plan */
ksft_set_plan(22);

View File

@ -180,7 +180,7 @@ int main(int argc, char *argv[])
return err;
/* Register SIGSEGV handler */
mte_register_signal(SIGSEGV, mte_default_handler);
mte_register_signal(SIGSEGV, mte_default_handler, false);
/* Set test plan */
ksft_set_plan(4);

View File

@ -211,7 +211,7 @@ int main(int argc, char *argv[])
return err;
/* Register signal handlers */
mte_register_signal(SIGSEGV, mte_default_handler);
mte_register_signal(SIGSEGV, mte_default_handler, false);
/* Set test plan */
ksft_set_plan(64);

View File

@ -19,6 +19,10 @@
#include "mte_common_util.h"
#include "mte_def.h"
#ifndef SA_EXPOSE_TAGBITS
#define SA_EXPOSE_TAGBITS 0x00000800
#endif
#define INIT_BUFFER_SIZE 256
struct mte_fault_cxt cur_mte_cxt;
@ -79,12 +83,17 @@ void mte_default_handler(int signum, siginfo_t *si, void *uc)
}
}
void mte_register_signal(int signal, void (*handler)(int, siginfo_t *, void *))
void mte_register_signal(int signal, void (*handler)(int, siginfo_t *, void *),
bool export_tags)
{
struct sigaction sa;
sa.sa_sigaction = handler;
sa.sa_flags = SA_SIGINFO;
if (export_tags && signal == SIGSEGV)
sa.sa_flags |= SA_EXPOSE_TAGBITS;
sigemptyset(&sa.sa_mask);
sigaction(signal, &sa, NULL);
}

View File

@ -40,7 +40,8 @@ extern struct mte_fault_cxt cur_mte_cxt;
/* MTE utility functions */
void mte_default_handler(int signum, siginfo_t *si, void *uc);
void mte_register_signal(int signal, void (*handler)(int, siginfo_t *, void *));
void mte_register_signal(int signal, void (*handler)(int, siginfo_t *, void *),
bool export_tags);
void mte_wait_after_trig(void);
void *mte_allocate_memory(size_t size, int mem_type, int mapping, bool tags);
void *mte_allocate_memory_tag_range(size_t size, int mem_type, int mapping,