|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH 1/2] xen: add interface for obtaining .config from hypervisor
On Thu, Jan 17, 2019 at 03:57:21PM +0100, Juergen Gross wrote:
> Add a sysctl interface for obtaining the .config file used to build
> the hypervisor. The mechanism is inspired by the Linux kernel's one.
>
> Signed-off-by: Juergen Gross <jgross@xxxxxxxx>
> ---
> .gitignore | 2 ++
> tools/flask/policy/modules/dom0.te | 2 +-
> xen/common/Makefile | 7 +++++++
> xen/common/sysctl.c | 13 +++++++++++++
> xen/include/public/sysctl.h | 16 ++++++++++++++++
> xen/include/xen/kernel.h | 3 +++
> xen/tools/Makefile | 9 +++++++--
> xen/tools/bin2c.c | 28 ++++++++++++++++++++++++++++
> xen/xsm/flask/hooks.c | 3 +++
> xen/xsm/flask/policy/access_vectors | 2 ++
> 10 files changed, 82 insertions(+), 3 deletions(-)
> create mode 100644 xen/tools/bin2c.c
>
> diff --git a/.gitignore b/.gitignore
> index 26bc583f74..549b57020f 100644
> --- a/.gitignore
> +++ b/.gitignore
> @@ -309,6 +309,7 @@ xen/arch/*/efi/boot.c
> xen/arch/*/efi/compat.c
> xen/arch/*/efi/efi.h
> xen/arch/*/efi/runtime.c
> +xen/common/config_data.c
> xen/include/headers*.chk
> xen/include/asm
> xen/include/asm-*/asm-offsets.h
> @@ -328,6 +329,7 @@ xen/test/livepatch/xen_nop.livepatch
> xen/test/livepatch/xen_replace_world.livepatch
> xen/tools/kconfig/.tmp_gtkcheck
> xen/tools/kconfig/.tmp_qtcheck
> +xen/tools/bin2c
Move this ahead before kconfig?
> xen/tools/symbols
> xen/xsm/flask/include/av_perm_to_string.h
> xen/xsm/flask/include/av_permissions.h
> diff --git a/tools/flask/policy/modules/dom0.te
> b/tools/flask/policy/modules/dom0.te
> index a347d664f8..b776e9f307 100644
> --- a/tools/flask/policy/modules/dom0.te
> +++ b/tools/flask/policy/modules/dom0.te
> @@ -16,7 +16,7 @@ allow dom0_t xen_t:xen {
> allow dom0_t xen_t:xen2 {
> resource_op psr_cmt_op psr_alloc pmu_ctrl get_symbol
> get_cpu_levelling_caps get_cpu_featureset livepatch_op
> - coverage_op set_parameter
> + coverage_op set_parameter get_config
> };
>
> # Allow dom0 to use all XENVER_ subops that have checks.
> diff --git a/xen/common/Makefile b/xen/common/Makefile
> index 56fc201b6b..b375a49ed7 100644
> --- a/xen/common/Makefile
> +++ b/xen/common/Makefile
> @@ -1,5 +1,6 @@
> obj-y += bitmap.o
> obj-y += bsearch.o
> +obj-y += config_data.o
> obj-$(CONFIG_CORE_PARKING) += core_parking.o
> obj-y += cpu.o
> obj-y += cpupool.o
> @@ -83,3 +84,9 @@ subdir-$(CONFIG_UBSAN) += ubsan
>
> subdir-$(CONFIG_NEEDS_LIBELF) += libelf
> subdir-$(CONFIG_HAS_DEVICE_TREE) += libfdt
> +
> +config_data.c: ../.config
> + ( echo "const char xen_config_data[] ="; \
> + cat $< | gzip | ../tools/bin2c; \
> + echo ";"; \
> + echo "unsigned int xen_config_data_sz = sizeof(xen_config_data) - 1;"
> ) > $@
> diff --git a/xen/common/sysctl.c b/xen/common/sysctl.c
> index c0aa6bde4e..6b6608f67b 100644
> --- a/xen/common/sysctl.c
> +++ b/xen/common/sysctl.c
> @@ -13,6 +13,7 @@
> #include <xen/domain.h>
> #include <xen/event.h>
> #include <xen/domain_page.h>
> +#include <xen/kernel.h>
> #include <xen/tmem.h>
> #include <xen/trace.h>
> #include <xen/console.h>
> @@ -502,6 +503,18 @@ long do_sysctl(XEN_GUEST_HANDLE_PARAM(xen_sysctl_t)
> u_sysctl)
> break;
> }
>
> + case XEN_SYSCTL_get_config:
> + {
> + unsigned int size = min(op->u.get_config.size, xen_config_data_sz);
> +
> + if ( size &&
> + copy_to_guest(op->u.get_config.buffer, xen_config_data, size) )
> + ret = -EFAULT;
What's the point of copying when user supplied buffer is not big enough?
They can't continue from where they left off anyway.
> + op->u.get_config.size = xen_config_data_sz;
> +
> + break;
> + }
> +
> default:
> ret = arch_do_sysctl(op, u_sysctl);
> copyback = 0;
> diff --git a/xen/include/public/sysctl.h b/xen/include/public/sysctl.h
> index c49b4dcc99..fb5d93a242 100644
> --- a/xen/include/public/sysctl.h
> +++ b/xen/include/public/sysctl.h
> @@ -1100,6 +1100,20 @@ typedef struct xen_sysctl_cpu_policy
> xen_sysctl_cpu_policy_t;
> DEFINE_XEN_GUEST_HANDLE(xen_sysctl_cpu_policy_t);
> #endif
>
> +/*
> + * XEN_SYSCTL_get_config
> + *
> + * Return gzip-ed .config file
> + */
> +struct xen_sysctl_get_config {
> + XEN_GUEST_HANDLE_64(char) buffer; /* IN: pointer to buffer. */
> + uint32_t size; /* IN: size of buffer. */
> + /* OUT: size of config data. */
> + uint32_t pad; /* IN: MUST be zero. */
Please check pad is really zero in code.
Wei.
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |