xen: build infrastructure for generating hypercall depending symbols
authorJuergen Gross <jgross@suse.com>
Wed, 21 Jan 2015 07:49:22 +0000 (08:49 +0100)
committerDavid Vrabel <david.vrabel@citrix.com>
Mon, 16 Mar 2015 14:49:13 +0000 (14:49 +0000)
Today there are several places in the kernel which build tables
containing one entry for each possible Xen hypercall. Create an
infrastructure to be able to generate these tables at build time.

Based-on-patch-by: Jan Beulich <jbeulich@suse.com>
Signed-off-by: Juergen Gross <jgross@suse.com>
Reviewed-by: David Vrabel <david.vrabel@citrix.com>
Acked-by: Ingo Molnar <mingo@kernel.org>
Signed-off-by: David Vrabel <david.vrabel@citrix.com>
arch/x86/syscalls/Makefile
scripts/xen-hypercalls.sh [new file with mode: 0644]

index 3323c274524835a2191295338ecc790aba2ec674..a55abb9f6c5e2b944d1e4c4b1e2460bd7990654d 100644 (file)
@@ -19,6 +19,9 @@ quiet_cmd_syshdr = SYSHDR  $@
 quiet_cmd_systbl = SYSTBL  $@
       cmd_systbl = $(CONFIG_SHELL) '$(systbl)' $< $@
 
+quiet_cmd_hypercalls = HYPERCALLS $@
+      cmd_hypercalls = $(CONFIG_SHELL) '$<' $@ $(filter-out $<,$^)
+
 syshdr_abi_unistd_32 := i386
 $(uapi)/unistd_32.h: $(syscall32) $(syshdr)
        $(call if_changed,syshdr)
@@ -47,10 +50,16 @@ $(out)/syscalls_32.h: $(syscall32) $(systbl)
 $(out)/syscalls_64.h: $(syscall64) $(systbl)
        $(call if_changed,systbl)
 
+$(out)/xen-hypercalls.h: $(srctree)/scripts/xen-hypercalls.sh
+       $(call if_changed,hypercalls)
+
+$(out)/xen-hypercalls.h: $(srctree)/include/xen/interface/xen*.h
+
 uapisyshdr-y                   += unistd_32.h unistd_64.h unistd_x32.h
 syshdr-y                       += syscalls_32.h
 syshdr-$(CONFIG_X86_64)                += unistd_32_ia32.h unistd_64_x32.h
 syshdr-$(CONFIG_X86_64)                += syscalls_64.h
+syshdr-$(CONFIG_XEN)           += xen-hypercalls.h
 
 targets        += $(uapisyshdr-y) $(syshdr-y)
 
diff --git a/scripts/xen-hypercalls.sh b/scripts/xen-hypercalls.sh
new file mode 100644 (file)
index 0000000..676d922
--- /dev/null
@@ -0,0 +1,12 @@
+#!/bin/sh
+out="$1"
+shift
+in="$@"
+
+for i in $in; do
+       eval $CPP $LINUXINCLUDE -dD -imacros "$i" -x c /dev/null
+done | \
+awk '$1 == "#define" && $2 ~ /__HYPERVISOR_[a-z][a-z_0-9]*/ { v[$3] = $2 }
+       END {   print "/* auto-generated by scripts/xen-hypercall.sh */"
+               for (i in v) if (!(v[i] in v))
+                       print "HYPERCALL("substr(v[i], 14)")"}' | sort -u >$out