correctly mark code segments as code in SELF
[coreboot.git] / util / msrtool / msrutils.c
index 4a4782b68795f858c564a1055ea7563e830ece0f..2ceb60cd068f827e009657752e2bfc929d60a0a6 100644 (file)
@@ -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;
 }