[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Minios-devel] [UNIKRAFT PATCH v3 4/8] lib/uklibparam: Add support for passing array
This patch implements a way to pass array parameters to the library. The array parameters are delimited by a ' '. Signed-off-by: Sharan Santhanam <sharan.santhanam@xxxxxxxxx> Reviewed-by: Felipe Huici <felipe.huici@xxxxxxxxx> --- lib/uklibparam/include/uk/libparam.h | 20 +++++++++++++++ lib/uklibparam/param.c | 38 +++++++++++++++++++++++++++- 2 files changed, 57 insertions(+), 1 deletion(-) diff --git a/lib/uklibparam/include/uk/libparam.h b/lib/uklibparam/include/uk/libparam.h index 1022bf7e..2a271ed3 100644 --- a/lib/uklibparam/include/uk/libparam.h +++ b/lib/uklibparam/include/uk/libparam.h @@ -115,6 +115,14 @@ extern C { */ #define UK_LIB_PARAM_STR(name) +/** + * Declare an array of primitive. + * @param name + * The name of the parameter. + * @param type + * The type of the parameter. + */ +#define UK_LIB_PARAM_ARR(name, type) #else /* !CONFIG_LIBUKLIBPARAM */ /** @@ -413,6 +421,18 @@ void _uk_libparam_lib_add(struct uk_lib_section *lib_sec); name)); \ _LIB_UK_PARAM_SET(name, type, 1) +/** + * Declare an array of primitive. + * @param name + * The name of the parameter. + * @param type + * The type of the parameter. + */ +#define UK_LIB_PARAM_ARR(name, type) \ + _LIB_PARAM_NAME_SET(name, _LIB_PARAM_STRING(UK_LIBPARAM_PREFIX, \ + name)); \ + _LIB_UK_PARAM_SET(name, type, sizeof(name)/sizeof(type)) \ + /** * Declare a string library param. * @param name diff --git a/lib/uklibparam/param.c b/lib/uklibparam/param.c index 666820dd..c0c65782 100644 --- a/lib/uklibparam/param.c +++ b/lib/uklibparam/param.c @@ -42,6 +42,7 @@ #include <uk/libparam.h> #include <uk/version.h> +#define ARRAY_SEP ' ' #define LIB_ARG_SEP "--" #define NUMBER_SET(fn, type, value, addr, max, min, errcode, result_type, fmt)\ do { \ @@ -381,6 +382,8 @@ static int kernel_args_set(struct param_args *pargs, struct uk_param *param) { int rc = 0; + int i = 0; + char *start, *value; int sign = (param->param_type >> PARAM_SIGN_SHIFT) & PARAM_SIGN_MASK; int scopy = (param->param_type >> PARAM_SCOPY_SHIFT) & PARAM_SCOPY_MASK; int param_type = (param->param_type >> PARAM_SIZE_SHIFT) @@ -392,7 +395,40 @@ static int kernel_args_set(struct param_args *pargs, /* Reference the pointer instead of copying the value */ *((__uptr *)param->addr) = (__uptr) pargs->value; else { - if (param->param_size == 1) { + if (param->param_size > 1) { + /* Adding support for array */ + i = 0; + value = &pargs->value[i]; + uk_pr_debug("Value:%s length: %d\n", value, + pargs->value_len); + while (value && i < param->param_size) { + start = value; + value = strchr(value, ARRAY_SEP); + if (value) { + uk_pr_debug("Delimiter: %p\n", value); + *value = '\0'; + /* Search from the next index */ + value++; + } + uk_pr_debug("Array index: %d contains %s\n", + i, start); + rc = kernel_arg_set((void *)(param->addr + + (i * param_type)), + start, param_type, sign); + if (rc < 0) + break; + i++; + } + if (rc < 0) + uk_pr_err("Failed to read element at index: %d\n", + i); + else if (value && i == param->param_size) + uk_pr_warn("Overflow detected! Max array size:%d\n", + param->param_size); + else + uk_pr_debug("Converted value: %s into an array containing %d elements\n", + pargs->value, i); + } else if (param->param_size == 1) { rc = kernel_arg_set((void *)param->addr, pargs->value, param_type, sign); } else { -- 2.20.1 _______________________________________________ Minios-devel mailing list Minios-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/minios-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |