]> xenbits.xensource.com Git - xentesttools/bootstrap.git/commitdiff
ipi_hog: Add an IPI test-case - where each IPI routine compresses/decompresses
authorKonrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Fri, 8 Jan 2016 14:47:51 +0000 (09:47 -0500)
committerKonrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Fri, 8 Jan 2016 14:51:31 +0000 (09:51 -0500)
in a loop. This should be a good test-case for CPU intensive workload.

Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
linux.config
root_image/drivers/Makefile
root_image/drivers/ipi_hog/Makefile [new file with mode: 0644]
root_image/drivers/ipi_hog/ipi_hog.c [new file with mode: 0644]

index f6f7b4c201b375f87f48d82806d6a90d1c580b72..4ac661a491ad32192715932d7cf660855153076b 100644 (file)
@@ -925,3 +925,12 @@ CONFIG_X86_X2APIC=y
 # CONFIG_CTF is not set
 # CONFIG_DTRACE is not set
 
+
+# For ipi_hog test-case
+CONFIG_DECOMPRESS_LZO=y
+CONFIG_DECOMPRESS_LZ4=y
+
+CONFIG_CRYPTO_LZ4=y
+CONFIG_LZ4_COMPRESS=y
+CONFIG_LZO_COMPRESS=y
+
index 45d68e16290d82dc62a1f72e41a4140bccb31f2b..d4973d1a9b740f3d113ecd2690cb8951162f2518 100644 (file)
@@ -2,6 +2,7 @@ obj-m += dma_test/
 obj-m += wb_to_wc/
 obj-m += xen_diag/
 obj-m += spinlock_hog/
+obj-m += ipi_hog/
 obj-m += tmem_test/
 
 .PHONY:        distclean
diff --git a/root_image/drivers/ipi_hog/Makefile b/root_image/drivers/ipi_hog/Makefile
new file mode 100644 (file)
index 0000000..8f38345
--- /dev/null
@@ -0,0 +1,37 @@
+# Comment/uncomment the following line to disable/enable debugging
+#DEBUG = y
+
+# Add your debugging flag (or not) to CFLAGS
+ifeq ($(DEBUG),y)
+  DEBFLAGS = -O -g # "-O" is needed to expand inlines
+else
+  DEBFLAGS = -O2
+endif
+
+EXTRA_CFLAGS += $(DEBFLAGS) -I$(LDDINCDIR)
+
+ifneq ($(KERNELRELEASE),)
+# call from kernel build system
+
+obj-m  := ipi_hog.o
+
+else
+
+KERNELDIR ?= /lib/modules/$(shell uname -r)/build
+PWD       := $(shell pwd)
+
+default:
+       $(MAKE) -C $(KERNELDIR) M=$(PWD) LDDINCDIR=$(PWD)/../include modules
+
+endif
+
+clean:
+       rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions
+
+depend .depend dep:
+       $(CC) $(CFLAGS) -M *.c > .depend
+
+
+ifeq (.depend,$(wildcard .depend))
+include .depend
+endif
diff --git a/root_image/drivers/ipi_hog/ipi_hog.c b/root_image/drivers/ipi_hog/ipi_hog.c
new file mode 100644 (file)
index 0000000..6dcc4f3
--- /dev/null
@@ -0,0 +1,507 @@
+#include <linux/module.h>
+#include <linux/init.h>
+#include <asm/tsc.h>
+#include <linux/pagemap.h>
+#include <linux/slab.h>
+#include <xen/xen.h>
+#include <linux/lz4.h>
+#include <asm/xen/hypercall.h>
+
+MODULE_AUTHOR("Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>");
+MODULE_DESCRIPTION("ipi");
+MODULE_LICENSE("GPL");
+MODULE_VERSION("0.1");
+unsigned long loops = 500000;
+
+
+module_param(loops, ulong, 0644);
+MODULE_PARM_DESC(loops, "How many loops (default is 500000)");
+
+
+unsigned char magna_carta[] = {
+  0xef, 0xbb, 0xbf, 0x4a, 0x4f, 0x48, 0x4e, 0x2c, 0x20, 0x62, 0x79, 0x20,
+  0x74, 0x68, 0x65, 0x20, 0x67, 0x72, 0x61, 0x63, 0x65, 0x20, 0x6f, 0x66,
+  0x20, 0x47, 0x6f, 0x64, 0x20, 0x4b, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x66,
+  0x20, 0x45, 0x6e, 0x67, 0x6c, 0x61, 0x6e, 0x64, 0x2c, 0x20, 0x4c, 0x6f,
+  0x72, 0x64, 0x20, 0x6f, 0x66, 0x20, 0x49, 0x72, 0x65, 0x6c, 0x61, 0x6e,
+  0x64, 0x2c, 0x20, 0x44, 0x75, 0x6b, 0x65, 0x20, 0x6f, 0x66, 0x0d, 0x0a,
+  0x4e, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x64, 0x79, 0x20, 0x61, 0x6e, 0x64,
+  0x20, 0x41, 0x71, 0x75, 0x69, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x2c, 0x20,
+  0x61, 0x6e, 0x64, 0x20, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x6f, 0x66,
+  0x20, 0x41, 0x6e, 0x6a, 0x6f, 0x75, 0x2c, 0x20, 0x74, 0x6f, 0x20, 0x68,
+  0x69, 0x73, 0x20, 0x61, 0x72, 0x63, 0x68, 0x62, 0x69, 0x73, 0x68, 0x6f,
+  0x70, 0x73, 0x2c, 0x0d, 0x0a, 0x62, 0x69, 0x73, 0x68, 0x6f, 0x70, 0x73,
+  0x2c, 0x20, 0x61, 0x62, 0x62, 0x6f, 0x74, 0x73, 0x2c, 0x20, 0x65, 0x61,
+  0x72, 0x6c, 0x73, 0x2c, 0x20, 0x62, 0x61, 0x72, 0x6f, 0x6e, 0x73, 0x2c,
+  0x20, 0x6a, 0x75, 0x73, 0x74, 0x69, 0x63, 0x65, 0x73, 0x2c, 0x20, 0x66,
+  0x6f, 0x72, 0x65, 0x73, 0x74, 0x65, 0x72, 0x73, 0x2c, 0x20, 0x73, 0x68,
+  0x65, 0x72, 0x69, 0x66, 0x66, 0x73, 0x2c, 0x0d, 0x0a, 0x73, 0x74, 0x65,
+  0x77, 0x61, 0x72, 0x64, 0x73, 0x2c, 0x20, 0x73, 0x65, 0x72, 0x76, 0x61,
+  0x6e, 0x74, 0x73, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x74, 0x6f, 0x20,
+  0x61, 0x6c, 0x6c, 0x20, 0x68, 0x69, 0x73, 0x20, 0x6f, 0x66, 0x66, 0x69,
+  0x63, 0x69, 0x61, 0x6c, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6c, 0x6f,
+  0x79, 0x61, 0x6c, 0x20, 0x73, 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73,
+  0x2c, 0x0d, 0x0a, 0x47, 0x72, 0x65, 0x65, 0x74, 0x69, 0x6e, 0x67, 0x2e,
+  0x0d, 0x0a, 0x0d, 0x0a, 0x4b, 0x4e, 0x4f, 0x57, 0x20, 0x54, 0x48, 0x41,
+  0x54, 0x20, 0x42, 0x45, 0x46, 0x4f, 0x52, 0x45, 0x20, 0x47, 0x4f, 0x44,
+  0x2c, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x68, 0x65,
+  0x61, 0x6c, 0x74, 0x68, 0x20, 0x6f, 0x66, 0x20, 0x6f, 0x75, 0x72, 0x20,
+  0x73, 0x6f, 0x75, 0x6c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x74, 0x68, 0x6f,
+  0x73, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x6f, 0x75, 0x72, 0x0d, 0x0a, 0x61,
+  0x6e, 0x63, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x73, 0x20, 0x61, 0x6e, 0x64,
+  0x20, 0x68, 0x65, 0x69, 0x72, 0x73, 0x2c, 0x20, 0x74, 0x6f, 0x20, 0x74,
+  0x68, 0x65, 0x20, 0x68, 0x6f, 0x6e, 0x6f, 0x75, 0x72, 0x20, 0x6f, 0x66,
+  0x20, 0x47, 0x6f, 0x64, 0x2c, 0x20, 0x74, 0x68, 0x65, 0x20, 0x65, 0x78,
+  0x61, 0x6c, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20,
+  0x74, 0x68, 0x65, 0x20, 0x68, 0x6f, 0x6c, 0x79, 0x0d, 0x0a, 0x43, 0x68,
+  0x75, 0x72, 0x63, 0x68, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x74, 0x68,
+  0x65, 0x20, 0x62, 0x65, 0x74, 0x74, 0x65, 0x72, 0x20, 0x6f, 0x72, 0x64,
+  0x65, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x66, 0x20, 0x6f, 0x75, 0x72,
+  0x20, 0x6b, 0x69, 0x6e, 0x67, 0x64, 0x6f, 0x6d, 0x2c, 0x20, 0x61, 0x74,
+  0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x64, 0x76, 0x69, 0x63, 0x65, 0x20,
+  0x6f, 0x66, 0x20, 0x6f, 0x75, 0x72, 0x0d, 0x0a, 0x72, 0x65, 0x76, 0x65,
+  0x72, 0x65, 0x6e, 0x64, 0x20, 0x66, 0x61, 0x74, 0x68, 0x65, 0x72, 0x73,
+  0x20, 0x53, 0x74, 0x65, 0x70, 0x68, 0x65, 0x6e, 0x2c, 0x20, 0x61, 0x72,
+  0x63, 0x68, 0x62, 0x69, 0x73, 0x68, 0x6f, 0x70, 0x20, 0x6f, 0x66, 0x20,
+  0x43, 0x61, 0x6e, 0x74, 0x65, 0x72, 0x62, 0x75, 0x72, 0x79, 0x2c, 0x20,
+  0x70, 0x72, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x61,
+  0x6c, 0x6c, 0x0d, 0x0a, 0x45, 0x6e, 0x67, 0x6c, 0x61, 0x6e, 0x64, 0x2c,
+  0x20, 0x61, 0x6e, 0x64, 0x20, 0x63, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x61,
+  0x6c, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x68, 0x6f, 0x6c,
+  0x79, 0x20, 0x52, 0x6f, 0x6d, 0x61, 0x6e, 0x20, 0x43, 0x68, 0x75, 0x72,
+  0x63, 0x68, 0x2c, 0x20, 0x48, 0x65, 0x6e, 0x72, 0x79, 0x20, 0x61, 0x72,
+  0x63, 0x68, 0x62, 0x69, 0x73, 0x68, 0x6f, 0x70, 0x20, 0x6f, 0x66, 0x0d,
+  0x0a, 0x44, 0x75, 0x62, 0x6c, 0x69, 0x6e, 0x2c, 0x20, 0x57, 0x69, 0x6c,
+  0x6c, 0x69, 0x61, 0x6d, 0x20, 0x62, 0x69, 0x73, 0x68, 0x6f, 0x70, 0x20,
+  0x6f, 0x66, 0x20, 0x4c, 0x6f, 0x6e, 0x64, 0x6f, 0x6e, 0x2c, 0x20, 0x50,
+  0x65, 0x74, 0x65, 0x72, 0x20, 0x62, 0x69, 0x73, 0x68, 0x6f, 0x70, 0x20,
+  0x6f, 0x66, 0x20, 0x57, 0x69, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x74, 0x65,
+  0x72, 0x2c, 0x20, 0x4a, 0x6f, 0x63, 0x65, 0x6c, 0x69, 0x6e, 0x0d, 0x0a,
+  0x62, 0x69, 0x73, 0x68, 0x6f, 0x70, 0x20, 0x6f, 0x66, 0x20, 0x42, 0x61,
+  0x74, 0x68, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x47, 0x6c, 0x61, 0x73, 0x74,
+  0x6f, 0x6e, 0x62, 0x75, 0x72, 0x79, 0x2c, 0x20, 0x48, 0x75, 0x67, 0x68,
+  0x20, 0x62, 0x69, 0x73, 0x68, 0x6f, 0x70, 0x20, 0x6f, 0x66, 0x20, 0x4c,
+  0x69, 0x6e, 0x63, 0x6f, 0x6c, 0x6e, 0x2c, 0x20, 0x57, 0x61, 0x6c, 0x74,
+  0x65, 0x72, 0x20, 0x42, 0x69, 0x73, 0x68, 0x6f, 0x70, 0x0d, 0x0a, 0x6f,
+  0x66, 0x20, 0x57, 0x6f, 0x72, 0x63, 0x65, 0x73, 0x74, 0x65, 0x72, 0x2c,
+  0x20, 0x57, 0x69, 0x6c, 0x6c, 0x69, 0x61, 0x6d, 0x20, 0x62, 0x69, 0x73,
+  0x68, 0x6f, 0x70, 0x20, 0x6f, 0x66, 0x20, 0x43, 0x6f, 0x76, 0x65, 0x6e,
+  0x74, 0x72, 0x79, 0x2c, 0x20, 0x42, 0x65, 0x6e, 0x65, 0x64, 0x69, 0x63,
+  0x74, 0x20, 0x62, 0x69, 0x73, 0x68, 0x6f, 0x70, 0x20, 0x6f, 0x66, 0x0d,
+  0x0a, 0x52, 0x6f, 0x63, 0x68, 0x65, 0x73, 0x74, 0x65, 0x72, 0x2c, 0x20,
+  0x4d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x20, 0x50, 0x61, 0x6e, 0x64, 0x75,
+  0x6c, 0x66, 0x20, 0x73, 0x75, 0x62, 0x64, 0x65, 0x61, 0x63, 0x6f, 0x6e,
+  0x20, 0x61, 0x6e, 0x64, 0x20, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x20,
+  0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x61, 0x70, 0x61, 0x6c,
+  0x20, 0x68, 0x6f, 0x75, 0x73, 0x65, 0x68, 0x6f, 0x6c, 0x64, 0x2c, 0x0d,
+  0x0a, 0x42, 0x72, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x20, 0x41, 0x79, 0x6d,
+  0x65, 0x72, 0x69, 0x63, 0x20, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x20,
+  0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6b, 0x6e, 0x69, 0x67, 0x68,
+  0x74, 0x68, 0x6f, 0x6f, 0x64, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65,
+  0x20, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x45,
+  0x6e, 0x67, 0x6c, 0x61, 0x6e, 0x64, 0x2c, 0x0d, 0x0a, 0x57, 0x69, 0x6c,
+  0x6c, 0x69, 0x61, 0x6d, 0x20, 0x4d, 0x61, 0x72, 0x73, 0x68, 0x61, 0x6c,
+  0x20, 0x65, 0x61, 0x72, 0x6c, 0x20, 0x6f, 0x66, 0x20, 0x50, 0x65, 0x6d,
+  0x62, 0x72, 0x6f, 0x6b, 0x65, 0x2c, 0x20, 0x57, 0x69, 0x6c, 0x6c, 0x69,
+  0x61, 0x6d, 0x20, 0x65, 0x61, 0x72, 0x6c, 0x20, 0x6f, 0x66, 0x20, 0x53,
+  0x61, 0x6c, 0x69, 0x73, 0x62, 0x75, 0x72, 0x79, 0x2c, 0x20, 0x57, 0x69,
+  0x6c, 0x6c, 0x69, 0x61, 0x6d, 0x0d, 0x0a, 0x65, 0x61, 0x72, 0x6c, 0x20,
+  0x6f, 0x66, 0x20, 0x57, 0x61, 0x72, 0x72, 0x65, 0x6e, 0x2c, 0x20, 0x57,
+  0x69, 0x6c, 0x6c, 0x69, 0x61, 0x6d, 0x20, 0x65, 0x61, 0x72, 0x6c, 0x20,
+  0x6f, 0x66, 0x20, 0x41, 0x72, 0x75, 0x6e, 0x64, 0x65, 0x6c, 0x2c, 0x20,
+  0x41, 0x6c, 0x61, 0x6e, 0x20, 0x64, 0x65, 0x20, 0x47, 0x61, 0x6c, 0x6c,
+  0x6f, 0x77, 0x61, 0x79, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x62,
+  0x6c, 0x65, 0x20, 0x6f, 0x66, 0x0d, 0x0a, 0x53, 0x63, 0x6f, 0x74, 0x6c,
+  0x61, 0x6e, 0x64, 0x2c, 0x20, 0x57, 0x61, 0x72, 0x69, 0x6e, 0x20, 0x46,
+  0x69, 0x74, 0x7a, 0x20, 0x47, 0x65, 0x72, 0x61, 0x6c, 0x64, 0x2c, 0x20,
+  0x50, 0x65, 0x74, 0x65, 0x72, 0x20, 0x46, 0x69, 0x74, 0x7a, 0x20, 0x48,
+  0x65, 0x72, 0x62, 0x65, 0x72, 0x74, 0x2c, 0x20, 0x48, 0x75, 0x62, 0x65,
+  0x72, 0x74, 0x20, 0x64, 0x65, 0x20, 0x42, 0x75, 0x72, 0x67, 0x68, 0x0d,
+  0x0a, 0x73, 0x65, 0x6e, 0x65, 0x73, 0x63, 0x68, 0x61, 0x6c, 0x20, 0x6f,
+  0x66, 0x20, 0x50, 0x6f, 0x69, 0x74, 0x6f, 0x75, 0x2c, 0x20, 0x48, 0x75,
+  0x67, 0x68, 0x20, 0x64, 0x65, 0x20, 0x4e, 0x65, 0x76, 0x69, 0x6c, 0x6c,
+  0x65, 0x2c, 0x20, 0x4d, 0x61, 0x74, 0x74, 0x68, 0x65, 0x77, 0x20, 0x46,
+  0x69, 0x74, 0x7a, 0x20, 0x48, 0x65, 0x72, 0x62, 0x65, 0x72, 0x74, 0x2c,
+  0x20, 0x54, 0x68, 0x6f, 0x6d, 0x61, 0x73, 0x0d, 0x0a, 0x42, 0x61, 0x73,
+  0x73, 0x65, 0x74, 0x2c, 0x20, 0x41, 0x6c, 0x61, 0x6e, 0x20, 0x42, 0x61,
+  0x73, 0x73, 0x65, 0x74, 0x2c, 0x20, 0x50, 0x68, 0x69, 0x6c, 0x69, 0x70,
+  0x20, 0x44, 0x61, 0x75, 0x62, 0x65, 0x6e, 0x79, 0x2c, 0x20, 0x52, 0x6f,
+  0x62, 0x65, 0x72, 0x74, 0x20, 0x64, 0x65, 0x20, 0x52, 0x6f, 0x70, 0x70,
+  0x65, 0x6c, 0x65, 0x79, 0x2c, 0x20, 0x4a, 0x6f, 0x68, 0x6e, 0x20, 0x4d,
+  0x61, 0x72, 0x73, 0x68, 0x61, 0x6c, 0x2c, 0x0d, 0x0a, 0x4a, 0x6f, 0x68,
+  0x6e, 0x20, 0x46, 0x69, 0x74, 0x7a, 0x20, 0x48, 0x75, 0x67, 0x68, 0x2c,
+  0x20, 0x61, 0x6e, 0x64, 0x20, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x20, 0x6c,
+  0x6f, 0x79, 0x61, 0x6c, 0x20, 0x73, 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74,
+  0x73, 0x3a, 0x0d, 0x0a, 0x0d, 0x0a, 0x28, 0x31, 0x29, 0x20, 0x46, 0x49,
+  0x52, 0x53, 0x54, 0x2c, 0x20, 0x54, 0x48, 0x41, 0x54, 0x20, 0x57, 0x45,
+  0x20, 0x48, 0x41, 0x56, 0x45, 0x20, 0x47, 0x52, 0x41, 0x4e, 0x54, 0x45,
+  0x44, 0x20, 0x54, 0x4f, 0x20, 0x47, 0x4f, 0x44, 0x2c, 0x20, 0x61, 0x6e,
+  0x64, 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x70, 0x72,
+  0x65, 0x73, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x68, 0x61, 0x72, 0x74, 0x65,
+  0x72, 0x0d, 0x0a, 0x68, 0x61, 0x76, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x66,
+  0x69, 0x72, 0x6d, 0x65, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x75, 0x73,
+  0x20, 0x61, 0x6e, 0x64, 0x20, 0x6f, 0x75, 0x72, 0x20, 0x68, 0x65, 0x69,
+  0x72, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x70, 0x65, 0x72, 0x70, 0x65, 0x74,
+  0x75, 0x69, 0x74, 0x79, 0x2c, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x74,
+  0x68, 0x65, 0x20, 0x45, 0x6e, 0x67, 0x6c, 0x69, 0x73, 0x68, 0x0d, 0x0a,
+  0x43, 0x68, 0x75, 0x72, 0x63, 0x68, 0x20, 0x73, 0x68, 0x61, 0x6c, 0x6c,
+  0x20, 0x62, 0x65, 0x20, 0x66, 0x72, 0x65, 0x65, 0x2c, 0x20, 0x61, 0x6e,
+  0x64, 0x20, 0x73, 0x68, 0x61, 0x6c, 0x6c, 0x20, 0x68, 0x61, 0x76, 0x65,
+  0x20, 0x69, 0x74, 0x73, 0x20, 0x72, 0x69, 0x67, 0x68, 0x74, 0x73, 0x20,
+  0x75, 0x6e, 0x64, 0x69, 0x6d, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x65, 0x64,
+  0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x69, 0x74, 0x73, 0x0d, 0x0a, 0x6c,
+  0x69, 0x62, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x20, 0x75, 0x6e, 0x69,
+  0x6d, 0x70, 0x61, 0x69, 0x72, 0x65, 0x64, 0x2e, 0x20, 0x54, 0x68, 0x61,
+  0x74, 0x20, 0x77, 0x65, 0x20, 0x77, 0x69, 0x73, 0x68, 0x20, 0x74, 0x68,
+  0x69, 0x73, 0x20, 0x73, 0x6f, 0x20, 0x74, 0x6f, 0x20, 0x62, 0x65, 0x20,
+  0x6f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x2c, 0x20, 0x61, 0x70,
+  0x70, 0x65, 0x61, 0x72, 0x73, 0x0d, 0x0a, 0x66, 0x72, 0x6f, 0x6d, 0x20,
+  0x74, 0x68, 0x65, 0x20, 0x66, 0x61, 0x63, 0x74, 0x20, 0x74, 0x68, 0x61,
+  0x74, 0x20, 0x6f, 0x66, 0x20, 0x6f, 0x75, 0x72, 0x20, 0x6f, 0x77, 0x6e,
+  0x20, 0x66, 0x72, 0x65, 0x65, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x2c, 0x20,
+  0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6f,
+  0x75, 0x74, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x20, 0x6f, 0x66, 0x20, 0x74,
+  0x68, 0x65, 0x0d, 0x0a, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x20,
+  0x64, 0x69, 0x73, 0x70, 0x75, 0x74, 0x65, 0x20, 0x62, 0x65, 0x74, 0x77,
+  0x65, 0x65, 0x6e, 0x20, 0x75, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6f,
+  0x75, 0x72, 0x20, 0x62, 0x61, 0x72, 0x6f, 0x6e, 0x73, 0x2c, 0x20, 0x77,
+  0x65, 0x20, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x65, 0x64, 0x20, 0x61, 0x6e,
+  0x64, 0x20, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x65, 0x64, 0x20,
+  0x62, 0x79, 0x0d, 0x0a, 0x63, 0x68, 0x61, 0x72, 0x74, 0x65, 0x72, 0x20,
+  0x74, 0x68, 0x65, 0x20, 0x66, 0x72, 0x65, 0x65, 0x64, 0x6f, 0x6d, 0x20,
+  0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x43, 0x68, 0x75, 0x72, 0x63,
+  0x68, 0x27, 0x73, 0x20, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e,
+  0x73, 0x20, 0x2d, 0x20, 0x61, 0x20, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20,
+  0x72, 0x65, 0x63, 0x6b, 0x6f, 0x6e, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20,
+  0x62, 0x65, 0x0d, 0x0a, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x67,
+  0x72, 0x65, 0x61, 0x74, 0x65, 0x73, 0x74, 0x20, 0x6e, 0x65, 0x63, 0x65,
+  0x73, 0x73, 0x69, 0x74, 0x79, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x69, 0x6d,
+  0x70, 0x6f, 0x72, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x20, 0x74, 0x6f, 0x20,
+  0x69, 0x74, 0x20, 0x2d, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x63, 0x61, 0x75,
+  0x73, 0x65, 0x64, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x74, 0x6f, 0x20,
+  0x62, 0x65, 0x0d, 0x0a, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x65,
+  0x64, 0x20, 0x62, 0x79, 0x20, 0x50, 0x6f, 0x70, 0x65, 0x20, 0x49, 0x6e,
+  0x6e, 0x6f, 0x63, 0x65, 0x6e, 0x74, 0x20, 0x49, 0x49, 0x49, 0x2e, 0x20,
+  0x54, 0x68, 0x69, 0x73, 0x20, 0x66, 0x72, 0x65, 0x65, 0x64, 0x6f, 0x6d,
+  0x20, 0x77, 0x65, 0x20, 0x73, 0x68, 0x61, 0x6c, 0x6c, 0x20, 0x6f, 0x62,
+  0x73, 0x65, 0x72, 0x76, 0x65, 0x20, 0x6f, 0x75, 0x72, 0x73, 0x65, 0x6c,
+  0x76, 0x65, 0x73, 0x2c, 0x0d, 0x0a, 0x61, 0x6e, 0x64, 0x20, 0x64, 0x65,
+  0x73, 0x69, 0x72, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x62, 0x65, 0x20, 0x6f,
+  0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x67,
+  0x6f, 0x6f, 0x64, 0x20, 0x66, 0x61, 0x69, 0x74, 0x68, 0x20, 0x62, 0x79,
+  0x20, 0x6f, 0x75, 0x72, 0x20, 0x68, 0x65, 0x69, 0x72, 0x73, 0x20, 0x69,
+  0x6e, 0x20, 0x70, 0x65, 0x72, 0x70, 0x65, 0x74, 0x75, 0x69, 0x74, 0x79,
+  0x2e, 0x0d, 0x0a, 0x0d, 0x0a, 0x54, 0x4f, 0x20, 0x41, 0x4c, 0x4c, 0x20,
+  0x46, 0x52, 0x45, 0x45, 0x20, 0x4d, 0x45, 0x4e, 0x20, 0x4f, 0x46, 0x20,
+  0x4f, 0x55, 0x52, 0x20, 0x4b, 0x49, 0x4e, 0x47, 0x44, 0x4f, 0x4d, 0x20,
+  0x77, 0x65, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x61, 0x6c, 0x73, 0x6f,
+  0x20, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x65, 0x64, 0x2c, 0x20, 0x66, 0x6f,
+  0x72, 0x20, 0x75, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6f, 0x75, 0x72,
+  0x0d, 0x0a, 0x68, 0x65, 0x69, 0x72, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20,
+  0x65, 0x76, 0x65, 0x72, 0x2c, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x74, 0x68,
+  0x65, 0x20, 0x6c, 0x69, 0x62, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x20,
+  0x77, 0x72, 0x69, 0x74, 0x74, 0x65, 0x6e, 0x20, 0x6f, 0x75, 0x74, 0x20,
+  0x62, 0x65, 0x6c, 0x6f, 0x77, 0x2c, 0x20, 0x74, 0x6f, 0x20, 0x68, 0x61,
+  0x76, 0x65, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x74, 0x6f, 0x0d, 0x0a, 0x6b,
+  0x65, 0x65, 0x70, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x6d,
+  0x20, 0x61, 0x6e, 0x64, 0x20, 0x74, 0x68, 0x65, 0x69, 0x72, 0x20, 0x68,
+  0x65, 0x69, 0x72, 0x73, 0x2c, 0x20, 0x6f, 0x66, 0x20, 0x75, 0x73, 0x20,
+  0x61, 0x6e, 0x64, 0x20, 0x6f, 0x75, 0x72, 0x20, 0x68, 0x65, 0x69, 0x72,
+  0x73, 0x3a, 0x0d, 0x0a, 0x0d, 0x0a, 0x28, 0x32, 0x29, 0x20, 0x49, 0x66,
+  0x20, 0x61, 0x6e, 0x79, 0x20, 0x65, 0x61, 0x72, 0x6c, 0x2c, 0x20, 0x62,
+  0x61, 0x72, 0x6f, 0x6e, 0x2c, 0x20, 0x6f, 0x72, 0x20, 0x6f, 0x74, 0x68,
+  0x65, 0x72, 0x20, 0x70, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x20, 0x74, 0x68,
+  0x61, 0x74, 0x20, 0x68, 0x6f, 0x6c, 0x64, 0x73, 0x20, 0x6c, 0x61, 0x6e,
+  0x64, 0x73, 0x20, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6c, 0x79, 0x20,
+  0x6f, 0x66, 0x0d, 0x0a, 0x74, 0x68, 0x65, 0x20, 0x43, 0x72, 0x6f, 0x77,
+  0x6e, 0x2c, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6d, 0x69, 0x6c, 0x69, 0x74,
+  0x61, 0x72, 0x79, 0x20, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2c,
+  0x20, 0x73, 0x68, 0x61, 0x6c, 0x6c, 0x20, 0x64, 0x69, 0x65, 0x2c, 0x20,
+  0x61, 0x6e, 0x64, 0x20, 0x61, 0x74, 0x20, 0x68, 0x69, 0x73, 0x20, 0x64,
+  0x65, 0x61, 0x74, 0x68, 0x20, 0x68, 0x69, 0x73, 0x20, 0x68, 0x65, 0x69,
+  0x72, 0x0d, 0x0a, 0x73, 0x68, 0x61, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20,
+  0x6f, 0x66, 0x20, 0x66, 0x75, 0x6c, 0x6c, 0x20, 0x61, 0x67, 0x65, 0x20,
+  0x61, 0x6e, 0x64, 0x20, 0x6f, 0x77, 0x65, 0x20, 0x61, 0x20, 0x60, 0x72,
+  0x65, 0x6c, 0x69, 0x65, 0x66, 0x27, 0x2c, 0x20, 0x74, 0x68, 0x65, 0x20,
+  0x68, 0x65, 0x69, 0x72, 0x20, 0x73, 0x68, 0x61, 0x6c, 0x6c, 0x20, 0x68,
+  0x61, 0x76, 0x65, 0x20, 0x68, 0x69, 0x73, 0x0d, 0x0a, 0x69, 0x6e, 0x68,
+  0x65, 0x72, 0x69, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x20, 0x6f, 0x6e, 0x20,
+  0x70, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x74,
+  0x68, 0x65, 0x20, 0x61, 0x6e, 0x63, 0x69, 0x65, 0x6e, 0x74, 0x20, 0x73,
+  0x63, 0x61, 0x6c, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x60, 0x72, 0x65, 0x6c,
+  0x69, 0x65, 0x66, 0x27, 0x2e, 0x20, 0x54, 0x68, 0x61, 0x74, 0x20, 0x69,
+  0x73, 0x20, 0x74, 0x6f, 0x0d, 0x0a, 0x73, 0x61, 0x79, 0x2c, 0x20, 0x74,
+  0x68, 0x65, 0x20, 0x68, 0x65, 0x69, 0x72, 0x20, 0x6f, 0x72, 0x20, 0x68,
+  0x65, 0x69, 0x72, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x6e, 0x20, 0x65,
+  0x61, 0x72, 0x6c, 0x20, 0x73, 0x68, 0x61, 0x6c, 0x6c, 0x20, 0x70, 0x61,
+  0x79, 0x20, 0x31, 0x30, 0x30, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68,
+  0x65, 0x20, 0x65, 0x6e, 0x74, 0x69, 0x72, 0x65, 0x20, 0x65, 0x61, 0x72,
+  0x6c, 0x27, 0x73, 0x0d, 0x0a, 0x62, 0x61, 0x72, 0x6f, 0x6e, 0x79, 0x2c,
+  0x20, 0x74, 0x68, 0x65, 0x20, 0x68, 0x65, 0x69, 0x72, 0x20, 0x6f, 0x72,
+  0x20, 0x68, 0x65, 0x69, 0x72, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x20,
+  0x6b, 0x6e, 0x69, 0x67, 0x68, 0x74, 0x20, 0x31, 0x30, 0x30, 0x73, 0x2e,
+  0x20, 0x61, 0x74, 0x20, 0x6d, 0x6f, 0x73, 0x74, 0x20, 0x66, 0x6f, 0x72,
+  0x20, 0x74, 0x68, 0x65, 0x20, 0x65, 0x6e, 0x74, 0x69, 0x72, 0x65, 0x0d,
+  0x0a, 0x6b, 0x6e, 0x69, 0x67, 0x68, 0x74, 0x27, 0x73, 0x20, 0x60, 0x66,
+  0x65, 0x65, 0x27, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x61, 0x6e, 0x79,
+  0x20, 0x6d, 0x61, 0x6e, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x6f, 0x77,
+  0x65, 0x73, 0x20, 0x6c, 0x65, 0x73, 0x73, 0x20, 0x73, 0x68, 0x61, 0x6c,
+  0x6c, 0x20, 0x70, 0x61, 0x79, 0x20, 0x6c, 0x65, 0x73, 0x73, 0x2c, 0x20,
+  0x69, 0x6e, 0x0d, 0x0a, 0x61, 0x63, 0x63, 0x6f, 0x72, 0x64, 0x61, 0x6e,
+  0x63, 0x65, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20,
+  0x61, 0x6e, 0x63, 0x69, 0x65, 0x6e, 0x74, 0x20, 0x75, 0x73, 0x61, 0x67,
+  0x65, 0x20, 0x6f, 0x66, 0x20, 0x60, 0x66, 0x65, 0x65, 0x73, 0x27, 0x0d,
+  0x0a, 0x0d, 0x0a, 0x28, 0x33, 0x29, 0x20, 0x42, 0x75, 0x74, 0x20, 0x69,
+  0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x68, 0x65, 0x69, 0x72, 0x20, 0x6f,
+  0x66, 0x20, 0x73, 0x75, 0x63, 0x68, 0x20, 0x61, 0x20, 0x70, 0x65, 0x72,
+  0x73, 0x6f, 0x6e, 0x20, 0x69, 0x73, 0x20, 0x75, 0x6e, 0x64, 0x65, 0x72,
+  0x20, 0x61, 0x67, 0x65, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x61, 0x20, 0x77,
+  0x61, 0x72, 0x64, 0x2c, 0x20, 0x77, 0x68, 0x65, 0x6e, 0x20, 0x68, 0x65,
+  0x0d, 0x0a, 0x63, 0x6f, 0x6d, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x61,
+  0x67, 0x65, 0x20, 0x68, 0x65, 0x20, 0x73, 0x68, 0x61, 0x6c, 0x6c, 0x20,
+  0x68, 0x61, 0x76, 0x65, 0x20, 0x68, 0x69, 0x73, 0x20, 0x69, 0x6e, 0x68,
+  0x65, 0x72, 0x69, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x20, 0x77, 0x69, 0x74,
+  0x68, 0x6f, 0x75, 0x74, 0x20, 0x60, 0x72, 0x65, 0x6c, 0x69, 0x65, 0x66,
+  0x27, 0x20, 0x6f, 0x72, 0x20, 0x66, 0x69, 0x6e, 0x65, 0x2e, 0x0d, 0x0a,
+  0x0d, 0x0a, 0x28, 0x34, 0x29, 0x20, 0x54, 0x68, 0x65, 0x20, 0x67, 0x75,
+  0x61, 0x72, 0x64, 0x69, 0x61, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68,
+  0x65, 0x20, 0x6c, 0x61, 0x6e, 0x64, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x6e,
+  0x20, 0x68, 0x65, 0x69, 0x72, 0x20, 0x77, 0x68, 0x6f, 0x20, 0x69, 0x73,
+  0x20, 0x75, 0x6e, 0x64, 0x65, 0x72, 0x20, 0x61, 0x67, 0x65, 0x20, 0x73,
+  0x68, 0x61, 0x6c, 0x6c, 0x20, 0x74, 0x61, 0x6b, 0x65, 0x0d, 0x0a, 0x66,
+  0x72, 0x6f, 0x6d, 0x20, 0x69, 0x74, 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x20,
+  0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x72,
+  0x65, 0x76, 0x65, 0x6e, 0x75, 0x65, 0x73, 0x2c, 0x20, 0x63, 0x75, 0x73,
+  0x74, 0x6f, 0x6d, 0x61, 0x72, 0x79, 0x20, 0x64, 0x75, 0x65, 0x73, 0x2c,
+  0x20, 0x61, 0x6e, 0x64, 0x20, 0x66, 0x65, 0x75, 0x64, 0x61, 0x6c, 0x20,
+  0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x0d, 0x0a, 0x48,
+  0x65, 0x20, 0x73, 0x68, 0x61, 0x6c, 0x6c, 0x20, 0x64, 0x6f, 0x20, 0x74,
+  0x68, 0x69, 0x73, 0x20, 0x77, 0x69, 0x74, 0x68, 0x6f, 0x75, 0x74, 0x20,
+  0x64, 0x65, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20,
+  0x6f, 0x72, 0x20, 0x64, 0x61, 0x6d, 0x61, 0x67, 0x65, 0x20, 0x74, 0x6f,
+  0x20, 0x6d, 0x65, 0x6e, 0x20, 0x6f, 0x72, 0x20, 0x70, 0x72, 0x6f, 0x70,
+  0x65, 0x72, 0x74, 0x79, 0x2e, 0x20, 0x49, 0x66, 0x0d, 0x0a, 0x77, 0x65,
+  0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x67, 0x69, 0x76, 0x65, 0x6e, 0x20,
+  0x74, 0x68, 0x65, 0x20, 0x67, 0x75, 0x61, 0x72, 0x64, 0x69, 0x61, 0x6e,
+  0x73, 0x68, 0x69, 0x70, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20,
+  0x6c, 0x61, 0x6e, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x20, 0x73, 0x68,
+  0x65, 0x72, 0x69, 0x66, 0x66, 0x2c, 0x20, 0x6f, 0x72, 0x20, 0x74, 0x6f,
+  0x20, 0x61, 0x6e, 0x79, 0x0d, 0x0a, 0x70, 0x65, 0x72, 0x73, 0x6f, 0x6e,
+  0x20, 0x61, 0x6e, 0x73, 0x77, 0x65, 0x72, 0x61, 0x62, 0x6c, 0x65, 0x20,
+  0x74, 0x6f, 0x20, 0x75, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68,
+  0x65, 0x20, 0x72, 0x65, 0x76, 0x65, 0x6e, 0x75, 0x65, 0x73, 0x2c, 0x20,
+  0x61, 0x6e, 0x64, 0x20, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x69,
+  0x74, 0x73, 0x20, 0x64, 0x65, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69,
+  0x6f, 0x6e, 0x0d, 0x0a, 0x6f, 0x72, 0x20, 0x64, 0x61, 0x6d, 0x61, 0x67,
+  0x65, 0x2c, 0x20, 0x77, 0x65, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x65,
+  0x78, 0x61, 0x63, 0x74, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x65, 0x6e, 0x73,
+  0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x68,
+  0x69, 0x6d, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x74, 0x68, 0x65, 0x20,
+  0x6c, 0x61, 0x6e, 0x64, 0x20, 0x73, 0x68, 0x61, 0x6c, 0x6c, 0x20, 0x62,
+  0x65, 0x0d, 0x0a, 0x65, 0x6e, 0x74, 0x72, 0x75, 0x73, 0x74, 0x65, 0x64,
+  0x20, 0x74, 0x6f, 0x20, 0x74, 0x77, 0x6f, 0x20, 0x77, 0x6f, 0x72, 0x74,
+  0x68, 0x79, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x70, 0x72, 0x75, 0x64, 0x65,
+  0x6e, 0x74, 0x20, 0x6d, 0x65, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68,
+  0x65, 0x20, 0x73, 0x61, 0x6d, 0x65, 0x20, 0x60, 0x66, 0x65, 0x65, 0x27,
+  0x2c, 0x20, 0x77, 0x68, 0x6f, 0x20, 0x73, 0x68, 0x61, 0x6c, 0x6c, 0x0d,
+  0x0a, 0x62, 0x65, 0x20, 0x61, 0x6e, 0x73, 0x77, 0x65, 0x72, 0x61, 0x62,
+  0x6c, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x75, 0x73, 0x20, 0x66, 0x6f, 0x72,
+  0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x76, 0x65, 0x6e, 0x75, 0x65,
+  0x73, 0x2c, 0x20, 0x6f, 0x72, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65,
+  0x20, 0x70, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x20, 0x77,
+  0x68, 0x6f, 0x6d, 0x20, 0x77, 0x65, 0x20, 0x68, 0x61, 0x76, 0x65, 0x0d,
+  0x0a, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x20, 0x74, 0x68,
+  0x65, 0x6d, 0x2e, 0x20, 0x49, 0x66, 0x20, 0x77, 0x65, 0x20, 0x68, 0x61,
+  0x76, 0x65, 0x20, 0x67, 0x69, 0x76, 0x65, 0x6e, 0x20, 0x6f, 0x72, 0x20,
+  0x73, 0x6f, 0x6c, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x6e, 0x79, 0x6f,
+  0x6e, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x67, 0x75, 0x61, 0x72, 0x64,
+  0x69, 0x61, 0x6e, 0x73, 0x68, 0x69, 0x70, 0x20, 0x6f, 0x66, 0x0d, 0x0a,
+  0x73, 0x75, 0x63, 0x68, 0x20, 0x6c, 0x61, 0x6e, 0x64, 0x2c, 0x20, 0x61,
+  0x6e, 0x64, 0x20, 0x68, 0x65, 0x20, 0x63, 0x61, 0x75, 0x73, 0x65, 0x73,
+  0x20, 0x64, 0x65, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e,
+  0x20, 0x6f, 0x72, 0x20, 0x64, 0x61, 0x6d, 0x61, 0x67, 0x65, 0x2c, 0x20,
+  0x68, 0x65, 0x20, 0x73, 0x68, 0x61, 0x6c, 0x6c, 0x20, 0x6c, 0x6f, 0x73,
+  0x65, 0x20, 0x74, 0x68, 0x65, 0x0d, 0x0a, 0x67, 0x75, 0x61, 0x72, 0x64,
+  0x69, 0x61, 0x6e, 0x73, 0x68, 0x69, 0x70, 0x20, 0x6f, 0x66, 0x20, 0x69,
+  0x74, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x69, 0x74, 0x20, 0x73, 0x68,
+  0x61, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x68, 0x61, 0x6e, 0x64, 0x65,
+  0x64, 0x20, 0x6f, 0x76, 0x65, 0x72, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x77,
+  0x6f, 0x20, 0x77, 0x6f, 0x72, 0x74, 0x68, 0x79, 0x20, 0x61, 0x6e, 0x64,
+  0x0d, 0x0a, 0x70, 0x72, 0x75, 0x64, 0x65, 0x6e, 0x74, 0x20, 0x6d, 0x65,
+  0x6e, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x61, 0x6d,
+  0x65, 0x20, 0x60, 0x66, 0x65, 0x65, 0x27, 0x2c, 0x20, 0x77, 0x68, 0x6f,
+  0x20, 0x73, 0x68, 0x61, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x73, 0x69,
+  0x6d, 0x69, 0x6c, 0x61, 0x72, 0x6c, 0x79, 0x20, 0x61, 0x6e, 0x73, 0x77,
+  0x65, 0x72, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x74, 0x6f, 0x0d, 0x0a, 0x75,
+  0x73, 0x2e, 0x0d, 0x0a, 0x0d, 0x0a, 0x28, 0x35, 0x29, 0x20, 0x46, 0x6f,
+  0x72, 0x20, 0x73, 0x6f, 0x20, 0x6c, 0x6f, 0x6e, 0x67, 0x20, 0x61, 0x73,
+  0x20, 0x61, 0x20, 0x67, 0x75, 0x61, 0x72, 0x64, 0x69, 0x61, 0x6e, 0x20,
+  0x68, 0x61, 0x73, 0x20, 0x67, 0x75, 0x61, 0x72, 0x64, 0x69, 0x61, 0x6e,
+  0x73, 0x68, 0x69, 0x70, 0x20, 0x6f, 0x66, 0x20, 0x73, 0x75, 0x63, 0x68,
+  0x20, 0x6c, 0x61, 0x6e, 0x64, 0x2c, 0x20, 0x68, 0x65, 0x20, 0x73, 0x68,
+  0x61, 0x6c, 0x6c, 0x0d, 0x0a, 0x6d, 0x61, 0x69, 0x6e, 0x74, 0x61, 0x69,
+  0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x68, 0x6f, 0x75, 0x73, 0x65, 0x73,
+  0x2c, 0x20, 0x70, 0x61, 0x72, 0x6b, 0x73, 0x2c, 0x20, 0x66, 0x69, 0x73,
+  0x68, 0x20, 0x70, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x73, 0x2c,
+  0x20, 0x70, 0x6f, 0x6e, 0x64, 0x73, 0x2c, 0x20, 0x6d, 0x69, 0x6c, 0x6c,
+  0x73, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x0d, 0x0a, 0x65, 0x76, 0x65, 0x72,
+  0x79, 0x74, 0x68, 0x69, 0x6e, 0x67, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20,
+  0x70, 0x65, 0x72, 0x74, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x74,
+  0x6f, 0x20, 0x69, 0x74, 0x2c, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74,
+  0x68, 0x65, 0x20, 0x72, 0x65, 0x76, 0x65, 0x6e, 0x75, 0x65, 0x73, 0x20,
+  0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x61, 0x6e, 0x64, 0x0d,
+  0x0a, 0x69, 0x74, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x20, 0x57, 0x68, 0x65,
+  0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x68, 0x65, 0x69, 0x72, 0x20, 0x63,
+  0x6f, 0x6d, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x67, 0x65, 0x2c,
+  0x20, 0x68, 0x65, 0x20, 0x73, 0x68, 0x61, 0x6c, 0x6c, 0x20, 0x72, 0x65,
+  0x73, 0x74, 0x6f, 0x72, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x77, 0x68,
+  0x6f, 0x6c, 0x65, 0x20, 0x6c, 0x61, 0x6e, 0x64, 0x20, 0x74, 0x6f, 0x0d,
+  0x0a, 0x68, 0x69, 0x6d, 0x2c, 0x20, 0x73, 0x74, 0x6f, 0x63, 0x6b, 0x65,
+  0x64, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x70, 0x6c, 0x6f, 0x75, 0x67,
+  0x68, 0x20, 0x74, 0x65, 0x61, 0x6d, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20,
+  0x73, 0x75, 0x63, 0x68, 0x20, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x6d, 0x65,
+  0x6e, 0x74, 0x73, 0x00
+};
+unsigned int magna_carta_len = 4096;
+struct arg {
+       unsigned int cpu;
+       void *private;
+       void *dst;
+       ssize_t dst_len;
+       void *src;
+       ssize_t src_len;
+       int err;
+       int line;
+};
+
+struct arg *args;
+static void take_lock(void *_arg)
+{
+       struct arg *arg;
+       unsigned int cpu = smp_processor_id();
+       ssize_t dst_len = PAGE_SIZE;
+       int err;
+       u8 *pos;
+       u8 csum, csum_decompress;
+
+       arg = (struct arg *)_arg;
+       arg = &arg[cpu];
+       if (arg->cpu != cpu) {
+               printk("%s on CPU%d got arg for CPU%d!\n", __func__, cpu, arg->cpu);
+               return;
+       }
+       csum = 0;
+       for (pos = (u8 *)arg->src; pos < (u8 *)arg->src + arg->src_len; pos++)
+               csum += *pos;
+
+       arg->dst_len = 0;
+       err = lz4_compress(arg->src, args->src_len, arg->dst, &arg->dst_len, arg->private);
+       if (err) {
+               arg->err = err;
+               arg->line = __LINE__;
+               return;
+       }
+       memset(arg->src, 0, arg->src_len);
+       dst_len = arg->src_len;
+       err = lz4_decompress_unknownoutputsize(arg->dst, arg->dst_len, arg->src, &dst_len);
+       if (dst_len != arg->src_len) {
+               arg->err = err ? err : -ENOSPC;
+               arg->line = __LINE__;
+               printk("CPU%d, decompressed size=%zu, source size=%zu\n", cpu, dst_len, arg->dst_len);
+               return;
+       }
+       csum_decompress = 0;
+       for (pos = (u8 *)arg->src; pos < (u8 *)arg->src + arg->src_len; pos++)
+               csum_decompress += *pos;
+
+       if (csum_decompress != csum) {
+               arg->err = -ENOSPC;
+               arg->line = __LINE__;
+       }
+}
+static int __init ipi_hog_init(void)
+{
+
+       cycles_t start, end;
+       unsigned long long i;
+       unsigned int cpu;
+       int ret = -ENOMEM;
+
+       args = kmalloc_array(num_online_cpus(), sizeof(struct arg), GFP_KERNEL);
+       if (!args)
+               return ret;
+       memset(args, 0, sizeof(struct arg) * num_online_cpus());
+       ret = 0;
+       for_each_online_cpu(cpu) {
+               void *p;
+
+               p = kzalloc(LZ4_MEM_COMPRESS, GFP_KERNEL);
+               if (!p) {
+                       ret = -ENOMEM;
+                       break;
+               }
+               args[cpu].line = 0;
+               args[cpu].cpu = cpu;
+               args[cpu].private = p;
+               args[cpu].err = 0;
+               p = (void *)__get_free_pages(GFP_KERNEL | __GFP_ZERO, 1);
+               if (!p) {
+                       kfree(args[cpu].private);
+                       ret = -ENOMEM;
+                       break;
+               }
+               args[cpu].dst = p;
+               args[cpu].dst_len = 0;
+               p = kmalloc(PAGE_SIZE, GFP_KERNEL);
+               if (!p) {
+                       kfree(args[cpu].private);
+                       free_pages((unsigned long)args[cpu].dst, 1);
+                       ret = -ENOMEM;
+                       break;
+               }
+               memcpy(p, magna_carta, magna_carta_len);
+               args[cpu].src = p;
+               args[cpu].src_len = magna_carta_len;
+       }
+       if (ret)
+               goto exit;
+
+       printk("START");
+       start = get_cycles();
+       if (xen_domain())
+               HYPERVISOR_xen_version(0xDEADBEEF, NULL);
+
+       for (i = 0; i < loops; i++ ) {
+               (void)smp_call_function(take_lock, args, 1);
+               for_each_online_cpu(cpu) {
+                       if (args[cpu].err) {
+                               printk("Error detected at CPU%d (%d), line=%d\n",
+                                      cpu, args[cpu].err, args[cpu].line);
+                               i = loops;
+                               break;
+                       }
+               }
+       }
+       end = get_cycles();
+       printk("END: cycles: %lld (%lld seconds)\n", (unsigned long long)end - start, ((unsigned long long)end- start) >> 30);
+
+exit:
+       for_each_online_cpu(cpu) {
+               if (args[cpu].err)
+                       printk("CPU%d failed with err=%d, line=%d\n",
+                              cpu, args[cpu].err, args[cpu].line);
+               if (memcmp(args[cpu].src, magna_carta, magna_carta_len)) {
+                       printk("CPU%d compressed/decompressed funny. Have:\n", cpu);
+                       printk("%s", (char *)args[cpu].src);
+               }
+               kfree(args[cpu].private);
+               kfree(args[cpu].src);
+               free_pages((unsigned long)args[cpu].dst, 1);
+       }
+       return -EIO; /* Just so we don't get loaded. */
+}
+static void __exit ipi_hog_exit(void)
+{
+}
+module_init(ipi_hog_init);
+module_exit(ipi_hog_exit);