2017-03-21 17:14 GMT+01:00 Wei Liu : > On Tue, Mar 21, 2017 at 04:13:24PM +0000, Wei Liu wrote: > > On Mon, Mar 20, 2017 at 09:12:54AM +0100, Felix Schmoll wrote: > > [...] > > > From 7e50f50b2a1e95cbc813354d68c71315d4d1394b Mon Sep 17 00:00:00 2001 > > > From: Felix Schmoll > > > Date: Thu, 16 Mar 2017 07:11:00 +0100 > > > Subject: [PATCH 1/2] First idea on domain_id-hypercall implementation > > > > > > --- > > > xen/arch/x86/hypercall.c | 1 + > > > xen/common/kernel.c | 6 ++++++ > > > xen/include/public/xen.h | 1 + > > > xen/include/xen/hypercall.h | 5 +++++ > > > 4 files changed, 13 insertions(+) > > > > > > diff --git a/xen/arch/x86/hypercall.c b/xen/arch/x86/hypercall.c > > > index e30181817a..caf8565809 100644 > > > --- a/xen/arch/x86/hypercall.c > > > +++ b/xen/arch/x86/hypercall.c > > > @@ -69,6 +69,7 @@ const hypercall_args_t > > > hypercall_args_table[NR_hypercalls] = > > > ARGS(dm_op, 3), > > > ARGS(mca, 1), > > > ARGS(arch_1, 1), > > > + ARGS(domain_id, 2), > > > }; > > > > > > > I know now. > > > > You did add your hypercall to pv/hypercall.c and hvm/hypercall.c. > > "didn't" > I also noticed that, but it still doesn't work. Here is what I last tried (I removed the unused arguments and made it a little simpler), relative to "staging": diff --git a/tools/libxc/include/xenctrl.h b/tools/libxc/include/xenctrl.h index 2d97d36c38..1e152c8a07 100644 --- a/tools/libxc/include/xenctrl.h +++ b/tools/libxc/include/xenctrl.h @@ -1569,6 +1569,7 @@ int xc_domctl(xc_interface *xch, struct xen_domctl *domctl); int xc_sysctl(xc_interface *xch, struct xen_sysctl *sysctl); int xc_version(xc_interface *xch, int cmd, void *arg); +int xc_domid(xc_interface *xch); int xc_flask_op(xc_interface *xch, xen_flask_op_t *op); diff --git a/tools/libxc/xc_private.c b/tools/libxc/xc_private.c index 72e6242417..37b11e41a9 100644 --- a/tools/libxc/xc_private.c +++ b/tools/libxc/xc_private.c @@ -530,6 +530,12 @@ int xc_version(xc_interface *xch, int cmd, void *arg) return rc; } +int xc_domid(xc_interface *xch) +{ + return xencall0(xch->xcall, __HYPERVISOR_domain_id); +} + + unsigned long xc_make_page_below_4G( xc_interface *xch, uint32_t domid, unsigned long mfn) { diff --git a/xen/arch/arm/traps.c b/xen/arch/arm/traps.c index 614501f761..eddb264f2d 100644 --- a/xen/arch/arm/traps.c +++ b/xen/arch/arm/traps.c @@ -1297,6 +1297,7 @@ static arm_hypercall_t arm_hypercall_table[] = { HYPERCALL(platform_op, 1), HYPERCALL_ARM(vcpu_op, 3), HYPERCALL(vm_assist, 2), + HYPERCALL(domain_id, 0), }; #ifndef NDEBUG diff --git a/xen/arch/x86/hvm/hypercall.c b/xen/arch/x86/hvm/hypercall.c index e7238ce293..7677520290 100644 --- a/xen/arch/x86/hvm/hypercall.c +++ b/xen/arch/x86/hvm/hypercall.c @@ -125,6 +125,7 @@ static const hypercall_table_t hvm_hypercall_table[] = { HYPERCALL(hvm_op), HYPERCALL(sysctl), HYPERCALL(domctl), + HYPERCALL(domain_id), #ifdef CONFIG_TMEM HYPERCALL(tmem_op), #endif diff --git a/xen/arch/x86/hypercall.c b/xen/arch/x86/hypercall.c index e30181817a..b68d0aef40 100644 --- a/xen/arch/x86/hypercall.c +++ b/xen/arch/x86/hypercall.c @@ -45,6 +45,7 @@ const hypercall_args_t hypercall_args_table[NR_hypercalls] = COMP(set_timer_op, 1, 2), ARGS(event_channel_op_compat, 1), ARGS(xen_version, 2), + ARGS(domain_id, 0), ARGS(console_io, 3), ARGS(physdev_op_compat, 1), ARGS(grant_table_op, 3), diff --git a/xen/arch/x86/pv/hypercall.c b/xen/arch/x86/pv/hypercall.c index 9d29d2f088..1e67eb3312 100644 --- a/xen/arch/x86/pv/hypercall.c +++ b/xen/arch/x86/pv/hypercall.c @@ -50,6 +50,7 @@ static const hypercall_table_t pv_hypercall_table[] = { COMPAT_CALL(set_timer_op), HYPERCALL(event_channel_op_compat), COMPAT_CALL(xen_version), + HYPERCALL(domain_id), HYPERCALL(console_io), COMPAT_CALL(physdev_op_compat), COMPAT_CALL(grant_table_op), diff --git a/xen/common/kernel.c b/xen/common/kernel.c index 84618715dc..5107aacd06 100644 --- a/xen/common/kernel.c +++ b/xen/common/kernel.c @@ -431,6 +431,12 @@ DO(xen_version)(int cmd, XEN_GUEST_HANDLE_PARAM(void) arg) return -ENOSYS; } +DO(domain_id)(void) +{ + struct domain *d = current->domain; + return d->domain_id; +} + DO(nmi_op)(unsigned int cmd, XEN_GUEST_HANDLE_PARAM(void) arg) { struct xennmi_callback cb; diff --git a/xen/include/public/xen.h b/xen/include/public/xen.h index 91ba8bb48e..4ad62aa01b 100644 --- a/xen/include/public/xen.h +++ b/xen/include/public/xen.h @@ -121,6 +121,7 @@ DEFINE_XEN_GUEST_HANDLE(xen_ulong_t); #define __HYPERVISOR_xc_reserved_op 39 /* reserved for XenClient */ #define __HYPERVISOR_xenpmu_op 40 #define __HYPERVISOR_dm_op 41 +#define __HYPERVISOR_domain_id 42 /* custom hypercall */ /* Architecture-specific hypercall definitions. */ #define __HYPERVISOR_arch_0 48 diff --git a/xen/include/xen/hypercall.h b/xen/include/xen/hypercall.h index cc99aea57d..5c7bc6233e 100644 --- a/xen/include/xen/hypercall.h +++ b/xen/include/xen/hypercall.h @@ -83,6 +83,9 @@ do_xen_version( XEN_GUEST_HANDLE_PARAM(void) arg); extern long +do_domain_id(void); + +extern long do_console_io( int cmd, int count, Here is also the patch for the second subtask: diff --git a/xen/Rules.mk b/xen/Rules.mk index 77bcd44922..254cc4381e 100644 --- a/xen/Rules.mk +++ b/xen/Rules.mk @@ -46,6 +46,7 @@ else CFLAGS += -O2 -fomit-frame-pointer endif +CFLAGS += -fsanitize-coverage=trace-pc CFLAGS += -nostdinc -fno-builtin -fno-common CFLAGS += -Werror -Wredundant-decls -Wno-pointer-arith CFLAGS += -pipe -g -D__XEN__ -include $(BASEDIR)/include/xen/config.h diff --git a/xen/common/kernel.c b/xen/common/kernel.c index 84618715dc..77b22effb3 100644 --- a/xen/common/kernel.c +++ b/xen/common/kernel.c @@ -238,6 +238,8 @@ void __init do_initcalls(void) # define DO(fn) long do_##fn +void __sanitizer_cov_trace_pc(void) { return; } + #endif /* diff --git a/xen/include/xen/hypercall.h b/xen/include/xen/hypercall.h index cc99aea57d..12517b5e90 100644 --- a/xen/include/xen/hypercall.h +++ b/xen/include/xen/hypercall.h @@ -19,6 +19,8 @@ #include #include +extern void __sanitizer_cov_trace_pc(void); + extern long do_sched_op( int cmd, I wasn't sure if to modify Config.mk or Rules.mk for the CFLAGS variable, so I went with the latter since it was in the subfolder. Felix