@@ -420,7 +420,7 @@ static const struct feat_props l2_cat_props = {
};
static void __init parse_psr_bool(char *s, char *value, char *feature,
- unsigned int mask)
+ unsigned int mask, int *rc)
{
if ( !strcmp(s, feature) )
{
@@ -434,13 +434,17 @@ static void __init parse_psr_bool(char *s, char *value, char *feature,
opt_psr &= ~mask;
else if ( val_int == 1 )
opt_psr |= mask;
+ else
+ *rc = -EINVAL;
}
}
}
-static void __init parse_psr_param(char *s)
+static int __init parse_psr_param(char *s)
{
char *ss, *val_str;
+ const char *q;
+ int rc = 0;
do {
ss = strchr(s, ',');
@@ -451,18 +455,28 @@ static void __init parse_psr_param(char *s)
if ( val_str )
*val_str++ = '\0';
- parse_psr_bool(s, val_str, "cmt", PSR_CMT);
- parse_psr_bool(s, val_str, "cat", PSR_CAT);
- parse_psr_bool(s, val_str, "cdp", PSR_CDP);
+ parse_psr_bool(s, val_str, "cmt", PSR_CMT, &rc);
+ parse_psr_bool(s, val_str, "cat", PSR_CAT, &rc);
+ parse_psr_bool(s, val_str, "cdp", PSR_CDP, &rc);
if ( val_str && !strcmp(s, "rmid_max") )
- opt_rmid_max = simple_strtoul(val_str, NULL, 0);
+ {
+ opt_rmid_max = simple_strtoul(val_str, &q, 0);
+ if ( *q )
+ rc = -EINVAL;
+ }
if ( val_str && !strcmp(s, "cos_max") )
- opt_cos_max = simple_strtoul(val_str, NULL, 0);
+ {
+ opt_cos_max = simple_strtoul(val_str, &q, 0);
+ if ( *q )
+ rc = -EINVAL;
+ }
s = ss + 1;
} while ( ss );
+
+ return rc;
}
custom_param("psr", parse_psr_param);
Modify the custom parameter parsing routines in: xen/arch/x86/psr.c to indicate whether the parameter value was parsed successfully. Cc: Jan Beulich <jbeulich@suse.com> Cc: Andrew Cooper <andrew.cooper3@citrix.com> Signed-off-by: Juergen Gross <jgross@suse.com> --- xen/arch/x86/psr.c | 28 +++++++++++++++++++++------- 1 file changed, 21 insertions(+), 7 deletions(-)