|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH] xen/dt: Rework the prototype of dt_property_read_string() to help Eclair
On Mon, 24 Jul 2023, Julien Grall wrote:
> 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>
I'll let you sort out the best commit message. For the code changes:
Reviewed-by: Stefano Stabellini <sstabellini@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 |