[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [PATCH] xen/dt: Rework the prototype of dt_property_read_string() to help Eclair
From: Julien Grall <jgrall@xxxxxxxxxx> Eclair vXXX is unable to prove the parameter out_string will only be used the return of dt_property_read_string() is 0. So it will consider that MISRA C:2012 Rule 9.1 was violated. Rework the prototype so the string is returned and use ERR_PTR() to embed the error code. Signed-off-by: Julien Grall <jgrall@xxxxxxxxxx> --- The XXX should be replaced with the version of Eclair. Nicola, can you provide it? --- xen/arch/arm/domain_build.c | 4 +++- xen/arch/arm/psci.c | 10 +++++----- xen/common/device_tree.c | 15 +++++++-------- xen/drivers/char/arm-uart.c | 10 ++++++---- xen/include/xen/device_tree.h | 16 ++++++++-------- 5 files changed, 29 insertions(+), 26 deletions(-) diff --git a/xen/arch/arm/domain_build.c b/xen/arch/arm/domain_build.c index 39b4ee03a505..2f98f0b1bd9c 100644 --- a/xen/arch/arm/domain_build.c +++ b/xen/arch/arm/domain_build.c @@ -3850,7 +3850,9 @@ static int __init construct_domU(struct domain *d, kinfo.vpl011 = dt_property_read_bool(node, "vpl011"); - rc = dt_property_read_string(node, "xen,enhanced", &dom0less_enhanced); + dom0less_enhanced = dt_property_read_string(node, "xen,enhanced"); + + rc = IS_ERR(dom0less_enhanced) ? PTR_ERR(dom0less_enhanced) : 0; if ( rc == -EILSEQ || rc == -ENODATA || (rc == 0 && !strcmp(dom0less_enhanced, "enabled")) ) diff --git a/xen/arch/arm/psci.c b/xen/arch/arm/psci.c index 695d2fa1f1b5..8e01b5962c63 100644 --- a/xen/arch/arm/psci.c +++ b/xen/arch/arm/psci.c @@ -8,7 +8,7 @@ * Copyright (c) 2013 Linaro Limited. */ - +#include <xen/err.h> #include <xen/types.h> #include <xen/init.h> #include <xen/mm.h> @@ -85,13 +85,13 @@ static int __init psci_features(uint32_t psci_func_id) static int __init psci_is_smc_method(const struct dt_device_node *psci) { - int ret; const char *prop_str; - ret = dt_property_read_string(psci, "method", &prop_str); - if ( ret ) + prop_str = dt_property_read_string(psci, "method"); + if ( IS_ERR(prop_str) ) { - printk("/psci node does not provide a method (%d)\n", ret); + printk("/psci node does not provide a method (%ld)\n", + PTR_ERR(prop_str)); return -EINVAL; } diff --git a/xen/common/device_tree.c b/xen/common/device_tree.c index 0677193ab370..11222c3a8abf 100644 --- a/xen/common/device_tree.c +++ b/xen/common/device_tree.c @@ -191,21 +191,20 @@ bool_t dt_property_read_u64(const struct dt_device_node *np, return 1; } -int dt_property_read_string(const struct dt_device_node *np, - const char *propname, const char **out_string) + +const char *dt_property_read_string(const struct dt_device_node *np, + const char *propname) { const struct dt_property *pp = dt_find_property(np, propname, NULL); if ( !pp ) - return -EINVAL; + return ERR_PTR(-EINVAL); if ( !pp->length ) - return -ENODATA; + return ERR_PTR(-ENODATA); if ( strnlen(pp->value, pp->length) >= pp->length ) - return -EILSEQ; - - *out_string = pp->value; + return ERR_PTR(-EILSEQ); - return 0; + return pp->value; } /** diff --git a/xen/drivers/char/arm-uart.c b/xen/drivers/char/arm-uart.c index 8098a968c285..b76d8063beee 100644 --- a/xen/drivers/char/arm-uart.c +++ b/xen/drivers/char/arm-uart.c @@ -21,6 +21,7 @@ #include <xen/console.h> #include <xen/device_tree.h> +#include <xen/err.h> #include <xen/param.h> #include <xen/serial.h> #include <xen/errno.h> @@ -55,16 +56,17 @@ static void __init dt_uart_init(void) { const char *stdout; - ret = dt_property_read_string(chosen, "stdout-path", &stdout); - if ( ret >= 0 ) + stdout = dt_property_read_string(chosen, "stdout-path"); + if ( !IS_ERR(stdout) ) { printk("Taking dtuart configuration from /chosen/stdout-path\n"); if ( strlcpy(opt_dtuart, stdout, sizeof(opt_dtuart)) >= sizeof(opt_dtuart) ) printk("WARNING: /chosen/stdout-path too long, truncated\n"); } - else if ( ret != -EINVAL /* Not present */ ) - printk("Failed to read /chosen/stdout-path (%d)\n", ret); + else if ( PTR_ERR(stdout) != -EINVAL /* Not present */ ) + printk("Failed to read /chosen/stdout-path (%ld)\n", + PTR_ERR(stdout)); } } diff --git a/xen/include/xen/device_tree.h b/xen/include/xen/device_tree.h index c2eada748915..492204b4feda 100644 --- a/xen/include/xen/device_tree.h +++ b/xen/include/xen/device_tree.h @@ -486,18 +486,18 @@ static inline bool_t dt_property_read_bool(const struct dt_device_node *np, * if return value if 0. * * Search for a property in a device tree node and retrieve a null - * terminated string value (pointer to data, not a copy). Returns 0 on - * success, -EINVAL if the property does not exist, -ENODATA if property - * doest not have value, and -EILSEQ if the string is not - * null-terminated with the length of the property data. + * terminated string value (pointer to data, not a copy). Returns a + * pointer to a null terminated string on success, -EINVAL if the property + * does not exist, -ENODATA if property doest not have value, and -EILSEQ + * if the string is not null-terminated with the length of the property data. + * + * The caller should use IS_ERR(...) to check if an error is returned. * * Note that the empty string "" has length of 1, thus -ENODATA cannot * be interpreted as an empty string. - * - * The out_string pointer is modified only if a valid string can be decoded. */ -int dt_property_read_string(const struct dt_device_node *np, - const char *propname, const char **out_string); +const char *dt_property_read_string(const struct dt_device_node *np, + const char *propname); /** * dt_property_match_string() - Find string in a list and return index -- 2.40.1
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |