Files
mckernel/test/sve/src/sve.h
Shiratori, Takehiro 7da5fede8b Test "Scalable Vector Extension (SVE) support." on arm64
Change-Id: I3abaca932985a06b06887b962e769f2eac96c738
2019-02-27 06:26:00 +00:00

78 lines
2.5 KiB
C

/* sve.h COPYRIGHT FUJITSU LIMITED 2016-2019 */
#ifndef __SVE_H__
#define __SVE_H__
#include <asm/ptrace.h>
#include <asm/sigcontext.h>
#include <sys/types.h>
#include <linux/elf.h>
#define fpsimd_sve_state(vq) { \
__uint128_t zregs[32][vq]; \
unsigned short pregs[16][vq]; \
unsigned short ffr[vq]; \
}
#define user_fpsimd_sve_state(vq) { \
struct user_sve_header header; \
struct fpsimd_sve_state(vq) regs; \
}
/* assembler */
extern void sve_save_state(void *state, unsigned int *pfpsr);
extern void sve_load_state(void const *state, unsigned int const *pfpsr);
extern unsigned int sve_get_vl(void);
/* c */
extern unsigned int gen_set_vl(const unsigned int vl);
extern int get_and_compare_vl(const unsigned long exp_arg);
extern int set_and_compare_vl(const unsigned long set_arg);
extern void gen_test_sve(void *buf, unsigned int vq);
extern void gen_test_sve_low_128(void *buf, unsigned int bf_vq,
unsigned int af_vq);
extern void gen_test_fpsimd(struct user_fpsimd_state *buf, unsigned int vq);
extern void gen_test_sve_dirty(void *buf, unsigned int vq);
extern void write_sve(void *buf, unsigned int vq, unsigned int *fpscr);
extern void read_sve(void *buf, unsigned int vq, unsigned int *fpscr);
extern void show_sve(const void *buf, unsigned int vq, unsigned int *fpscr);
extern void read_and_show_sve(void *buf, unsigned int vq, unsigned int *fpscr);
extern int header_compare(const struct user_sve_header *target);
extern int sve_compare(const void *expect, const void *target, unsigned int vq);
extern int fpsimd_compare(const struct user_fpsimd_state *expect,
const struct user_fpsimd_state *target, size_t n);
extern void read_fpsimd(struct user_fpsimd_state *regs);
/* arm64 Scalable Vector Extension controls */
# define PR_SVE_INVALID_FLAGS (1 << 19) /* invalid flag */
/* sve_flags */
# define PR_SVE_GET_VL_FLAGS(ret) ((ret) & ~PR_SVE_VL_LEN_MASK)
/* vector length */
# define PR_SVE_GET_VL_LEN(ret) ((ret) & PR_SVE_VL_LEN_MASK)
/* Definitions for user_sve_header.flags: */
#define SVE_PT_INVALID_FLAGS (1 << 3) /* invalid flag */
/*
* SVE_MAX defines
*/
#define SVE_VQ_MIN 1
#define SVE_NUM_ZREGS 32
#define SVE_NUM_PREGS 16
#define VL_128_BIT 0x10 /* 16 byte */
#define VL_256_BIT 0x20 /* 32 byte */
#define VL_512_BIT 0x40 /* 64 byte */
#define VQ_128_BIT sve_vq_from_vl(VL_128_BIT)
#define VQ_256_BIT sve_vq_from_vl(VL_256_BIT)
#define VQ_512_BIT sve_vq_from_vl(VL_512_BIT)
#define UNSPPORT_VL (384 / 0x10)
#define INVALID_VL_1 (0)
#define INVALID_VL_2 (SVE_VL_MIN - 0x01)
#define INVALID_VL_3 (SVE_VL_MAX + 0x10)
#endif /* __SVE_H__ */