 
	
| [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 17/01/2019 16:12, Wei Liu wrote:
> 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?
Sorry, of course!
> 
>>  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.
Hmm, true. Will change.
> 
>> +        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.
Yes.
Juergen
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/xen-devel
 
 | 
|  | Lists.xenproject.org is hosted with RackSpace, monitoring our |