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        FMAX_END
  37};
  38
  39#define FEAT_SSBS               (1UL << FSSBS_BIT)
  40
  41/*
  42 * A descriptor used to describe and configure a test case.
  43 * Fields with a non-trivial meaning are described inline in the following.
  44 */
  45struct tdescr {
  46        /* KEEP THIS FIELD FIRST for easier lookup from assembly */
  47        void                    *token;
  48        /* when disabled token based sanity checking is skipped in handler */
  49        bool                    sanity_disabled;
  50        /* just a name for the test-case; manadatory field */
  51        char                    *name;
  52        char                    *descr;
  53        unsigned long           feats_required;
  54        /* bitmask of effectively supported feats: populated at run-time */
  55        unsigned long           feats_supported;
  56        bool                    initialized;
  57        unsigned int            minsigstksz;
  58        /* signum used as a test trigger. Zero if no trigger-signal is used */
  59        int                     sig_trig;
  60        /*
  61         * signum considered as a successful test completion.
  62         * Zero when no signal is expected on success
  63         */
  64        int                     sig_ok;
  65        /* signum expected on unsupported CPU features. */
  66        int                     sig_unsupp;
  67        /* a timeout in second for test completion */
  68        unsigned int            timeout;
  69        bool                    triggered;
  70        bool                    pass;
  71        unsigned int            result;
  72        /* optional sa_flags for the installed handler */
  73        int                     sa_flags;
  74        ucontext_t              saved_uc;
  75        /* used by get_current_ctx() */
  76        size_t                  live_sz;
  77        ucontext_t              *live_uc;
  78        volatile sig_atomic_t   live_uc_valid;
  79        /* optional test private data */
  80        void                    *priv;
  81
  82        /* a custom setup: called alternatively to default_setup */
  83        int (*setup)(struct tdescr *td);
  84        /* a custom init: called by default test init after test_setup */
  85        bool (*init)(struct tdescr *td);
  86        /* a custom cleanup function called before test exits */
  87        void (*cleanup)(struct tdescr *td);
  88        /* an optional function to be used as a trigger for starting test */
  89        int (*trigger)(struct tdescr *td);
  90        /*
  91         * the actual test-core: invoked differently depending on the
  92         * presence of the trigger function above; this is mandatory
  93         */
  94        int (*run)(struct tdescr *td, siginfo_t *si, ucontext_t *uc);
  95        /* an optional function for custom results' processing */
  96        void (*check_result)(struct tdescr *td);
  97};
  98
  99extern struct tdescr tde;
 100#endif
 101