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);
 
                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);
 
                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();
 
 
                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);
 
        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);
 
                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);
 
                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);
 
 #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;
        }
 }
 
-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);
 }
 
 
 /* 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,