/* * Check decoding of prctl PR_SET_TAGGED_ADDR_CTRL and PR_GET_TAGGED_ADDR_CTRL * operations. * * Copyright (c) 2021 The strace developers. * All rights reserved. * * SPDX-License-Identifier: GPL-2.0-or-later */ #include "tests.h" #include "scno.h" #include #include #include #include #if !XLAT_RAW static void print_tagged_addr_arg(kernel_ulong_t arg) { kernel_ulong_t val = arg & PR_TAGGED_ADDR_ENABLE; printf("%sPR_TAGGED_ADDR_ENABLE", val ? "" : "!"); arg &= ~val; val = arg & PR_MTE_TCF_MASK; switch (val) { case PR_MTE_TCF_NONE: printf("|PR_MTE_TCF_NONE"); break; case PR_MTE_TCF_SYNC: printf("|PR_MTE_TCF_SYNC"); break; case PR_MTE_TCF_ASYNC: printf("|PR_MTE_TCF_ASYNC"); break; case PR_MTE_TCF_MASK: printf("|PR_MTE_TCF_MASK"); break; } arg &= ~val; val = arg & PR_MTE_TAG_MASK; if (val) { printf("|%#llx<> PR_MTE_TAG_SHIFT); } arg &= ~val; if (arg) printf("|%#llx", (unsigned long long) arg); } #endif /* !XLAT_RAW */ #ifdef INJECT_RETVAL # define INJ_STR " (INJECTED)" #else # define INJ_STR "" #endif #if SIZEOF_KERNEL_LONG_T == 8 # define HIBITS(a) a #else # define HIBITS(a) #endif int main(int argc, char *argv[]) { prctl_marker(); #ifdef INJECT_RETVAL unsigned long num_skip; long inject_retval; bool locked = false; if (argc < 3) error_msg_and_fail("Usage: %s NUM_SKIP INJECT_RETVAL", argv[0]); num_skip = strtoul(argv[1], NULL, 0); inject_retval = strtol(argv[2], NULL, 0); for (size_t i = 0; i < num_skip; i++) { if (prctl_marker() != inject_retval) continue; locked = true; break; } if (!locked) error_msg_and_fail("Have not locked on prctl(-1, -2, -3, -4" ", -5) returning %ld", inject_retval); #endif /* INJECT_RETVAL */ static const struct { kernel_ulong_t val; const char *str; } args[] = { { 0, "!PR_TAGGED_ADDR_ENABLE|PR_MTE_TCF_NONE" }, { /* 1 */ ARG_STR(PR_TAGGED_ADDR_ENABLE|PR_MTE_TCF_NONE) }, { 2, "!PR_TAGGED_ADDR_ENABLE|PR_MTE_TCF_SYNC" }, { /* 5 */ ARG_STR(PR_TAGGED_ADDR_ENABLE|PR_MTE_TCF_ASYNC) }, { 6, "!PR_TAGGED_ADDR_ENABLE|PR_MTE_TCF_MASK" }, { 8, "!PR_TAGGED_ADDR_ENABLE|PR_MTE_TCF_NONE|0x1<