Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c6202ca7 authored by Khalid Aziz's avatar Khalid Aziz Committed by David S. Miller
Browse files

sparc64: Add auxiliary vectors to report platform ADI properties



ADI feature on M7 and newer processors has three important properties
relevant to userspace apps using ADI capabilities - (1) Size of block of
memory an ADI version tag applies to, (2) Number of uppermost bits in
virtual address used to encode ADI tag, and (3) The value M7 processor
will force the ADI tags to if it detects uncorrectable error in an ADI
tagged cacheline. Kernel can retrieve these properties for a platform
through machine description provided by the firmware. This patch adds
code to retrieve these properties and report them to userspace through
auxiliary vectors.

Signed-off-by: default avatarKhalid Aziz <khalid.aziz@oracle.com>
Cc: Khalid Aziz <khalid@gonehiking.org>
Reviewed-by: default avatarAnthony Yznaga <anthony.yznaga@oracle.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 94addb35
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
#ifndef ___ASM_SPARC_ADI_H
#define ___ASM_SPARC_ADI_H
#if defined(__sparc__) && defined(__arch64__)
#include <asm/adi_64.h>
#endif
#endif
+47 −0
Original line number Diff line number Diff line
/* adi_64.h: ADI related data structures
 *
 * Copyright (c) 2016 Oracle and/or its affiliates. All rights reserved.
 * Author: Khalid Aziz (khalid.aziz@oracle.com)
 *
 * This work is licensed under the terms of the GNU GPL, version 2.
 */
#ifndef __ASM_SPARC64_ADI_H
#define __ASM_SPARC64_ADI_H

#include <linux/types.h>

#ifndef __ASSEMBLY__

struct adi_caps {
	__u64 blksz;
	__u64 nbits;
	__u64 ue_on_adi;
};

struct adi_config {
	bool enabled;
	struct adi_caps caps;
};

extern struct adi_config adi_state;

extern void mdesc_adi_init(void);

static inline bool adi_capable(void)
{
	return adi_state.enabled;
}

static inline unsigned long adi_blksize(void)
{
	return adi_state.caps.blksz;
}

static inline unsigned long adi_nbits(void)
{
	return adi_state.caps.nbits;
}

#endif	/* __ASSEMBLY__ */

#endif	/* !(__ASM_SPARC64_ADI_H) */
+5 −0
Original line number Diff line number Diff line
@@ -10,6 +10,7 @@
#include <asm/processor.h>
#include <asm/extable_64.h>
#include <asm/spitfire.h>
#include <asm/adi.h>

/*
 * Sparc section types
@@ -215,9 +216,13 @@ extern unsigned int vdso_enabled;

#define	ARCH_DLINFO							\
do {									\
	extern struct adi_config adi_state;				\
	if (vdso_enabled)						\
		NEW_AUX_ENT(AT_SYSINFO_EHDR,				\
			    (unsigned long)current->mm->context.vdso);	\
	NEW_AUX_ENT(AT_ADI_BLKSZ, adi_state.caps.blksz);		\
	NEW_AUX_ENT(AT_ADI_NBITS, adi_state.caps.nbits);		\
	NEW_AUX_ENT(AT_ADI_UEONADI, adi_state.caps.ue_on_adi);		\
} while (0)

struct linux_binprm;
+11 −0
Original line number Diff line number Diff line
@@ -3,6 +3,17 @@

#define AT_SYSINFO_EHDR		33

#ifdef CONFIG_SPARC64
/* Avoid overlap with other AT_* values since they are consolidated in
 * glibc and any overlaps can cause problems
 */
#define AT_ADI_BLKSZ	48
#define AT_ADI_NBITS	49
#define AT_ADI_UEONADI	50

#define AT_VECTOR_SIZE_ARCH	4
#else
#define AT_VECTOR_SIZE_ARCH	1
#endif

#endif /* !(__ASMSPARC_AUXVEC_H) */
+1 −0
Original line number Diff line number Diff line
@@ -69,6 +69,7 @@ obj-$(CONFIG_SPARC64) += visemul.o
obj-$(CONFIG_SPARC64)   += hvapi.o
obj-$(CONFIG_SPARC64)   += sstate.o
obj-$(CONFIG_SPARC64)   += mdesc.o
obj-$(CONFIG_SPARC64)   += adi_64.o
obj-$(CONFIG_SPARC64)	+= pcr.o
obj-$(CONFIG_SPARC64)	+= nmi.o
obj-$(CONFIG_SPARC64_SMP) += cpumap.o
Loading