Add the needed infrastructure for runtime parameter changing similar to that used at boot time via cmdline. We are using the same parsing functions as for cmdline parsing, but with a different array of parameter definitions.
Cc: Andrew Cooper <andrew.coop...@citrix.com> Cc: George Dunlap <george.dun...@eu.citrix.com> Cc: Ian Jackson <ian.jack...@eu.citrix.com> Cc: Jan Beulich <jbeul...@suse.com> Cc: Konrad Rzeszutek Wilk <konrad.w...@oracle.com> Cc: Stefano Stabellini <sstabell...@kernel.org> Cc: Tim Deegan <t...@xen.org> Cc: Wei Liu <wei.l...@citrix.com> Signed-off-by: Juergen Gross <jgr...@suse.com> --- V2: - added modification of ARM linker script (Wei Liu) V3: - moved runtime parameter array in linker scripts (Jan Beulich) - renamed macros to *_runtime_param() (Jan Beulich) - added *runtime_only_param() macros (Jan Beulich) - let *_runtime_param() macros include boot param functionality (Jan Beulich) --- xen/arch/arm/xen.lds.S | 4 ++++ xen/arch/x86/xen.lds.S | 4 ++++ xen/common/kernel.c | 5 +++++ xen/include/xen/init.h | 57 ++++++++++++++++++++++++++++++++++++++++++++++++-- xen/include/xen/lib.h | 1 + 5 files changed, 69 insertions(+), 2 deletions(-) diff --git a/xen/arch/arm/xen.lds.S b/xen/arch/arm/xen.lds.S index 2d54f224ec..c9b9546435 100644 --- a/xen/arch/arm/xen.lds.S +++ b/xen/arch/arm/xen.lds.S @@ -61,6 +61,10 @@ SECTIONS *(.lockprofile.data) __lock_profile_end = .; #endif + . = ALIGN(POINTER_ALIGN); + __param_start = .; + *(.data.param) + __param_end = .; } :text #if defined(BUILD_ID) diff --git a/xen/arch/x86/xen.lds.S b/xen/arch/x86/xen.lds.S index ff08bbe42a..6a7bbb8ca1 100644 --- a/xen/arch/x86/xen.lds.S +++ b/xen/arch/x86/xen.lds.S @@ -120,6 +120,10 @@ SECTIONS *(.lockprofile.data) __lock_profile_end = .; #endif + . = ALIGN(POINTER_ALIGN); + __param_start = .; + *(.data.param) + __param_end = .; } :text #if defined(BUILD_ID) diff --git a/xen/common/kernel.c b/xen/common/kernel.c index 1b66ad4e55..2ab8ed496d 100644 --- a/xen/common/kernel.c +++ b/xen/common/kernel.c @@ -188,6 +188,11 @@ static void __init _cmdline_parse(const char *cmdline) parse_params(cmdline, __setup_start, __setup_end); } +int runtime_parse(const char *line) +{ + return parse_params(line, __param_start, __param_end); +} + /** * cmdline_parse -- parses the xen command line. * If CONFIG_CMDLINE is set, it would be parsed prior to @cmdline. diff --git a/xen/include/xen/init.h b/xen/include/xen/init.h index 234ec25aae..db06c76fdf 100644 --- a/xen/include/xen/init.h +++ b/xen/include/xen/init.h @@ -90,11 +90,16 @@ struct kernel_param { }; extern const struct kernel_param __setup_start[], __setup_end[]; +extern const struct kernel_param __param_start[], __param_end[]; + +#define __dataparam __used_section(".data.param") + +#define __param(att) static const att \ + __attribute__((__aligned__(sizeof(void *)))) struct kernel_param #define __setup_str static const __initconst \ __attribute__((__aligned__(1))) char -#define __kparam static const __initsetup \ - __attribute__((__aligned__(sizeof(void *)))) struct kernel_param +#define __kparam __param(__initsetup) #define custom_param(_name, _var) \ __setup_str __setup_str_##_var[] = _name; \ @@ -131,6 +136,54 @@ extern const struct kernel_param __setup_start[], __setup_end[]; .len = sizeof(_var), \ .par.var = &_var } +#define __rtparam __param(__dataparam) + +#define custom_runtime_only_param(_name, _var) \ + __rtparam __rtpar_##_var = \ + { .name = _name, \ + .type = OPT_CUSTOM, \ + .par.func = _var } +#define boolean_runtime_only_param(_name, _var) \ + __rtparam __rtpar_##_var = \ + { .name = _name, \ + .type = OPT_BOOL, \ + .len = sizeof(_var), \ + .par.var = &_var } +#define integer_runtime_only_param(_name, _var) \ + __rtparam __rtpar_##_var = \ + { .name = _name, \ + .type = OPT_UINT, \ + .len = sizeof(_var), \ + .par.var = &_var } +#define size_runtime_only_param(_name, _var) \ + __rtparam __rtpar_##_var = \ + { .name = _name, \ + .type = OPT_SIZE, \ + .len = sizeof(_var), \ + .par.var = &_var } +#define string_runtime_only_param(_name, _var) \ + __rtparam __rtpar_##_var = \ + { .name = _name, \ + .type = OPT_STR, \ + .len = sizeof(_var), \ + .par.var = &_var } + +#define custom_runtime_param(_name, _var) \ + custom_param(_name, _var); \ + custom_runtime_only_param(_name, _var) +#define boolean_runtime_param(_name, _var) \ + boolean_param(_name, _var); \ + boolean_runtime_only_param(_name, _var) +#define integer_runtime_param(_name, _var) \ + integer_param(_name, _var); \ + integer_runtime_only_param(_name, _var) +#define size_runtime_param(_name, _var) \ + size_param(_name, _var); \ + size_runtime_only_param(_name, _var) +#define string_runtime_param(_name, _var) \ + string_param(_name, _var); \ + string_runtime_only_param(_name, _var) + #endif /* __ASSEMBLY__ */ #ifdef CONFIG_LATE_HWDOM diff --git a/xen/include/xen/lib.h b/xen/include/xen/lib.h index 995a85a7db..5651498de2 100644 --- a/xen/include/xen/lib.h +++ b/xen/include/xen/lib.h @@ -71,6 +71,7 @@ struct domain; void cmdline_parse(const char *cmdline); +int runtime_parse(const char *line); int parse_bool(const char *s); /*#define DEBUG_TRACE_DUMP*/ -- 2.12.3 _______________________________________________ Xen-devel mailing list Xen-devel@lists.xen.org https://lists.xen.org/xen-devel