msrtool: Add endptr to str2msr() showing how many characters were parsed
This also introduces a small change in the user interface for immediate mode (-i). Previously, whitespace could separate high and low words in an MSR as such: msrtool -i 4c00000f='f2f100ff 56960004' That is no longer allowed, a space character now ends the MSR value. Any other character can still be used as separator however, so the following syntax still works as expected: msrtool -i 4c00000f=f2f100ff:56960004 Signed-off-by: Peter Stuge <peter@stuge.se> Acked-by: Stefan Reinauer <stepan@coresystems.de> git-svn-id: svn://svn.coreboot.org/coreboot/trunk@5032 2b7e53f0-3cfb-0310-b3e9-8179ed1497e1
This commit is contained in:
parent
838c5a5d80
commit
34f2907a1b
|
@ -208,7 +208,7 @@ int do_diff(const char *difffn) {
|
|||
m1start = line + tmp + m1pos;
|
||||
for (len = strlen(m1start) - 1; NULL != strchr("\r\n", m1start[len]); --len)
|
||||
m1start[len] = 0;
|
||||
if (!str2msr(m1start, &m1)) {
|
||||
if (!str2msr(m1start, &m1, NULL)) {
|
||||
fprintf(stderr, "%s:%d: invalid MSR value '%s'\n", difffn, linenum, m1start);
|
||||
continue;
|
||||
}
|
||||
|
@ -288,7 +288,7 @@ int main(int argc, char *argv[]) {
|
|||
fprintf(stderr, "missing value in -i argument!\n");
|
||||
break;
|
||||
}
|
||||
if (!str2msr(++optarg, &msrval))
|
||||
if (!str2msr(++optarg, &msrval, NULL))
|
||||
fprintf(stderr, "invalid value in -i argument!\n");
|
||||
break;
|
||||
case 's':
|
||||
|
|
|
@ -170,7 +170,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);
|
||||
uint8_t str2msr(char *str, struct msr *msr);
|
||||
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);
|
||||
|
||||
|
|
|
@ -193,7 +193,7 @@ 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 +205,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 endpotr 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 +232,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;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue