text: /* SPDX-License-Identifier: GPL-2.0 */
  #ifndef ARCH_PERF_REGS_H
  #define ARCH_PERF_REGS_H
  
  #include <stdlib.h>
  #include <linux/types.h>
  #include <asm/perf_regs.h>
  
  void perf_regs_load(u64 *regs);
  
  #define PERF_REGS_MAX PERF_REG_X86_XMM_MAX
  #ifndef HAVE_ARCH_X86_64_SUPPORT
  #define PERF_REGS_MASK ((1ULL << PERF_REG_X86_32_MAX) - 1)
  #define PERF_SAMPLE_REGS_ABI PERF_SAMPLE_REGS_ABI_32
  #else
  #define REG_NOSUPPORT ((1ULL << PERF_REG_X86_DS) | \
  		       (1ULL << PERF_REG_X86_ES) | \
  		       (1ULL << PERF_REG_X86_FS) | \
  		       (1ULL << PERF_REG_X86_GS))
  #define PERF_REGS_MASK (((1ULL << PERF_REG_X86_64_MAX) - 1) & ~REG_NOSUPPORT)
  #define PERF_SAMPLE_REGS_ABI PERF_SAMPLE_REGS_ABI_64
  #endif
  #define PERF_REG_IP PERF_REG_X86_IP
  #define PERF_REG_SP PERF_REG_X86_SP
  
  static inline const char *__perf_reg_name(int id)
  {
  	switch (id) {
  	case PERF_REG_X86_AX:
  		return "AX";
  	case PERF_REG_X86_BX:
  		return "BX";
  	case PERF_REG_X86_CX:
  		return "CX";
  	case PERF_REG_X86_DX:
  		return "DX";
  	case PERF_REG_X86_SI:
  		return "SI";
  	case PERF_REG_X86_DI:
  		return "DI";
  	case PERF_REG_X86_BP:
  		return "BP";
  	case PERF_REG_X86_SP:
  		return "SP";
  	case PERF_REG_X86_IP:
  		return "IP";
  	case PERF_REG_X86_FLAGS:
  		return "FLAGS";
  	case PERF_REG_X86_CS:
  		return "CS";
  	case PERF_REG_X86_SS:
  		return "SS";
  	case PERF_REG_X86_DS:
  		return "DS";
  	case PERF_REG_X86_ES:
  		return "ES";
  	case PERF_REG_X86_FS:
  		return "FS";
  	case PERF_REG_X86_GS:
  		return "GS";
  #ifdef HAVE_ARCH_X86_64_SUPPORT
  	case PERF_REG_X86_R8:
  		return "R8";
  	case PERF_REG_X86_R9:
  		return "R9";
  	case PERF_REG_X86_R10:
  		return "R10";
  	case PERF_REG_X86_R11:
  		return "R11";
  	case PERF_REG_X86_R12:
  		return "R12";
  	case PERF_REG_X86_R13:
  		return "R13";
  	case PERF_REG_X86_R14:
  		return "R14";
  	case PERF_REG_X86_R15:
  		return "R15";
  #endif /* HAVE_ARCH_X86_64_SUPPORT */
  
  #define XMM(x) \
  	case PERF_REG_X86_XMM ## x:	\
  	case PERF_REG_X86_XMM ## x + 1:	\
  		return "XMM" #x;
  	XMM(0)
  	XMM(1)
  	XMM(2)
  	XMM(3)
  	XMM(4)
  	XMM(5)
  	XMM(6)
  	XMM(7)
  	XMM(8)
  	XMM(9)
  	XMM(10)
  	XMM(11)
  	XMM(12)
  	XMM(13)
  	XMM(14)
  	XMM(15)
  #undef XMM
  	default:
  		return NULL;
  	}
  
  	return NULL;
  }
  
  #endif /* ARCH_PERF_REGS_H */
  