linuxppc-dev.lists.ozlabs.org archive mirror
 help / color / mirror / Atom feed
From: Benjamin Gray <bgray@linux.ibm.com>
To: linuxppc-dev@lists.ozlabs.org
Cc: Benjamin Gray <bgray@linux.ibm.com>
Subject: [PATCH v1 7/9] selftests/powerpc/dexcr: Add DEXCR config details to lsdexcr
Date: Wed, 17 Apr 2024 21:23:23 +1000	[thread overview]
Message-ID: <20240417112325.728010-8-bgray@linux.ibm.com> (raw)
In-Reply-To: <20240417112325.728010-1-bgray@linux.ibm.com>

Now that the DEXCR can be configured with prctl, add a section in
lsdexcr that explains why each aspect is set the way it is.

Signed-off-by: Benjamin Gray <bgray@linux.ibm.com>
---
 .../testing/selftests/powerpc/dexcr/lsdexcr.c | 113 +++++++++++++++++-
 1 file changed, 111 insertions(+), 2 deletions(-)

diff --git a/tools/testing/selftests/powerpc/dexcr/lsdexcr.c b/tools/testing/selftests/powerpc/dexcr/lsdexcr.c
index 94abbfcc389e..a63db47b6610 100644
--- a/tools/testing/selftests/powerpc/dexcr/lsdexcr.c
+++ b/tools/testing/selftests/powerpc/dexcr/lsdexcr.c
@@ -1,9 +1,9 @@
 // SPDX-License-Identifier: GPL-2.0+
 
-#include <errno.h>
 #include <stddef.h>
 #include <stdio.h>
 #include <string.h>
+#include <sys/prctl.h>
 
 #include "dexcr.h"
 #include "utils.h"
@@ -16,6 +16,8 @@ struct dexcr_aspect {
 	const char *name;
 	const char *desc;
 	unsigned int index;
+	unsigned long prctl;
+	const char *sysctl;
 };
 
 static const struct dexcr_aspect aspects[] = {
@@ -23,26 +25,36 @@ static const struct dexcr_aspect aspects[] = {
 		.name = "SBHE",
 		.desc = "Speculative branch hint enable",
 		.index = 0,
+		.prctl = PR_PPC_DEXCR_SBHE,
+		.sysctl = "speculative_branch_hint_enable",
 	},
 	{
 		.name = "IBRTPD",
 		.desc = "Indirect branch recurrent target prediction disable",
 		.index = 3,
+		.prctl = PR_PPC_DEXCR_IBRTPD,
+		.sysctl = "indirect_branch_recurrent_target_prediction_disable",
 	},
 	{
 		.name = "SRAPD",
 		.desc = "Subroutine return address prediction disable",
 		.index = 4,
+		.prctl = PR_PPC_DEXCR_SRAPD,
+		.sysctl = "subroutine_return_address_prediction_disable",
 	},
 	{
 		.name = "NPHIE",
 		.desc = "Non-privileged hash instruction enable",
 		.index = 5,
+		.prctl = PR_PPC_DEXCR_NPHIE,
+		.sysctl = "nonprivileged_hash_instruction_enable",
 	},
 	{
 		.name = "PHIE",
 		.desc = "Privileged hash instruction enable",
 		.index = 6,
+		.prctl = -1,
+		.sysctl = NULL,
 	},
 };
 
@@ -60,7 +72,7 @@ static void print_dexcr(char *name, unsigned int bits)
 	const char *enabled_aspects[ARRAY_SIZE(aspects) + 1] = {NULL};
 	size_t j = 0;
 
-	printf("%s: %08x", name, bits);
+	printf("%s: 0x%08x", name, bits);
 
 	if (bits == 0) {
 		printf("\n");
@@ -103,6 +115,95 @@ static void print_aspect(const struct dexcr_aspect *aspect)
 	printf("  \t(%s)\n", aspect->desc);
 }
 
+static void print_aspect_config(const struct dexcr_aspect *aspect)
+{
+	char sysctl_path[128] = "/proc/sys/kernel/dexcr/";
+	const char *reason = "unknown";
+	const char *reason_hyp = NULL;
+	const char *reason_sysctl = "no sysctl";
+	const char *reason_prctl = "no prctl";
+	bool actual = effective & DEXCR_PR_BIT(aspect->index);
+	bool expected = false;
+
+	long sysctl_ctrl = 0;
+	int prctl_ctrl = 0;
+	int err;
+
+	if (aspect->prctl >= 0) {
+		prctl_ctrl = pr_get_dexcr(aspect->prctl);
+		if (prctl_ctrl < 0)
+			reason_prctl = "(failed to read prctl)";
+		else {
+			if (prctl_ctrl & PR_PPC_DEXCR_CTRL_SET) {
+				reason_prctl = "set by prctl";
+				expected = true;
+			} else if (prctl_ctrl & PR_PPC_DEXCR_CTRL_CLEAR) {
+				reason_prctl = "cleared by prctl";
+				expected = false;
+			} else
+				reason_prctl = "unknown prctl";
+
+			reason = reason_prctl;
+		}
+	}
+
+	if (aspect->sysctl) {
+		strcat(sysctl_path, aspect->sysctl);
+		err = read_long(sysctl_path, &sysctl_ctrl, 10);
+		if (err)
+			reason_sysctl = "(failed to read sysctl)";
+		else {
+			switch (sysctl_ctrl) {
+			case 0:
+				reason_sysctl = "cleared by sysctl";
+				reason = reason_sysctl;
+				expected = false;
+				break;
+			case 1:
+				reason_sysctl = "set by sysctl";
+				reason = reason_sysctl;
+				expected = true;
+				break;
+			case 2:
+				reason_sysctl = "not modified by sysctl";
+				break;
+			case 3:
+				reason_sysctl = "cleared by sysctl (permanent)";
+				reason = reason_sysctl;
+				expected = false;
+				break;
+			case 4:
+				reason_sysctl = "set by sysctl (permanent)";
+				reason = reason_sysctl;
+				expected = true;
+				break;
+			default:
+				reason_sysctl = "unknown sysctl";
+				break;
+			}
+		}
+	}
+
+
+	if (hdexcr & DEXCR_PR_BIT(aspect->index)) {
+		reason_hyp = "set by hypervisor";
+		reason = reason_hyp;
+		expected = true;
+	} else
+		reason_hyp = "not modified by hypervisor";
+
+	printf("%12s (%d): %-28s (%s, %s, %s)\n",
+	       aspect->name,
+	       aspect->index,
+	       reason,
+	       reason_hyp,
+	       reason_sysctl,
+	       reason_prctl);
+
+	if (actual != expected)
+		printf("                : ! actual %s does not match config\n", aspect->name);
+}
+
 int main(int argc, char *argv[])
 {
 	if (!dexcr_exists()) {
@@ -114,6 +215,8 @@ int main(int argc, char *argv[])
 	hdexcr = get_dexcr(HDEXCR);
 	effective = dexcr | hdexcr;
 
+	printf("current status:\n");
+
 	print_dexcr("    DEXCR", dexcr);
 	print_dexcr("   HDEXCR", hdexcr);
 	print_dexcr("Effective", effective);
@@ -136,6 +239,12 @@ int main(int argc, char *argv[])
 		else
 			printf("ignored\n");
 	}
+	printf("\n");
+
+	printf("configuration:\n");
+	for (size_t i = 0; i < ARRAY_SIZE(aspects); i++)
+		print_aspect_config(&aspects[i]);
+	printf("\n");
 
 	return 0;
 }
-- 
2.44.0


  parent reply	other threads:[~2024-04-17 11:29 UTC|newest]

Thread overview: 12+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-04-17 11:23 [PATCH v1 0/9] Add dynamic DEXCR support Benjamin Gray
2024-04-17 11:23 ` [PATCH v1 1/9] selftests/powerpc/dexcr: Add -no-pie to hashchk tests Benjamin Gray
2024-05-07  7:44   ` Andrew Donnellan
2024-04-17 11:23 ` [PATCH v1 2/9] powerpc/dexcr: Track the DEXCR per-process Benjamin Gray
2024-04-17 11:23 ` [PATCH v1 3/9] powerpc/dexcr: Reset DEXCR value across exec Benjamin Gray
2024-04-17 11:23 ` [PATCH v1 4/9] powerpc/dexcr: Add DEXCR prctl interface Benjamin Gray
2024-04-17 11:23 ` [PATCH v1 5/9] selftests/powerpc/dexcr: Add DEXCR prctl interface test Benjamin Gray
2024-04-17 11:23 ` [PATCH v1 6/9] selftests/powerpc/dexcr: Attempt to enable NPHIE in hashchk selftest Benjamin Gray
2024-04-17 11:23 ` Benjamin Gray [this message]
2024-04-17 11:23 ` [PATCH v1 8/9] selftests/powerpc/dexcr: Add chdexcr utility Benjamin Gray
2024-04-17 11:23 ` [PATCH v1 9/9] Documentation: Document PowerPC kernel dynamic DEXCR interface Benjamin Gray
2024-05-08 13:39 ` [PATCH v1 0/9] Add dynamic DEXCR support Michael Ellerman

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20240417112325.728010-8-bgray@linux.ibm.com \
    --to=bgray@linux.ibm.com \
    --cc=linuxppc-dev@lists.ozlabs.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).