Re: git: 19f073c612af - main - new-bus: Add resource_validate_map_request function
Date: Thu, 23 Nov 2023 17:41:36 UTC
On 11/23/23 13:07, John Baldwin wrote:
> The branch main has been updated by jhb:
>
> URL: https://cgit.FreeBSD.org/src/commit/?id=19f073c612afa0111d216e5ccab9525bfc97ec32
>
> commit 19f073c612afa0111d216e5ccab9525bfc97ec32
> Author: John Baldwin <jhb@FreeBSD.org>
> AuthorDate: 2023-11-23 17:06:24 +0000
> Commit: John Baldwin <jhb@FreeBSD.org>
> CommitDate: 2023-11-23 17:06:24 +0000
>
> new-bus: Add resource_validate_map_request function
>
> This helper function for BUS_MAP_RESOURCE performs common argument
> validation.
>
> Reviewed by: imp
> Differential Revision: https://reviews.freebsd.org/D42723
> ---
> sys/kern/subr_bus.c | 31 +++++++++++++++++++++++++++++++
> sys/sys/bus.h | 6 +++++-
> 2 files changed, 36 insertions(+), 1 deletion(-)
>
> diff --git a/sys/kern/subr_bus.c b/sys/kern/subr_bus.c
> index 648394abd026..80fe182eab56 100644
> --- a/sys/kern/subr_bus.c
> +++ b/sys/kern/subr_bus.c
> @@ -2715,6 +2715,37 @@ resource_init_map_request_impl(struct resource_map_request *args, size_t sz)
> args->memattr = VM_MEMATTR_DEVICE;
> }
>
> +int
> +resource_validate_map_request(struct resource *r,
> + struct resource_map_request *in, struct resource_map_request *out,
> + rman_res_t *startp, rman_res_t *lengthp)
Can the function be given a top-level comment stating its purpose? This
file does a really good job providing this for the majority of its
public functions.
Sorry to ask post-commit, but I did not see the review.
Mitchell
> +{
> + rman_res_t end, length, start;
> +
> + /*
> + * This assumes that any callers of this function are compiled
> + * into the kernel and use the same version of the structure
> + * as this file.
> + */
> + MPASS(out->size == sizeof(struct resource_map_request));
> +
> + if (in != NULL)
> + bcopy(in, out, imin(in->size, out->size));
> + start = rman_get_start(r) + out->offset;
> + if (out->length == 0)
> + length = rman_get_size(r);
> + else
> + length = out->length;
> + end = start + length - 1;
> + if (start > rman_get_end(r) || start < rman_get_start(r))
> + return (EINVAL);
> + if (end > rman_get_end(r) || end < start)
> + return (EINVAL);
> + *lengthp = length;
> + *startp = start;
> + return (0);
> +}
> +
> /**
> * @brief Initialise a resource list.
> *
> diff --git a/sys/sys/bus.h b/sys/sys/bus.h
> index fc07cf70f78a..88ae4000004b 100644
> --- a/sys/sys/bus.h
> +++ b/sys/sys/bus.h
> @@ -317,6 +317,8 @@ struct driver {
> KOBJ_CLASS_FIELDS;
> };
>
> +struct resource;
> +
> /**
> * @brief A resource mapping.
> */
> @@ -341,12 +343,14 @@ void resource_init_map_request_impl(struct resource_map_request *_args,
> size_t _sz);
> #define resource_init_map_request(rmr) \
> resource_init_map_request_impl((rmr), sizeof(*(rmr)))
> +int resource_validate_map_request(struct resource *r,
> + struct resource_map_request *in, struct resource_map_request *out,
> + rman_res_t *startp, rman_res_t *lengthp);
>
> /*
> * Definitions for drivers which need to keep simple lists of resources
> * for their child devices.
> */
> -struct resource;
>
> /**
> * @brief An entry for a single resource in a resource list.