[coreboot] Patch set updated for coreboot: c84bfc3 msrtool: Add new "-lf" option to decode all MSRs

Anton Kochkov (anton.kochkov@gmail.com) gerrit at coreboot.org
Sat Jul 21 15:30:28 CEST 2012


Anton Kochkov (anton.kochkov at gmail.com) just uploaded a new patch set to gerrit, which you can find at http://review.coreboot.org/1260

-gerrit

commit c84bfc38660179939bb82ceaf2c29304d7a5861a
Author: Anton Kochkov <anton.kochkov at gmail.com>
Date:   Sat Jul 21 11:14:50 2012 +0400

    msrtool: Add new "-lf" option to decode all MSRs
    
    Added new -lf option - list all read only MSRs
    and force decoding them for detected or selected
    platform.
    
    Change-Id: I237583618d0af72512b6084bd3486b67c9af54ba
    Signed-off-by: Anton Kochkov <anton.kochkov at gmail.com>
---
 util/msrtool/msrtool.c  |   17 +++++++++++++++--
 util/msrtool/msrtool.h  |    1 +
 util/msrtool/msrutils.c |   33 +++++++++++++++++++++++++++++++++
 3 files changed, 49 insertions(+), 2 deletions(-)

diff --git a/util/msrtool/msrtool.c b/util/msrtool/msrtool.c
index 433fc32..0a4c998 100644
--- a/util/msrtool/msrtool.c
+++ b/util/msrtool/msrtool.c
@@ -71,6 +71,7 @@ static void syntax(char *argv[]) {
 	printf("  -r\t include [Reserved] values\n");
 	printf("  -k\t list all known systems and targets\n");
 	printf("  -l\t list MSRs and bit fields for current target(s) (-kl for ALL targets!)\n");
+	printf("  -lf\t list MSRs and enforce decoding for current target\n");
 	printf("  -c\t access MSRs on the specified CPU, default=%d\n", DEFAULT_CPU);
 	printf("  -m\t force a system, e.g: -m linux\n");
 	printf("  -t\t force a target, can be used multiple times, e.g: -t geodelx -t cs5536\n");
@@ -270,11 +271,11 @@ int main(int argc, char *argv[]) {
 	int ret = 1;
 	const struct sysdef *s;
 	const struct targetdef *t;
-	uint8_t tn, listmsrs = 0, listknown = 0, input = 0;
+	uint8_t tn, listmsrs = 0, listknown = 0, input = 0, forcedecode = 0;
 	uint32_t addr = 0;
 	const char *streamfn = NULL, *difffn = NULL;
 	struct msr msrval = MSR2(-1, -1);
-	while ((c = getopt(argc, argv, "hqvrklc:m:t:a:i:s:d:")) != -1)
+	while ((c = getopt(argc, argv, "hqvrklfc:m:t:a:i:s:d:")) != -1)
 		switch (c) {
 		case 'h':
 			syntax(argv);
@@ -294,6 +295,9 @@ int main(int argc, char *argv[]) {
 		case 'l':
 			listmsrs = 1;
 			break;
+		case 'f':
+			forcedecode = 1;
+			break;
 		case 'c':
 			cpu = atoi(optarg);
 			break;
@@ -395,6 +399,15 @@ int main(int argc, char *argv[]) {
 	}
 
 	if (listmsrs) {
+		if (forcedecode) {
+			for (tn = 0; tn < targets_found; tn++) {
+				if (tn)
+					printf("\n");
+				dumpmsrs(targets[tn], cpu);
+			}
+			printf("\n");
+			return 0;
+		}
 		if (streamfn)
 			return do_stream(streamfn, 1);
 		for (tn = 0; tn < targets_found; tn++) {
diff --git a/util/msrtool/msrtool.h b/util/msrtool/msrtool.h
index 73671e5..25ddc6d 100644
--- a/util/msrtool/msrtool.h
+++ b/util/msrtool/msrtool.h
@@ -172,6 +172,7 @@ const struct msrdef *findmsrdef(const uint32_t addr);
 uint32_t msraddrbyname(const char *name);
 void dumpmsrdefs(const struct targetdef *t);
 int dumpmsrdefsvals(FILE *f, const struct targetdef *t, const uint8_t cpu);
+int dumpmsrs(const struct targetdef *t, const uint8_t cpu);
 uint8_t str2msr(char *str, struct msr *msr, char **endptr);
 void decodemsr(const uint8_t cpu, const uint32_t addr, const struct msr val);
 uint8_t diff_msr(FILE *fout, const uint32_t addr, const struct msr a, const struct msr b);
diff --git a/util/msrtool/msrutils.c b/util/msrtool/msrutils.c
index 2ceb60c..922df14 100644
--- a/util/msrtool/msrutils.c
+++ b/util/msrtool/msrutils.c
@@ -211,6 +211,39 @@ int dumpmsrdefsvals(FILE *f, const struct targetdef *t, const uint8_t cpu) {
 	return 0;
 }
 
+int dumpmsrs(const struct targetdef *t, const uint8_t cpu) {
+	struct msr bitval, mask;
+	struct msr val = MSR1(0);
+	const struct msrdef *m;
+	const struct msrbits *mb;
+	if (NULL == t)
+		return 1;
+	if (!sys->open(cpu, SYS_RDONLY))
+		return 1;
+	printf("# %s MSRs:\n", t->name);
+	for (m = t->msrs; !MSR_ISEOT(*m); m++) {
+		if (t->msrs != m)
+			printf("\n");
+		if (m->type != MSRTYPE_WRONLY) {
+			if (!sys->rdmsr(cpu, m->addr, &val))
+				return 1;
+			printf("# %s\n", m->symbol);
+			for (mb = m->bits; mb->size; mb++) {
+				if (!reserved && 0 == strcmp(mb->name, "RSVD"))
+					continue;
+				print_bitdef(stdout, mb, " = ");
+				mask.hi = mask.lo = 0xffffffff;
+				mask = msr_shr(mask, 64 - mb->size);
+				bitval = msr_shr(val, mb->start - mb->size + 1);
+				msr_and(&bitval, mask);
+				print_bitval(stdout, mb, bitval);
+			}
+		}
+	}
+	sys->close(cpu);
+	return 0;
+}
+
 /**
  * Parse a hexadecimal string into an MSR value.
  *




More information about the coreboot mailing list