/* SPDX-License-Identifier: GPL-2.0 */
/* Copyright (C) 2019 ARM Limited */

#ifndef __TEST_SIGNALS_H__
#define __TEST_SIGNALS_H__

#include <signal.h>
#include <stdbool.h>
#include <ucontext.h>

/*
 * Using ARCH specific and sanitized Kernel headers installed by KSFT
 * framework since we asked for it by setting flag KSFT_KHDR_INSTALL
 * in our Makefile.
 */
#include <asm/ptrace.h>
#include <asm/hwcap.h>

#define __stringify_1(x...)	#x
#define __stringify(x...)	__stringify_1(x)

#define get_regval(regname, out)			\
{							\
	asm volatile("mrs %0, " __stringify(regname)	\
	: "=r" (out)					\
	:						\
	: "memory");					\
}

/*
 * Feature flags used in tdescr.feats_required to specify
 * any feature by the test
 */
enum {
	FSSBS_BIT,
	FSVE_BIT,
	FMAX_END
};

#define FEAT_SSBS		(1UL << FSSBS_BIT)
#define FEAT_SVE		(1UL << FSVE_BIT)

/*
 * A descriptor used to describe and configure a test case.
 * Fields with a non-trivial meaning are described inline in the following.
 */
struct tdescr {
	/* KEEP THIS FIELD FIRST for easier lookup from assembly */
	void			*token;
	/* when disabled token based sanity checking is skipped in handler */
	bool			sanity_disabled;
	/* just a name for the test-case; manadatory field */
	char			*name;
	char			*descr;
	unsigned long		feats_required;
	/* bitmask of effectively supported feats: populated at run-time */
	unsigned long		feats_supported;
	bool			initialized;
	unsigned int		minsigstksz;
	/* signum used as a test trigger. Zero if no trigger-signal is used */
	int			sig_trig;
	/*
	 * signum considered as a successful test completion.
	 * Zero when no signal is expected on success
	 */
	int			sig_ok;
	/* signum expected on unsupported CPU features. */
	int			sig_unsupp;
	/* a timeout in second for test completion */
	unsigned int		timeout;
	bool			triggered;
	bool			pass;
	unsigned int		result;
	/* optional sa_flags for the installed handler */
	int			sa_flags;
	ucontext_t		saved_uc;
	/* used by get_current_ctx() */
	size_t			live_sz;
	ucontext_t		*live_uc;
	volatile sig_atomic_t	live_uc_valid;
	/* optional test private data */
	void			*priv;

	/* a custom setup: called alternatively to default_setup */
	int (*setup)(struct tdescr *td);
	/* a custom init: called by default test init after test_setup */
	bool (*init)(struct tdescr *td);
	/* a custom cleanup function called before test exits */
	void (*cleanup)(struct tdescr *td);
	/* an optional function to be used as a trigger for starting test */
	int (*trigger)(struct tdescr *td);
	/*
	 * the actual test-core: invoked differently depending on the
	 * presence of the trigger function above; this is mandatory
	 */
	int (*run)(struct tdescr *td, siginfo_t *si, ucontext_t *uc);
	/* an optional function for custom results' processing */
	void (*check_result)(struct tdescr *td);
};

extern struct tdescr tde;
#endif
