--- /dev/null
+#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);