X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=util%2Fmsrtool%2Fmsrutils.c;h=2ceb60cd068f827e009657752e2bfc929d60a0a6;hb=51f6a206801aa6c05c2f8a6db12262a6c695e202;hp=4a4782b68795f858c564a1055ea7563e830ece0f;hpb=3108a12e9b701e6c3daeb0ae629ecb603dd6509c;p=coreboot.git diff --git a/util/msrtool/msrutils.c b/util/msrtool/msrutils.c index 4a4782b68..2ceb60cd0 100644 --- a/util/msrtool/msrutils.c +++ b/util/msrtool/msrutils.c @@ -77,13 +77,35 @@ static void print_bitval(FILE *f, const struct msrbits *mb, const struct msr val void hexprint(FILE *f, const struct msr val, const uint8_t bits) { if (bits <= 4) - fprintf(f, "0x%x", (uint8_t)(val.lo & 0x0f)); + fprintf(f, "0x%01x", val.lo & 0xf); else if (bits <= 8) - fprintf(f, "0x%02x", (uint8_t)(val.lo & 0xff)); + fprintf(f, "0x%02x", val.lo & 0xff); + else if (bits <= 12) + fprintf(f, "0x%03x", val.lo & 0xfff); else if (bits <= 16) - fprintf(f, "0x%04x", (uint16_t)(val.lo & 0xffff)); + fprintf(f, "0x%04x", val.lo & 0xffff); + else if (bits <= 20) + fprintf(f, "0x%05x", val.lo & 0xfffff); + else if (bits <= 24) + fprintf(f, "0x%06x", val.lo & 0xffffff); + else if (bits <= 28) + fprintf(f, "0x%07x", val.lo & 0xfffffff); else if (bits <= 32) fprintf(f, "0x%08x", val.lo); + else if (bits <= 36) + fprintf(f, "0x%01x%08x", val.hi & 0xf, val.lo); + else if (bits <= 40) + fprintf(f, "0x%02x%08x", val.hi & 0xff, val.lo); + else if (bits <= 44) + fprintf(f, "0x%03x%08x", val.hi & 0xfff, val.lo); + else if (bits <= 48) + fprintf(f, "0x%04x%08x", val.hi & 0xffff, val.lo); + else if (bits <= 52) + fprintf(f, "0x%05x%08x", val.hi & 0xfffff, val.lo); + else if (bits <= 56) + fprintf(f, "0x%06x%08x", val.hi & 0xffffff, val.lo); + else if (bits <= 60) + fprintf(f, "0x%07x%08x", val.hi & 0xfffffff, val.lo); else fprintf(f, "0x%08x%08x", val.hi, val.lo); } @@ -137,12 +159,12 @@ const struct msrdef *findmsrdef(const uint32_t addr) { return NULL; } -const uint32_t msraddrbyname(const char *name) { +uint32_t msraddrbyname(const char *name) { uint8_t t; const uint32_t addr = strtoul(name, NULL, 16); const struct msrdef *m; if (!targets) - return 0; + return addr; for (t = 0; t < targets_found; t++) for (m = targets[t]->msrs; !MSR_ISEOT(*m); m++) { if (addr == m->addr) @@ -150,7 +172,7 @@ const uint32_t msraddrbyname(const char *name) { if (!strcasecmp(name, m->symbol)) return m->addr; } - return 0; + return addr; } void dumpmsrdefs(const struct targetdef *t) { @@ -191,9 +213,9 @@ int dumpmsrdefsvals(FILE *f, const struct targetdef *t, const uint8_t cpu) { /** * Parse a hexadecimal string into an MSR value. - * + * * Leading 0x or 0X is optional, the string is always parsed as hexadecimal. - * Any non-hexadecimal character can be used to separate the high 32 bits and + * Any non-hexadecimal character except ' ' can separate the high 32 bits and * the low 32 bits. If there is such a separator, high and low values do not * need to be zero padded. If there is no separator, the last <=8 digits are * the low 32 bits and any characters before them are the high 32 bits. @@ -205,15 +227,16 @@ int dumpmsrdefsvals(FILE *f, const struct targetdef *t, const uint8_t cpu) { * @param str The string to parse. The string must be writable but will be * restored before return. * @param msr Pointer to the struct msr where the value will be stored. + * @param endptr If endptr is not NULL, *endptr will point to after the MSR. * @return 1 on success, 0 on parse failure. msr is unchanged on failure. */ -uint8_t str2msr(char *str, struct msr *msr) { +uint8_t str2msr(char *str, struct msr *msr, char **endptr) { char c; size_t len, lo; if (0 == strncmp(str, "0x", 2) || 0 == strncmp(str, "0X", 2)) str += 2; len = strspn(str, HEXCHARS); - if (len <= 8 && 0 == str[len]) { + if (len <= 8 && (0 == str[len] || ' ' == str[len])) { msr->hi = 0; lo = 0; } else if (len <= 8) { @@ -231,7 +254,7 @@ uint8_t str2msr(char *str, struct msr *msr) { msr->hi = strtoul(str, NULL, 16); str[lo] = c; } - msr->lo = strtoul(str + lo, NULL, 16); + msr->lo = strtoul(str + lo, endptr, 16); return 1; }