linux/tools/testing/selftests/arm64/signal/test_signals.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0 */
   2/* Copyright (C) 2019 ARM Limited */
   3
   4#ifndef __TEST_SIGNALS_H__
   5#define __TEST_SIGNALS_H__
   6
   7#include <signal.h>
   8#include <stdbool.h>
   9#include <ucontext.h>
  10
  11/*
  12 * Using ARCH specific and sanitized Kernel headers installed by KSFT
  13 * framework since we asked for it by setting flag KSFT_KHDR_INSTALL
  14 * in our Makefile.
  15 */
  16#include <asm/ptrace.h>
  17#include <asm/hwcap.h>
  18
  19#define __stringify_1(x...)     #x
  20#define __stringify(x...)       __stringify_1(x)
  21
  22#define get_regval(regname, out)                        \
  23{                                                       \
  24        asm volatile("mrs %0, " __stringify(regname)    \
  25        : "=r" (out)                                    \
  26        :                                               \
  27        : "memory");                                    \
  28}
  29
  30/*
  31 * Feature flags used in tdescr.feats_required to specify
  32 * any feature by the test
  33 */
  34enum {
  35        FSSBS_BIT,
  36        FSVE_BIT,
  37        FMAX_END
  38};
  39
  40#define FEAT_SSBS               (1UL << FSSBS_BIT)
  41#define FEAT_SVE                (1UL << FSVE_BIT)
  42
  43/*
  44 * A descriptor used to describe and configure a test case.
  45 * Fields with a non-trivial meaning are described inline in the following.
  46 */
  47struct tdescr {
  48        /* KEEP THIS FIELD FIRST for easier lookup from assembly */
  49        void                    *token;
  50        /* when disabled token based sanity checking is skipped in handler */
  51        bool                    sanity_disabled;
  52        /* just a name for the test-case; manadatory field */
  53        char                    *name;
  54        char                    *descr;
  55        unsigned long           feats_required;
  56        /* bitmask of effectively supported feats: populated at run-time */
  57        unsigned long           feats_supported;
  58        bool                    initialized;
  59        unsigned int            minsigstksz;
  60        /* signum used as a test trigger. Zero if no trigger-signal is used */
  61        int                     sig_trig;
  62        /*
  63         * signum considered as a successful test completion.
  64         * Zero when no signal is expected on success
  65         */
  66        int                     sig_ok;
  67        /* signum expected on unsupported CPU features. */
  68        int                     sig_unsupp;
  69        /* a timeout in second for test completion */
  70        unsigned int            timeout;
  71        bool                    triggered;
  72        bool                    pass;
  73        unsigned int            result;
  74        /* optional sa_flags for the installed handler */
  75        int                     sa_flags;
  76        ucontext_t              saved_uc;
  77        /* used by get_current_ctx() */
  78        size_t                  live_sz;
  79        ucontext_t              *live_uc;
  80        volatile sig_atomic_t   live_uc_valid;
  81        /* optional test private data */
  82        void                    *priv;
  83
  84        /* a custom setup: called alternatively to default_setup */
  85        int (*setup)(struct tdescr *td);
  86        /* a custom init: called by default test init after test_setup */
  87        bool (*init)(struct tdescr *td);
  88        /* a custom cleanup function called before test exits */
  89        void (*cleanup)(struct tdescr *td);
  90        /* an optional function to be used as a trigger for starting test */
  91        int (*trigger)(struct tdescr *td);
  92        /*
  93         * the actual test-core: invoked differently depending on the
  94         * presence of the trigger function above; this is mandatory
  95         */
  96        int (*run)(struct tdescr *td, siginfo_t *si, ucontext_t *uc);
  97        /* an optional function for custom results' processing */
  98        void (*check_result)(struct tdescr *td);
  99};
 100
 101extern struct tdescr tde;
 102#endif
 103