@@ -291,9 +291,67 @@ static bool pe_has_bpf_section(char *file_buf, unsigned long pe_sz)
static struct kexec_pe_parser_bpf *pe_parser;
+static void *get_symbol_from_elf(const char *elf_data, size_t elf_size,
+ const char *symbol_name, unsigned int *symbol_size)
+{
+ Elf_Ehdr *ehdr = (Elf_Ehdr *)elf_data;
+ Elf_Shdr *shdr, *symtab_shdr, *strtab_shdr, *dst_shdr;
+ Elf64_Sym *sym, *symtab = NULL;
+ char *strtab = NULL;
+ void *symbol_data = NULL;
+ int i;
+
+ symtab_shdr = strtab_shdr = NULL;
+ if (memcmp(ehdr->e_ident, ELFMAG, SELFMAG) != 0) {
+ pr_err("Not a valid ELF file\n");
+ goto out;
+ }
+
+ shdr = (struct elf_shdr *)(elf_data + ehdr->e_shoff);
+ for (i = 0; i < ehdr->e_shnum; i++) {
+ if (shdr[i].sh_type == SHT_SYMTAB) {
+ symtab_shdr = &shdr[i];
+ } else if (shdr[i].sh_type == SHT_STRTAB && i != ehdr->e_shstrndx) {
+ strtab_shdr = &shdr[i];
+ }
+ }
+
+ if (!symtab_shdr || !strtab_shdr) {
+ pr_err("Symbol table or string table not found\n");
+ goto out;
+ }
+ symtab = (Elf64_Sym *)(elf_data + symtab_shdr->sh_offset);
+ strtab = (char *)(elf_data + strtab_shdr->sh_offset);
+ for (i = 0; i < symtab_shdr->sh_size / sizeof(Elf64_Sym); i++) {
+ sym = &symtab[i];
+ if (strcmp(&strtab[sym->st_name], symbol_name) == 0) {
+ if (sym->st_shndx >= SHN_LORESERVE)
+ return NULL; // No section data for these
+ dst_shdr = &shdr[sym->st_shndx];
+ symbol_data = (void *)(elf_data + dst_shdr->sh_offset + sym->st_value);
+ *symbol_size = symtab[i].st_size;
+ break;
+ }
+ }
+
+out:
+ return symbol_data;
+}
+
/* Load a ELF */
static int arm_bpf_prog(char *bpf_elf, unsigned long sz)
{
+ opts_data = get_symbol_from_elf(bpf_elf, sz, "opts_data", &opts_data_sz);
+ opts_insn = get_symbol_from_elf(bpf_elf, sz, "opts_insn", &opts_insn_sz);
+ if (!opts_data || !opts_insn)
+ return -1;
+ /*
+ * When light skeleton generates opts_data[] and opts_insn[], it appends a
+ * NULL terminator at the end of string
+ */
+ opts_data_sz = opts_data_sz - 1;
+ opts_insn_sz = opts_insn_sz - 1;
+
pe_parser = kexec_pe_parser_bpf__open_and_load();
if (!pe_parser)
return -1;
@@ -307,6 +365,8 @@ static void disarm_bpf_prog(void)
{
kexec_pe_parser_bpf__destroy(pe_parser);
pe_parser = NULL;
+ opts_data = NULL;
+ opts_insn = NULL;
}
/*
@@ -96,493 +96,19 @@ kexec_pe_parser_bpf__open(void)
return NULL;
}
+static char *opts_data, *opts_insn;
+static unsigned int opts_data_sz, opts_insn_sz;
+
static inline int
kexec_pe_parser_bpf__load(struct kexec_pe_parser_bpf *skel)
{
struct bpf_load_and_run_opts opts = {};
int err;
- static const char opts_data[] __attribute__((__aligned__(8))) = "\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x9f\xeb\x01\0\
-\x18\0\0\0\0\0\0\0\x9c\x05\0\0\x9c\x05\0\0\x49\x0a\0\0\0\0\0\0\0\0\0\x02\x03\0\
-\0\0\x01\0\0\0\0\0\0\x01\x04\0\0\0\x20\0\0\x01\0\0\0\0\0\0\0\x03\0\0\0\0\x02\0\
-\0\0\x04\0\0\0\x1b\0\0\0\x05\0\0\0\0\0\0\x01\x04\0\0\0\x20\0\0\0\0\0\0\0\0\0\0\
-\x02\x06\0\0\0\0\0\0\0\0\0\0\x03\0\0\0\0\x02\0\0\0\x04\0\0\0\0\0\0\x10\0\0\0\0\
-\x02\0\0\x04\x10\0\0\0\x19\0\0\0\x01\0\0\0\0\0\0\0\x1e\0\0\0\x05\0\0\0\x40\0\0\
-\0\x2a\0\0\0\0\0\0\x0e\x07\0\0\0\x01\0\0\0\0\0\0\0\x02\0\0\x04\x10\0\0\0\x19\0\
-\0\0\x01\0\0\0\0\0\0\0\x1e\0\0\0\x05\0\0\0\x40\0\0\0\x34\0\0\0\0\0\0\x0e\x09\0\
-\0\0\x01\0\0\0\0\0\0\0\x02\0\0\x04\x10\0\0\0\x19\0\0\0\x01\0\0\0\0\0\0\0\x1e\0\
-\0\0\x05\0\0\0\x40\0\0\0\x3e\0\0\0\0\0\0\x0e\x0b\0\0\0\x01\0\0\0\0\0\0\0\x02\0\
-\0\x04\x10\0\0\0\x19\0\0\0\x01\0\0\0\0\0\0\0\x1e\0\0\0\x05\0\0\0\x40\0\0\0\x48\
-\0\0\0\0\0\0\x0e\x0d\0\0\0\x01\0\0\0\0\0\0\0\0\0\0\x02\x10\0\0\0\0\0\0\0\0\0\0\
-\x03\0\0\0\0\x02\0\0\0\x04\0\0\0\x02\0\0\0\0\0\0\0\0\0\0\x02\x12\0\0\0\0\0\0\0\
-\0\0\0\x03\0\0\0\0\x02\0\0\0\x04\0\0\0\x0a\0\0\0\0\0\0\0\0\0\0\x02\x14\0\0\0\
-\x52\0\0\0\0\0\0\x01\x04\0\0\0\x20\0\0\0\0\0\0\0\0\0\0\x02\x16\0\0\0\x5f\0\0\0\
-\x03\0\0\x04\x10\0\0\0\x70\0\0\0\x17\0\0\0\0\0\0\0\x74\0\0\0\x18\0\0\0\x40\0\0\
-\0\x79\0\0\0\x02\0\0\0\x60\0\0\0\0\0\0\0\0\0\0\x02\0\0\0\0\x80\0\0\0\0\0\0\x08\
-\x19\0\0\0\x89\0\0\0\0\0\0\x08\x1a\0\0\0\x8d\0\0\0\0\0\0\x08\x14\0\0\0\0\0\0\0\
-\x04\0\0\x04\x20\0\0\0\x19\0\0\0\x0f\0\0\0\0\0\0\0\x1e\0\0\0\x11\0\0\0\x40\0\0\
-\0\x93\0\0\0\x13\0\0\0\x80\0\0\0\x97\0\0\0\x15\0\0\0\xc0\0\0\0\x9d\0\0\0\0\0\0\
-\x0e\x1b\0\0\0\x01\0\0\0\0\0\0\0\0\0\0\x02\x1e\0\0\0\xab\0\0\0\0\0\0\x01\x08\0\
-\0\0\x40\0\0\0\0\0\0\0\x01\0\0\x0d\x02\0\0\0\xbe\0\0\0\x1d\0\0\0\xc2\0\0\0\x01\
-\0\0\x0c\x1f\0\0\0\0\0\0\0\x01\0\0\x0d\x02\0\0\0\xbe\0\0\0\x1d\0\0\0\xc5\x08\0\
-\0\x01\0\0\x0c\x21\0\0\0\x2a\x09\0\0\0\0\0\x01\x01\0\0\0\x08\0\0\x01\0\0\0\0\0\
-\0\0\x03\0\0\0\0\x23\0\0\0\x04\0\0\0\x04\0\0\0\x2f\x09\0\0\0\0\0\x0e\x24\0\0\0\
-\x01\0\0\0\0\0\0\0\0\0\0\x0a\x23\0\0\0\0\0\0\0\0\0\0\x03\0\0\0\0\x26\0\0\0\x04\
-\0\0\0\x10\0\0\0\x37\x09\0\0\0\0\0\x0e\x27\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x03\0\0\
-\0\0\x26\0\0\0\x04\0\0\0\x27\0\0\0\x4c\x09\0\0\0\0\0\x0e\x29\0\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\x03\0\0\0\0\x26\0\0\0\x04\0\0\0\x34\0\0\0\x63\x09\0\0\0\0\0\x0e\x2b\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x03\0\0\0\0\x23\0\0\0\x04\0\0\0\x05\0\0\0\0\0\0\0\
-\0\0\0\x03\0\0\0\0\x26\0\0\0\x04\0\0\0\x1f\0\0\0\x7a\x09\0\0\0\0\0\x0e\x2e\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\x03\0\0\0\0\x26\0\0\0\x04\0\0\0\x26\0\0\0\x91\x09\0\0\
-\0\0\0\x0e\x30\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x03\0\0\0\0\x26\0\0\0\x04\0\0\0\x43\
-\0\0\0\xa8\x09\0\0\0\0\0\x0e\x32\0\0\0\0\0\0\0\xbf\x09\0\0\0\0\0\x0e\x2e\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\x03\0\0\0\0\x26\0\0\0\x04\0\0\0\x1d\0\0\0\xd6\x09\0\0\0\
-\0\0\x0e\x35\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x03\0\0\0\0\x26\0\0\0\x04\0\0\0\x39\0\
-\0\0\xed\x09\0\0\0\0\0\x0e\x37\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x03\0\0\0\0\x26\0\0\
-\0\x04\0\0\0\x20\0\0\0\x04\x0a\0\0\0\0\0\x0e\x39\0\0\0\0\0\0\0\x1b\x0a\0\0\0\0\
-\0\x0e\x35\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x03\0\0\0\0\x23\0\0\0\x04\0\0\0\x07\0\0\
-\0\x33\x0a\0\0\x05\0\0\x0f\x60\0\0\0\x08\0\0\0\0\0\0\0\x10\0\0\0\x0a\0\0\0\x10\
-\0\0\0\x10\0\0\0\x0c\0\0\0\x20\0\0\0\x10\0\0\0\x0e\0\0\0\x30\0\0\0\x10\0\0\0\
-\x1c\0\0\0\x40\0\0\0\x20\0\0\0\x39\x0a\0\0\x0b\0\0\x0f\xa5\x01\0\0\x28\0\0\0\0\
-\0\0\0\x10\0\0\0\x2a\0\0\0\x10\0\0\0\x27\0\0\0\x2c\0\0\0\x37\0\0\0\x34\0\0\0\
-\x2f\0\0\0\x6b\0\0\0\x1f\0\0\0\x31\0\0\0\x8a\0\0\0\x26\0\0\0\x33\0\0\0\xb0\0\0\
-\0\x43\0\0\0\x34\0\0\0\xf3\0\0\0\x1f\0\0\0\x36\0\0\0\x12\x01\0\0\x1d\0\0\0\x38\
-\0\0\0\x2f\x01\0\0\x39\0\0\0\x3a\0\0\0\x68\x01\0\0\x20\0\0\0\x3b\0\0\0\x88\x01\
-\0\0\x1d\0\0\0\x41\x0a\0\0\x01\0\0\x0f\x04\0\0\0\x25\0\0\0\0\0\0\0\x04\0\0\0\0\
-\x69\x6e\x74\0\x5f\x5f\x41\x52\x52\x41\x59\x5f\x53\x49\x5a\x45\x5f\x54\x59\x50\
-\x45\x5f\x5f\0\x74\x79\x70\x65\0\x6d\x61\x78\x5f\x65\x6e\x74\x72\x69\x65\x73\0\
-\x72\x69\x6e\x67\x62\x75\x66\x5f\x31\0\x72\x69\x6e\x67\x62\x75\x66\x5f\x32\0\
-\x72\x69\x6e\x67\x62\x75\x66\x5f\x33\0\x72\x69\x6e\x67\x62\x75\x66\x5f\x34\0\
-\x75\x6e\x73\x69\x67\x6e\x65\x64\x20\x69\x6e\x74\0\x6d\x65\x6d\x5f\x72\x61\x6e\
-\x67\x65\x5f\x72\x65\x73\x75\x6c\x74\0\x62\x75\x66\0\x73\x69\x7a\x65\0\x73\x74\
-\x61\x74\x75\x73\0\x75\x69\x6e\x74\x33\x32\x5f\x74\0\x75\x33\x32\0\x5f\x5f\x75\
-\x33\x32\0\x6b\x65\x79\0\x76\x61\x6c\x75\x65\0\x6d\x65\x6d\x5f\x72\x61\x6e\x67\
-\x65\x5f\x6d\x61\x70\0\x75\x6e\x73\x69\x67\x6e\x65\x64\x20\x6c\x6f\x6e\x67\x20\
-\x6c\x6f\x6e\x67\0\x63\x74\x78\0\x70\x61\x72\x73\x65\x5f\x70\x65\0\x66\x65\x6e\
-\x74\x72\x79\x2f\x62\x70\x66\x5f\x68\x61\x6e\x64\x6c\x65\x5f\x70\x65\x66\x69\
-\x6c\x65\0\x2f\x68\x6f\x6d\x65\x2f\x7a\x62\x6f\x6f\x74\x5f\x62\x70\x66\x2f\x6b\
-\x65\x78\x65\x63\x5f\x70\x65\x5f\x70\x61\x72\x73\x65\x72\x5f\x62\x70\x66\x2e\
-\x63\0\x69\x6e\x74\x20\x42\x50\x46\x5f\x50\x52\x4f\x47\x28\x70\x61\x72\x73\x65\
-\x5f\x70\x65\x2c\x20\x63\x68\x61\x72\x20\x2a\x69\x6d\x61\x67\x65\x5f\x62\x75\
-\x66\x2c\x20\x75\x6e\x73\x69\x67\x6e\x65\x64\x20\x69\x6e\x74\x20\x69\x6d\x61\
-\x67\x65\x5f\x73\x7a\x2c\x20\x63\x68\x61\x72\x20\x2a\x75\x6e\x75\x73\x65\x64\
-\x5f\x69\x6e\x69\x74\x72\x64\x2c\0\x09\x75\x6e\x73\x69\x67\x6e\x65\x64\x20\x69\
-\x6e\x74\x20\x6b\x65\x79\x20\x3d\x20\x30\x3b\0\x09\x62\x70\x66\x5f\x70\x72\x69\
-\x6e\x74\x6b\x28\x22\x62\x65\x67\x69\x6e\x20\x70\x61\x72\x73\x65\x20\x50\x45\
-\x5c\x6e\x22\x29\x3b\0\x09\x69\x66\x20\x28\x21\x69\x6d\x61\x67\x65\x5f\x62\x75\
-\x66\x20\x7c\x7c\x20\x28\x69\x6d\x61\x67\x65\x5f\x73\x7a\x20\x3e\x20\x4d\x41\
-\x58\x5f\x52\x45\x43\x4f\x52\x44\x5f\x53\x49\x5a\x45\x29\x29\x20\x7b\0\x09\x09\
-\x62\x70\x66\x5f\x70\x72\x69\x6e\x74\x6b\x28\x22\x45\x72\x72\x3a\x20\x69\x6d\
-\x61\x67\x65\x20\x73\x69\x7a\x65\x20\x69\x73\x20\x67\x72\x65\x61\x74\x65\x72\
-\x20\x74\x68\x61\x6e\x20\x30\x78\x25\x6c\x78\x5c\x6e\x22\x2c\x20\x4d\x41\x58\
-\x5f\x52\x45\x43\x4f\x52\x44\x5f\x53\x49\x5a\x45\x29\x3b\0\x09\x09\x72\x65\x74\
-\x75\x72\x6e\x20\x30\x3b\0\x09\x62\x75\x66\x20\x3d\x20\x28\x63\x68\x61\x72\x20\
-\x2a\x29\x62\x70\x66\x5f\x72\x69\x6e\x67\x62\x75\x66\x5f\x72\x65\x73\x65\x72\
-\x76\x65\x28\x26\x72\x69\x6e\x67\x62\x75\x66\x5f\x31\x2c\x20\x73\x69\x7a\x65\
-\x6f\x66\x28\x73\x74\x72\x75\x63\x74\x20\x6c\x69\x6e\x75\x78\x5f\x70\x65\x5f\
-\x7a\x62\x6f\x6f\x74\x5f\x68\x65\x61\x64\x65\x72\x29\x2c\x20\x30\x29\x3b\0\x09\
-\x69\x66\x20\x28\x21\x62\x75\x66\x29\x20\x7b\0\x09\x20\x20\x20\x20\x09\x62\x70\
-\x66\x5f\x70\x72\x69\x6e\x74\x6b\x28\x22\x45\x72\x72\x3a\x20\x66\x61\x69\x6c\
-\x20\x74\x6f\x20\x72\x65\x73\x65\x72\x76\x65\x20\x72\x69\x6e\x67\x62\x75\x66\
-\x20\x74\x6f\x20\x70\x61\x72\x73\x65\x20\x7a\x62\x6f\x6f\x74\x20\x68\x65\x61\
-\x64\x65\x72\x5c\x6e\x22\x29\x3b\0\x09\x62\x70\x66\x5f\x70\x72\x6f\x62\x65\x5f\
-\x72\x65\x61\x64\x28\x28\x76\x6f\x69\x64\x20\x2a\x29\x62\x75\x66\x2c\x20\x73\
-\x69\x7a\x65\x6f\x66\x28\x73\x74\x72\x75\x63\x74\x20\x6c\x69\x6e\x75\x78\x5f\
-\x70\x65\x5f\x7a\x62\x6f\x6f\x74\x5f\x68\x65\x61\x64\x65\x72\x29\x2c\x20\x69\
-\x6d\x61\x67\x65\x5f\x62\x75\x66\x29\x3b\0\x09\x69\x66\x20\x28\x21\x21\x5f\x5f\
-\x62\x75\x69\x6c\x74\x69\x6e\x5f\x6d\x65\x6d\x63\x6d\x70\x28\x26\x7a\x62\x6f\
-\x6f\x74\x5f\x68\x65\x61\x64\x65\x72\x2d\x3e\x69\x6d\x61\x67\x65\x5f\x74\x79\
-\x70\x65\x2c\x20\x22\x7a\x69\x6d\x67\x22\x2c\0\x09\x20\x20\x20\x20\x09\x62\x70\
-\x66\x5f\x70\x72\x69\x6e\x74\x6b\x28\x22\x45\x72\x72\x3a\x20\x69\x6d\x61\x67\
-\x65\x20\x69\x73\x20\x6e\x6f\x74\x20\x7a\x62\x6f\x6f\x74\x20\x69\x6d\x61\x67\
-\x65\x5c\x6e\x22\x29\x3b\0\x09\x09\x62\x70\x66\x5f\x72\x69\x6e\x67\x62\x75\x66\
-\x5f\x64\x69\x73\x63\x61\x72\x64\x28\x62\x75\x66\x2c\x20\x42\x50\x46\x5f\x52\
-\x42\x5f\x4e\x4f\x5f\x57\x41\x4b\x45\x55\x50\x29\x3b\0\x09\x75\x6e\x73\x69\x67\
-\x6e\x65\x64\x20\x69\x6e\x74\x20\x70\x61\x79\x6c\x6f\x61\x64\x5f\x73\x69\x7a\
-\x65\x20\x3d\x20\x7a\x62\x6f\x6f\x74\x5f\x68\x65\x61\x64\x65\x72\x2d\x3e\x70\
-\x61\x79\x6c\x6f\x61\x64\x5f\x73\x69\x7a\x65\x3b\0\x09\x75\x6e\x73\x69\x67\x6e\
-\x65\x64\x20\x69\x6e\x74\x20\x70\x61\x79\x6c\x6f\x61\x64\x5f\x6f\x66\x66\x73\
-\x65\x74\x20\x3d\x20\x7a\x62\x6f\x6f\x74\x5f\x68\x65\x61\x64\x65\x72\x2d\x3e\
-\x70\x61\x79\x6c\x6f\x61\x64\x5f\x6f\x66\x66\x73\x65\x74\x3b\0\x09\x62\x70\x66\
-\x5f\x72\x69\x6e\x67\x62\x75\x66\x5f\x64\x69\x73\x63\x61\x72\x64\x28\x62\x75\
-\x66\x2c\x20\x42\x50\x46\x5f\x52\x42\x5f\x4e\x4f\x5f\x57\x41\x4b\x45\x55\x50\
-\x29\x3b\0\x09\x69\x6d\x61\x67\x65\x5f\x73\x7a\x20\x3d\x20\x69\x6d\x61\x67\x65\
-\x5f\x73\x7a\x20\x26\x20\x28\x4d\x41\x58\x5f\x52\x45\x43\x4f\x52\x44\x5f\x53\
-\x49\x5a\x45\x20\x2d\x20\x31\x29\x3b\0\x09\x69\x66\x20\x28\x69\x6d\x61\x67\x65\
-\x5f\x67\x7a\x5f\x73\x7a\x20\x3c\x3d\x20\x30\x20\x7c\x7c\x20\x69\x6d\x61\x67\
-\x65\x5f\x67\x7a\x5f\x73\x7a\x20\x2b\x20\x34\x20\x3e\x20\x69\x6d\x61\x67\x65\
-\x5f\x73\x7a\x29\x20\x7b\0\x09\x09\x62\x70\x66\x5f\x70\x72\x69\x6e\x74\x6b\x28\
-\x22\x49\x6e\x76\x61\x6c\x69\x64\x20\x6f\x66\x66\x73\x65\x74\x20\x66\x6f\x72\
-\x20\x64\x65\x63\x6f\x6d\x70\x72\x65\x73\x73\x65\x64\x20\x73\x69\x7a\x65\x5c\
-\x6e\x22\x29\x3b\0\x09\x75\x6e\x73\x69\x67\x6e\x65\x64\x20\x69\x6e\x74\x20\x64\
-\x5f\x70\x6f\x73\x20\x3d\x20\x28\x70\x61\x79\x6c\x6f\x61\x64\x5f\x6f\x66\x66\
-\x73\x65\x74\x20\x2b\x20\x69\x6d\x61\x67\x65\x5f\x67\x7a\x5f\x73\x7a\x29\x20\
-\x26\x20\x28\x4d\x41\x58\x5f\x52\x45\x43\x4f\x52\x44\x5f\x53\x49\x5a\x45\x20\
-\x2d\x20\x31\x29\x3b\0\x09\x62\x70\x66\x5f\x70\x72\x6f\x62\x65\x5f\x72\x65\x61\
-\x64\x28\x28\x76\x6f\x69\x64\x20\x2a\x29\x26\x64\x65\x63\x6f\x6d\x70\x72\x65\
-\x73\x73\x65\x64\x5f\x73\x7a\x2c\x20\x73\x69\x7a\x65\x6f\x66\x28\x69\x6e\x74\
-\x29\x2c\x20\x69\x6d\x61\x67\x65\x5f\x62\x75\x66\x20\x2b\x20\x64\x5f\x70\x6f\
-\x73\x29\x3b\0\x09\x62\x70\x66\x5f\x70\x72\x69\x6e\x74\x6b\x28\x22\x70\x61\x79\
-\x6c\x6f\x61\x64\x5f\x6f\x66\x66\x73\x65\x74\x3a\x30\x78\x25\x6c\x78\x2c\x20\
-\x70\x61\x79\x6c\x6f\x61\x64\x5f\x73\x69\x7a\x65\x3a\x30\x78\x25\x6c\x78\x2c\
-\x20\x64\x65\x63\x6f\x6d\x70\x72\x65\x73\x73\x65\x64\x20\x73\x69\x7a\x65\x3a\
-\x30\x78\x25\x6c\x78\x5c\x6e\x22\x2c\0\x09\x69\x66\x20\x28\x64\x65\x63\x6f\x6d\
-\x70\x72\x65\x73\x73\x65\x64\x5f\x73\x7a\x20\x3d\x3d\x20\x30\x29\x20\x7b\0\x09\
-\x20\x20\x20\x20\x09\x62\x70\x66\x5f\x70\x72\x69\x6e\x74\x6b\x28\x22\x64\x65\
-\x63\x6f\x6d\x70\x72\x65\x73\x73\x65\x64\x20\x73\x69\x7a\x65\x20\x25\x64\x20\
-\x69\x73\x20\x77\x72\x6f\x6e\x67\x5c\x6e\x22\x2c\x20\x64\x65\x63\x6f\x6d\x70\
-\x72\x65\x73\x73\x65\x64\x5f\x73\x7a\x29\x3b\0\x09\x69\x66\x20\x28\x70\x61\x79\
-\x6c\x6f\x61\x64\x5f\x6f\x66\x66\x73\x65\x74\x20\x3e\x3d\x20\x4d\x41\x58\x5f\
-\x52\x45\x43\x4f\x52\x44\x5f\x53\x49\x5a\x45\x20\x29\x20\x7b\0\x09\x09\x62\x70\
-\x66\x5f\x70\x72\x69\x6e\x74\x6b\x28\x22\x45\x72\x72\x3a\x20\x70\x61\x79\x6c\
-\x6f\x61\x64\x5f\x6f\x66\x66\x73\x65\x74\x20\x3e\x20\x30\x78\x25\x6c\x78\x5c\
-\x6e\x22\x2c\x20\x4d\x41\x58\x5f\x52\x45\x43\x4f\x52\x44\x5f\x53\x49\x5a\x45\
-\x29\x3b\0\x09\x62\x75\x66\x20\x3d\x20\x28\x63\x68\x61\x72\x20\x2a\x29\x62\x70\
-\x66\x5f\x72\x69\x6e\x67\x62\x75\x66\x5f\x72\x65\x73\x65\x72\x76\x65\x28\x26\
-\x72\x69\x6e\x67\x62\x75\x66\x5f\x31\x2c\x20\x4d\x41\x58\x5f\x52\x45\x43\x4f\
-\x52\x44\x5f\x53\x49\x5a\x45\x2c\x20\x30\x29\x3b\0\x09\x09\x62\x70\x66\x5f\x70\
-\x72\x69\x6e\x74\x6b\x28\x22\x45\x72\x72\x3a\x20\x66\x61\x69\x6c\x20\x74\x6f\
-\x20\x72\x65\x73\x65\x72\x76\x65\x20\x66\x72\x6f\x6d\x20\x72\x69\x6e\x67\x62\
-\x75\x66\x5f\x31\x20\x66\x6f\x72\x20\x72\x65\x61\x64\x69\x6e\x67\x20\x70\x61\
-\x79\x6c\x6f\x61\x64\x5c\x6e\x22\x29\x3b\0\x09\x62\x70\x66\x5f\x70\x72\x6f\x62\
-\x65\x5f\x72\x65\x61\x64\x28\x28\x76\x6f\x69\x64\x20\x2a\x29\x62\x75\x66\x2c\
-\x20\x70\x61\x79\x6c\x6f\x61\x64\x5f\x73\x69\x7a\x65\x2c\x20\x69\x6d\x61\x67\
-\x65\x5f\x62\x75\x66\x20\x2b\x20\x70\x61\x79\x6c\x6f\x61\x64\x5f\x6f\x66\x66\
-\x73\x65\x74\x29\x3b\0\x09\x62\x70\x66\x5f\x70\x72\x69\x6e\x74\x6b\x28\x22\x43\
-\x61\x6c\x6c\x69\x6e\x67\x20\x62\x70\x66\x5f\x6b\x65\x78\x65\x63\x5f\x64\x65\
-\x63\x6f\x6d\x70\x72\x65\x73\x73\x28\x29\x5c\x6e\x22\x29\x3b\0\x09\x62\x70\x66\
-\x5f\x6b\x65\x78\x65\x63\x5f\x64\x65\x63\x6f\x6d\x70\x72\x65\x73\x73\x28\x62\
-\x75\x66\x2c\x20\x70\x61\x79\x6c\x6f\x61\x64\x5f\x73\x69\x7a\x65\x20\x2d\x20\
-\x34\x2c\x20\x64\x65\x63\x6f\x6d\x70\x72\x65\x73\x73\x65\x64\x5f\x73\x7a\x2c\
-\x20\x6d\x61\x70\x5f\x70\x74\x72\x2c\x20\x26\x6b\x65\x79\x29\x3b\0\x09\x72\x65\
-\x73\x75\x6c\x74\x20\x3d\x20\x62\x70\x66\x5f\x6d\x61\x70\x5f\x6c\x6f\x6f\x6b\
-\x75\x70\x5f\x65\x6c\x65\x6d\x28\x26\x6d\x65\x6d\x5f\x72\x61\x6e\x67\x65\x5f\
-\x6d\x61\x70\x2c\x20\x26\x6b\x65\x79\x29\x3b\0\x09\x69\x66\x20\x28\x21\x21\x72\
-\x65\x73\x75\x6c\x74\x29\x20\x7b\0\x09\x09\x62\x70\x66\x5f\x70\x72\x69\x6e\x74\
-\x6b\x28\x22\x43\x61\x6c\x6c\x69\x6e\x67\x20\x62\x70\x66\x5f\x6b\x65\x78\x65\
-\x63\x5f\x63\x61\x72\x72\x69\x65\x72\x28\x29\x5c\x6e\x22\x29\x3b\0\x09\x09\x62\
-\x70\x66\x5f\x6b\x65\x78\x65\x63\x5f\x63\x61\x72\x72\x69\x65\x72\x28\x4b\x45\
-\x58\x45\x43\x5f\x52\x45\x53\x5f\x4b\x45\x52\x4e\x45\x4c\x5f\x4e\x41\x4d\x45\
-\x2c\x20\x26\x6d\x65\x6d\x5f\x72\x61\x6e\x67\x65\x5f\x6d\x61\x70\x2c\x20\x72\
-\x65\x73\x75\x6c\x74\x29\x3b\0\x70\x6f\x73\x74\x5f\x70\x61\x72\x73\x65\x5f\x70\
-\x65\0\x66\x65\x6e\x74\x72\x79\x2f\x62\x70\x66\x5f\x70\x6f\x73\x74\x5f\x68\x61\
-\x6e\x64\x6c\x65\x5f\x70\x65\x66\x69\x6c\x65\0\x69\x6e\x74\x20\x42\x50\x46\x5f\
-\x50\x52\x4f\x47\x28\x70\x6f\x73\x74\x5f\x70\x61\x72\x73\x65\x5f\x70\x65\x2c\
-\x20\x63\x68\x61\x72\x20\x2a\x69\x6d\x61\x67\x65\x5f\x62\x75\x66\x2c\x20\x69\
-\x6e\x74\x20\x62\x75\x66\x5f\x73\x7a\x29\0\x63\x68\x61\x72\0\x4c\x49\x43\x45\
-\x4e\x53\x45\0\x5f\x5f\x5f\x5f\x70\x61\x72\x73\x65\x5f\x70\x65\x2e\x5f\x5f\x5f\
-\x5f\x66\x6d\x74\0\x5f\x5f\x5f\x5f\x70\x61\x72\x73\x65\x5f\x70\x65\x2e\x5f\x5f\
-\x5f\x5f\x66\x6d\x74\x2e\x31\0\x5f\x5f\x5f\x5f\x70\x61\x72\x73\x65\x5f\x70\x65\
-\x2e\x5f\x5f\x5f\x5f\x66\x6d\x74\x2e\x32\0\x5f\x5f\x5f\x5f\x70\x61\x72\x73\x65\
-\x5f\x70\x65\x2e\x5f\x5f\x5f\x5f\x66\x6d\x74\x2e\x33\0\x5f\x5f\x5f\x5f\x70\x61\
-\x72\x73\x65\x5f\x70\x65\x2e\x5f\x5f\x5f\x5f\x66\x6d\x74\x2e\x34\0\x5f\x5f\x5f\
-\x5f\x70\x61\x72\x73\x65\x5f\x70\x65\x2e\x5f\x5f\x5f\x5f\x66\x6d\x74\x2e\x35\0\
-\x5f\x5f\x5f\x5f\x70\x61\x72\x73\x65\x5f\x70\x65\x2e\x5f\x5f\x5f\x5f\x66\x6d\
-\x74\x2e\x36\0\x5f\x5f\x5f\x5f\x70\x61\x72\x73\x65\x5f\x70\x65\x2e\x5f\x5f\x5f\
-\x5f\x66\x6d\x74\x2e\x37\0\x5f\x5f\x5f\x5f\x70\x61\x72\x73\x65\x5f\x70\x65\x2e\
-\x5f\x5f\x5f\x5f\x66\x6d\x74\x2e\x38\0\x5f\x5f\x5f\x5f\x70\x61\x72\x73\x65\x5f\
-\x70\x65\x2e\x5f\x5f\x5f\x5f\x66\x6d\x74\x2e\x39\0\x5f\x5f\x5f\x5f\x70\x61\x72\
-\x73\x65\x5f\x70\x65\x2e\x5f\x5f\x5f\x5f\x66\x6d\x74\x2e\x31\x30\0\x2e\x6d\x61\
-\x70\x73\0\x2e\x72\x6f\x64\x61\x74\x61\0\x6c\x69\x63\x65\x6e\x73\x65\0\0\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xfd\x0f\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x1b\0\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\x10\0\0\0\0\0\0\0\0\0\0\0\0\x72\x69\x6e\x67\x62\x75\x66\
-\x5f\x31\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\x1b\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x10\0\0\0\0\0\0\0\0\0\0\0\0\x72\x69\x6e\x67\
-\x62\x75\x66\x5f\x32\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\x1b\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x10\0\0\0\0\0\0\0\0\0\0\0\0\x72\
-\x69\x6e\x67\x62\x75\x66\x5f\x33\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\x1b\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x10\0\0\0\0\0\0\0\0\0\
-\0\0\0\x72\x69\x6e\x67\x62\x75\x66\x5f\x34\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x02\0\0\0\x04\0\0\0\x10\0\0\0\x0a\0\0\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\x6d\x65\x6d\x5f\x72\x61\x6e\x67\x65\x5f\x6d\x61\x70\0\0\0\
-\0\0\0\0\0\0\0\0\x14\0\0\0\x16\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x02\0\0\0\x04\0\0\
-\0\xa5\x01\0\0\x01\0\0\0\x80\0\0\0\0\0\0\0\0\0\0\0\x6b\x65\x78\x65\x63\x5f\x70\
-\x65\x2e\x72\x6f\x64\x61\x74\x61\0\0\0\0\0\0\0\0\0\0\0\0\0\x3e\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\0\x62\x65\x67\x69\x6e\x20\x70\x61\x72\x73\x65\x20\x50\x45\x0a\0\
-\x45\x72\x72\x3a\x20\x69\x6d\x61\x67\x65\x20\x73\x69\x7a\x65\x20\x69\x73\x20\
-\x67\x72\x65\x61\x74\x65\x72\x20\x74\x68\x61\x6e\x20\x30\x78\x25\x6c\x78\x0a\0\
-\x45\x72\x72\x3a\x20\x66\x61\x69\x6c\x20\x74\x6f\x20\x72\x65\x73\x65\x72\x76\
-\x65\x20\x72\x69\x6e\x67\x62\x75\x66\x20\x74\x6f\x20\x70\x61\x72\x73\x65\x20\
-\x7a\x62\x6f\x6f\x74\x20\x68\x65\x61\x64\x65\x72\x0a\0\x45\x72\x72\x3a\x20\x69\
-\x6d\x61\x67\x65\x20\x69\x73\x20\x6e\x6f\x74\x20\x7a\x62\x6f\x6f\x74\x20\x69\
-\x6d\x61\x67\x65\x0a\0\x49\x6e\x76\x61\x6c\x69\x64\x20\x6f\x66\x66\x73\x65\x74\
-\x20\x66\x6f\x72\x20\x64\x65\x63\x6f\x6d\x70\x72\x65\x73\x73\x65\x64\x20\x73\
-\x69\x7a\x65\x0a\0\x70\x61\x79\x6c\x6f\x61\x64\x5f\x6f\x66\x66\x73\x65\x74\x3a\
-\x30\x78\x25\x6c\x78\x2c\x20\x70\x61\x79\x6c\x6f\x61\x64\x5f\x73\x69\x7a\x65\
-\x3a\x30\x78\x25\x6c\x78\x2c\x20\x64\x65\x63\x6f\x6d\x70\x72\x65\x73\x73\x65\
-\x64\x20\x73\x69\x7a\x65\x3a\x30\x78\x25\x6c\x78\x0a\0\x64\x65\x63\x6f\x6d\x70\
-\x72\x65\x73\x73\x65\x64\x20\x73\x69\x7a\x65\x20\x25\x64\x20\x69\x73\x20\x77\
-\x72\x6f\x6e\x67\x0a\0\x45\x72\x72\x3a\x20\x70\x61\x79\x6c\x6f\x61\x64\x5f\x6f\
-\x66\x66\x73\x65\x74\x20\x3e\x20\x30\x78\x25\x6c\x78\x0a\0\x45\x72\x72\x3a\x20\
-\x66\x61\x69\x6c\x20\x74\x6f\x20\x72\x65\x73\x65\x72\x76\x65\x20\x66\x72\x6f\
-\x6d\x20\x72\x69\x6e\x67\x62\x75\x66\x5f\x31\x20\x66\x6f\x72\x20\x72\x65\x61\
-\x64\x69\x6e\x67\x20\x70\x61\x79\x6c\x6f\x61\x64\x0a\0\x43\x61\x6c\x6c\x69\x6e\
-\x67\x20\x62\x70\x66\x5f\x6b\x65\x78\x65\x63\x5f\x64\x65\x63\x6f\x6d\x70\x72\
-\x65\x73\x73\x28\x29\x0a\0\x43\x61\x6c\x6c\x69\x6e\x67\x20\x62\x70\x66\x5f\x6b\
-\x65\x78\x65\x63\x5f\x63\x61\x72\x72\x69\x65\x72\x28\x29\x0a\0\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\0\x02\0\0\0\x04\0\0\0\x0c\0\0\0\x01\0\0\0\x80\0\0\0\0\0\0\0\0\0\0\0\x2e\
-\x72\x6f\x64\x61\x74\x61\x2e\x73\x74\x72\x31\x2e\x31\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x7a\x69\x6d\x67\0\x6b\x65\x72\x6e\x65\x6c\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\x47\x50\x4c\0\0\0\0\0\x79\x18\x08\0\0\0\0\0\x79\x16\
-\0\0\0\0\0\0\xb7\x01\0\0\0\0\0\0\x63\x1a\xf8\xff\0\0\0\0\x18\x61\0\0\x05\0\0\0\
-\0\0\0\0\0\0\0\0\xb7\x02\0\0\x10\0\0\0\x85\0\0\0\x06\0\0\0\x15\x06\x05\0\0\0\0\
-\0\xbf\x81\0\0\0\0\0\0\x67\x01\0\0\x20\0\0\0\x77\x01\0\0\x20\0\0\0\xb7\x02\0\0\
-\x01\0\0\x08\x2d\x12\x06\0\0\0\0\0\x18\x61\0\0\x05\0\0\0\0\0\0\0\x10\0\0\0\xb7\
-\x02\0\0\x27\0\0\0\xb7\x03\0\0\0\0\0\x08\x85\0\0\0\x06\0\0\0\x05\0\xa5\0\0\0\0\
-\0\x18\x51\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xb7\x02\0\0\x24\0\0\0\xb7\x03\0\0\0\0\0\
-\0\x85\0\0\0\x83\0\0\0\xbf\x09\0\0\0\0\0\0\x55\x09\x05\0\0\0\0\0\x18\x61\0\0\
-\x05\0\0\0\0\0\0\0\x37\0\0\0\xb7\x02\0\0\x34\0\0\0\x85\0\0\0\x06\0\0\0\x05\0\
-\x99\0\0\0\0\0\xbf\x91\0\0\0\0\0\0\xb7\x02\0\0\x24\0\0\0\xbf\x63\0\0\0\0\0\0\
-\x85\0\0\0\x04\0\0\0\x71\x91\x05\0\0\0\0\0\x67\x01\0\0\x08\0\0\0\x71\x92\x04\0\
-\0\0\0\0\x4f\x21\0\0\0\0\0\0\x71\x92\x06\0\0\0\0\0\x67\x02\0\0\x10\0\0\0\x71\
-\x93\x07\0\0\0\0\0\x67\x03\0\0\x18\0\0\0\x4f\x23\0\0\0\0\0\0\x4f\x13\0\0\0\0\0\
-\0\x15\x03\x08\0\x7a\x69\x6d\x67\x18\x61\0\0\x05\0\0\0\0\0\0\0\x6b\0\0\0\xb7\
-\x02\0\0\x1f\0\0\0\x85\0\0\0\x06\0\0\0\xbf\x91\0\0\0\0\0\0\xb7\x02\0\0\x01\0\0\
-\0\x85\0\0\0\x85\0\0\0\x05\0\x82\0\0\0\0\0\x7b\x6a\xe0\xff\0\0\0\0\x71\x97\x0f\
-\0\0\0\0\0\x71\x91\x0e\0\0\0\0\0\x7b\x1a\xf0\xff\0\0\0\0\x71\x91\x0c\0\0\0\0\0\
-\x7b\x1a\xe8\xff\0\0\0\0\x71\x96\x0d\0\0\0\0\0\x71\x91\x0b\0\0\0\0\0\x7b\x1a\
-\xd8\xff\0\0\0\0\x71\x91\x0a\0\0\0\0\0\x7b\x1a\xc8\xff\0\0\0\0\x71\x91\x08\0\0\
-\0\0\0\x7b\x1a\xc0\xff\0\0\0\0\x71\x91\x09\0\0\0\0\0\x7b\x1a\xd0\xff\0\0\0\0\
-\xbf\x91\0\0\0\0\0\0\xb7\x02\0\0\x01\0\0\0\x85\0\0\0\x85\0\0\0\x67\x06\0\0\x08\
-\0\0\0\x79\xa1\xe8\xff\0\0\0\0\x4f\x16\0\0\0\0\0\0\x79\xa1\xf0\xff\0\0\0\0\x67\
-\x01\0\0\x10\0\0\0\x67\x07\0\0\x18\0\0\0\x4f\x17\0\0\0\0\0\0\x4f\x67\0\0\0\0\0\
-\0\x57\x08\0\0\xff\xff\xff\x07\x2d\x87\x07\0\0\0\0\0\xbf\x79\0\0\0\0\0\0\x67\
-\x09\0\0\x20\0\0\0\x18\x01\0\0\0\0\0\0\0\0\0\0\xfc\xff\xff\xff\x0f\x19\0\0\0\0\
-\0\0\xc7\x09\0\0\x20\0\0\0\x65\x09\x05\0\0\0\0\0\x18\x61\0\0\x05\0\0\0\0\0\0\0\
-\x8a\0\0\0\xb7\x02\0\0\x26\0\0\0\x85\0\0\0\x06\0\0\0\x05\0\x5a\0\0\0\0\0\x79\
-\xa1\xd0\xff\0\0\0\0\x67\x01\0\0\x08\0\0\0\x79\xa2\xc0\xff\0\0\0\0\x4f\x21\0\0\
-\0\0\0\0\x79\xa2\xc8\xff\0\0\0\0\x67\x02\0\0\x10\0\0\0\x79\xa8\xd8\xff\0\0\0\0\
-\x67\x08\0\0\x18\0\0\0\x4f\x28\0\0\0\0\0\0\x4f\x18\0\0\0\0\0\0\xbf\x91\0\0\0\0\
-\0\0\x0f\x81\0\0\0\0\0\0\x57\x01\0\0\xff\xff\xff\x07\x79\xa6\xe0\xff\0\0\0\0\
-\xbf\x63\0\0\0\0\0\0\x0f\x13\0\0\0\0\0\0\xbf\xa1\0\0\0\0\0\0\x07\x01\0\0\xfc\
-\xff\xff\xff\xb7\x02\0\0\x04\0\0\0\x85\0\0\0\x04\0\0\0\x61\xa5\xfc\xff\0\0\0\0\
-\x18\x61\0\0\x05\0\0\0\0\0\0\0\xb0\0\0\0\xb7\x02\0\0\x43\0\0\0\xbf\x83\0\0\0\0\
-\0\0\xbf\x74\0\0\0\0\0\0\x85\0\0\0\x06\0\0\0\x61\xa1\xfc\xff\0\0\0\0\x55\x01\
-\x06\0\0\0\0\0\x18\x61\0\0\x05\0\0\0\0\0\0\0\xf3\0\0\0\xb7\x02\0\0\x1f\0\0\0\
-\xb7\x03\0\0\0\0\0\0\x85\0\0\0\x06\0\0\0\x05\0\x37\0\0\0\0\0\xb7\x01\0\0\0\0\0\
-\x08\x2d\x81\x04\0\0\0\0\0\x18\x61\0\0\x05\0\0\0\0\0\0\0\x12\x01\0\0\xb7\x02\0\
-\0\x1d\0\0\0\x05\0\x89\xff\0\0\0\0\x18\x51\0\0\0\0\0\0\0\0\0\0\0\0\0\0\xb7\x02\
-\0\0\0\0\0\x08\xb7\x03\0\0\0\0\0\0\x85\0\0\0\x83\0\0\0\x55\0\x05\0\0\0\0\0\x18\
-\x61\0\0\x05\0\0\0\0\0\0\0\x2f\x01\0\0\xb7\x02\0\0\x39\0\0\0\x85\0\0\0\x06\0\0\
-\0\x05\0\x26\0\0\0\0\0\x0f\x86\0\0\0\0\0\0\xbf\x08\0\0\0\0\0\0\xbf\x81\0\0\0\0\
-\0\0\xbf\x72\0\0\0\0\0\0\xbf\x63\0\0\0\0\0\0\x85\0\0\0\x04\0\0\0\x18\x61\0\0\
-\x05\0\0\0\0\0\0\0\x68\x01\0\0\xb7\x02\0\0\x20\0\0\0\x85\0\0\0\x06\0\0\0\x61\
-\xa3\xfc\xff\0\0\0\0\xbf\xa6\0\0\0\0\0\0\x07\x06\0\0\xf8\xff\xff\xff\xbf\x81\0\
-\0\0\0\0\0\xbf\x92\0\0\0\0\0\0\x18\x54\0\0\x04\0\0\0\0\0\0\0\0\0\0\0\xbf\x65\0\
-\0\0\0\0\0\x85\0\0\0\xd4\0\0\0\xbf\x81\0\0\0\0\0\0\xb7\x02\0\0\x01\0\0\0\x85\0\
-\0\0\x85\0\0\0\x18\x51\0\0\x04\0\0\0\0\0\0\0\0\0\0\0\xbf\x62\0\0\0\0\0\0\x85\0\
-\0\0\x01\0\0\0\xbf\x06\0\0\0\0\0\0\x15\x06\x0a\0\0\0\0\0\x18\x61\0\0\x05\0\0\0\
-\0\0\0\0\x88\x01\0\0\xb7\x02\0\0\x1d\0\0\0\x85\0\0\0\x06\0\0\0\x18\x61\0\0\x06\
-\0\0\0\0\0\0\0\x05\0\0\0\x18\x52\0\0\x04\0\0\0\0\0\0\0\0\0\0\0\xbf\x63\0\0\0\0\
-\0\0\x85\0\0\0\xd5\0\0\0\xb7\0\0\0\0\0\0\0\x95\0\0\0\0\0\0\0\0\0\0\0\x20\0\0\0\
-\0\0\0\0\xe4\0\0\0\x0a\x01\0\0\x05\x50\x01\0\x03\0\0\0\xe4\0\0\0\x5e\x01\0\0\
-\x0f\x74\x01\0\x04\0\0\0\xe4\0\0\0\x75\x01\0\0\x02\x7c\x01\0\x08\0\0\0\xe4\0\0\
-\0\x96\x01\0\0\x11\x84\x01\0\x0e\0\0\0\xe4\0\0\0\xc9\x01\0\0\x03\x88\x01\0\x13\
-\0\0\0\xe4\0\0\0\x13\x02\0\0\x03\x20\x02\0\x14\0\0\0\xe4\0\0\0\x1f\x02\0\0\x10\
-\x9c\x01\0\x1a\0\0\0\xe4\0\0\0\x78\x02\0\0\x06\xa0\x01\0\x1b\0\0\0\xe4\0\0\0\
-\x85\x02\0\0\x07\xa4\x01\0\x1f\0\0\0\xe4\0\0\0\x13\x02\0\0\x03\x4c\x02\0\x20\0\
-\0\0\xe4\0\0\0\xcf\x02\0\0\x02\xb8\x01\0\x24\0\0\0\xe4\0\0\0\x1e\x03\0\0\x08\
-\xc0\x01\0\x2e\0\0\0\xe4\0\0\0\x1e\x03\0\0\x06\xc0\x01\0\x2f\0\0\0\xe4\0\0\0\
-\x59\x03\0\0\x07\xc8\x01\0\x33\0\0\0\xe4\0\0\0\x8e\x03\0\0\x03\xcc\x01\0\x36\0\
-\0\0\xe4\0\0\0\x13\x02\0\0\x03\xd0\x01\0\x38\0\0\0\xe4\0\0\0\xbc\x03\0\0\x2c\
-\xe0\x01\0\x3e\0\0\0\xe4\0\0\0\xf5\x03\0\0\x2e\xdc\x01\0\x45\0\0\0\xe4\0\0\0\
-\x32\x04\0\0\x02\xe4\x01\0\x49\0\0\0\xe4\0\0\0\xbc\x03\0\0\x2c\xe0\x01\0\x51\0\
-\0\0\xe4\0\0\0\x5f\x04\0\0\x16\xb4\x01\0\x52\0\0\0\xe4\0\0\0\x8d\x04\0\0\x17\
-\xec\x01\0\x5a\0\0\0\xe4\0\0\0\xc4\x04\0\0\x03\xf0\x01\0\x5e\0\0\0\xe4\0\0\0\
-\x13\x02\0\0\x03\x4c\x02\0\x69\0\0\0\xe4\0\0\0\xfc\x04\0\0\x27\0\x02\0\x6b\0\0\
-\0\xe4\0\0\0\xfc\x04\0\0\x36\0\x02\0\x6d\0\0\0\xe4\0\0\0\x4a\x05\0\0\x42\x08\
-\x02\0\x71\0\0\0\xe4\0\0\0\x4a\x05\0\0\x02\x08\x02\0\x73\0\0\0\xe4\0\0\0\x95\
-\x05\0\0\x02\x10\x02\0\x7a\0\0\0\xe4\0\0\0\xe8\x05\0\0\x06\x18\x02\0\x7b\0\0\0\
-\xe4\0\0\0\xe8\x05\0\0\x06\x18\x02\0\x7c\0\0\0\xe4\0\0\0\x05\x06\0\0\x07\x1c\
-\x02\0\x81\0\0\0\xe4\0\0\0\x13\x02\0\0\x03\x20\x02\0\x83\0\0\0\xe4\0\0\0\x4b\
-\x06\0\0\x06\x30\x02\0\x84\0\0\0\xe4\0\0\0\x76\x06\0\0\x03\x34\x02\0\x88\0\0\0\
-\xe4\0\0\0\xb6\x06\0\0\x10\x40\x02\0\x8d\0\0\0\xe4\0\0\0\x78\x02\0\0\x06\x44\
-\x02\0\x8e\0\0\0\xe4\0\0\0\xfa\x06\0\0\x03\x48\x02\0\x92\0\0\0\xe4\0\0\0\x13\
-\x02\0\0\x03\x4c\x02\0\x93\0\0\0\xe4\0\0\0\x45\x07\0\0\x36\x54\x02\0\x95\0\0\0\
-\xe4\0\0\0\x45\x07\0\0\x02\x54\x02\0\x99\0\0\0\xe4\0\0\0\x8d\x07\0\0\x02\x5c\
-\x02\0\x9d\0\0\0\xe4\0\0\0\xbe\x07\0\0\x02\x60\x02\0\xa6\0\0\0\xe4\0\0\0\x32\
-\x04\0\0\x02\x64\x02\0\xa9\0\0\0\xe4\0\0\0\x0c\x08\0\0\x0b\x70\x02\0\xae\0\0\0\
-\xe4\0\0\0\x41\x08\0\0\x06\x74\x02\0\xaf\0\0\0\xe4\0\0\0\x52\x08\0\0\x03\x78\
-\x02\0\xb3\0\0\0\xe4\0\0\0\x81\x08\0\0\x03\x7c\x02\0\xb9\0\0\0\xe4\0\0\0\x0a\
-\x01\0\0\x05\x50\x01\0\x1a\0\0\0\xbb\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x70\x61\x72\x73\x65\x5f\x70\x65\0\
-\0\0\0\0\0\0\0\0\0\0\0\x18\0\0\0\0\0\0\0\x08\0\0\0\0\0\0\0\0\0\0\0\x01\0\0\0\
-\x10\0\0\0\0\0\0\0\0\0\0\0\x31\0\0\0\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\0\0\x10\0\0\0\0\0\0\0\x62\x70\x66\x5f\x68\x61\x6e\x64\x6c\x65\x5f\
-\x70\x65\x66\x69\x6c\x65\0\0\0\0\0\0\0\x47\x50\x4c\0\0\0\0\0\xb7\0\0\0\0\0\0\0\
-\x95\0\0\0\0\0\0\0\0\0\0\0\x22\0\0\0\0\0\0\0\xe4\0\0\0\xf1\x08\0\0\x05\x94\x02\
-\0\x1a\0\0\0\x02\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\0\0\0\0\0\0\x70\x6f\x73\x74\x5f\x70\x61\x72\x73\x65\x5f\x70\x65\0\
-\0\0\0\0\0\0\x18\0\0\0\0\0\0\0\x08\0\0\0\0\0\0\0\0\0\0\0\x01\0\0\0\x10\0\0\0\0\
-\0\0\0\0\0\0\0\x01\0\0\0\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\
-\0\0\x10\0\0\0\0\0\0\0\x62\x70\x66\x5f\x70\x6f\x73\x74\x5f\x68\x61\x6e\x64\x6c\
-\x65\x5f\x70\x65\x66\x69\x6c\x65\0\0";
- static const char opts_insn[] __attribute__((__aligned__(8))) = "\
-\xbf\x16\0\0\0\0\0\0\xbf\xa1\0\0\0\0\0\0\x07\x01\0\0\x78\xff\xff\xff\xb7\x02\0\
-\0\x88\0\0\0\xb7\x03\0\0\0\0\0\0\x85\0\0\0\x71\0\0\0\x05\0\x38\0\0\0\0\0\x61\
-\xa1\x78\xff\0\0\0\0\xd5\x01\x01\0\0\0\0\0\x85\0\0\0\xa8\0\0\0\x61\xa1\x7c\xff\
-\0\0\0\0\xd5\x01\x01\0\0\0\0\0\x85\0\0\0\xa8\0\0\0\x61\xa1\x80\xff\0\0\0\0\xd5\
-\x01\x01\0\0\0\0\0\x85\0\0\0\xa8\0\0\0\x61\xa1\x84\xff\0\0\0\0\xd5\x01\x01\0\0\
-\0\0\0\x85\0\0\0\xa8\0\0\0\x18\x60\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x61\x01\0\0\0\0\
-\0\0\xd5\x01\x02\0\0\0\0\0\xbf\x19\0\0\0\0\0\0\x85\0\0\0\xa8\0\0\0\x18\x60\0\0\
-\0\0\0\0\0\0\0\0\x04\0\0\0\x61\x01\0\0\0\0\0\0\xd5\x01\x02\0\0\0\0\0\xbf\x19\0\
-\0\0\0\0\0\x85\0\0\0\xa8\0\0\0\x18\x60\0\0\0\0\0\0\0\0\0\0\x08\0\0\0\x61\x01\0\
-\0\0\0\0\0\xd5\x01\x02\0\0\0\0\0\xbf\x19\0\0\0\0\0\0\x85\0\0\0\xa8\0\0\0\x18\
-\x60\0\0\0\0\0\0\0\0\0\0\x0c\0\0\0\x61\x01\0\0\0\0\0\0\xd5\x01\x02\0\0\0\0\0\
-\xbf\x19\0\0\0\0\0\0\x85\0\0\0\xa8\0\0\0\x18\x60\0\0\0\0\0\0\0\0\0\0\x10\0\0\0\
-\x61\x01\0\0\0\0\0\0\xd5\x01\x02\0\0\0\0\0\xbf\x19\0\0\0\0\0\0\x85\0\0\0\xa8\0\
-\0\0\x18\x60\0\0\0\0\0\0\0\0\0\0\x14\0\0\0\x61\x01\0\0\0\0\0\0\xd5\x01\x02\0\0\
-\0\0\0\xbf\x19\0\0\0\0\0\0\x85\0\0\0\xa8\0\0\0\x18\x60\0\0\0\0\0\0\0\0\0\0\x18\
-\0\0\0\x61\x01\0\0\0\0\0\0\xd5\x01\x02\0\0\0\0\0\xbf\x19\0\0\0\0\0\0\x85\0\0\0\
-\xa8\0\0\0\xbf\x70\0\0\0\0\0\0\x95\0\0\0\0\0\0\0\x61\x60\x08\0\0\0\0\0\x18\x61\
-\0\0\0\0\0\0\0\0\0\0\x18\x15\0\0\x63\x01\0\0\0\0\0\0\x61\x60\x0c\0\0\0\0\0\x18\
-\x61\0\0\0\0\0\0\0\0\0\0\x14\x15\0\0\x63\x01\0\0\0\0\0\0\x79\x60\x10\0\0\0\0\0\
-\x18\x61\0\0\0\0\0\0\0\0\0\0\x08\x15\0\0\x7b\x01\0\0\0\0\0\0\x18\x60\0\0\0\0\0\
-\0\0\0\0\0\0\x05\0\0\x18\x61\0\0\0\0\0\0\0\0\0\0\0\x15\0\0\x7b\x01\0\0\0\0\0\0\
-\xb7\x01\0\0\x12\0\0\0\x18\x62\0\0\0\0\0\0\0\0\0\0\0\x15\0\0\xb7\x03\0\0\x1c\0\
-\0\0\x85\0\0\0\xa6\0\0\0\xbf\x07\0\0\0\0\0\0\xc5\x07\xb0\xff\0\0\0\0\x63\x7a\
-\x78\xff\0\0\0\0\x61\x60\x1c\0\0\0\0\0\x15\0\x03\0\0\0\0\0\x18\x61\0\0\0\0\0\0\
-\0\0\0\0\x2c\x15\0\0\x63\x01\0\0\0\0\0\0\xb7\x01\0\0\0\0\0\0\x18\x62\0\0\0\0\0\
-\0\0\0\0\0\x20\x15\0\0\xb7\x03\0\0\x48\0\0\0\x85\0\0\0\xa6\0\0\0\xbf\x07\0\0\0\
-\0\0\0\xc5\x07\xa3\xff\0\0\0\0\x18\x61\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x63\x71\0\0\
-\0\0\0\0\x61\x60\x2c\0\0\0\0\0\x15\0\x03\0\0\0\0\0\x18\x61\0\0\0\0\0\0\0\0\0\0\
-\x74\x15\0\0\x63\x01\0\0\0\0\0\0\xb7\x01\0\0\0\0\0\0\x18\x62\0\0\0\0\0\0\0\0\0\
-\0\x68\x15\0\0\xb7\x03\0\0\x48\0\0\0\x85\0\0\0\xa6\0\0\0\xbf\x07\0\0\0\0\0\0\
-\xc5\x07\x94\xff\0\0\0\0\x18\x61\0\0\0\0\0\0\0\0\0\0\x04\0\0\0\x63\x71\0\0\0\0\
-\0\0\x61\x60\x3c\0\0\0\0\0\x15\0\x03\0\0\0\0\0\x18\x61\0\0\0\0\0\0\0\0\0\0\xbc\
-\x15\0\0\x63\x01\0\0\0\0\0\0\xb7\x01\0\0\0\0\0\0\x18\x62\0\0\0\0\0\0\0\0\0\0\
-\xb0\x15\0\0\xb7\x03\0\0\x48\0\0\0\x85\0\0\0\xa6\0\0\0\xbf\x07\0\0\0\0\0\0\xc5\
-\x07\x85\xff\0\0\0\0\x18\x61\0\0\0\0\0\0\0\0\0\0\x08\0\0\0\x63\x71\0\0\0\0\0\0\
-\x61\x60\x4c\0\0\0\0\0\x15\0\x03\0\0\0\0\0\x18\x61\0\0\0\0\0\0\0\0\0\0\x04\x16\
-\0\0\x63\x01\0\0\0\0\0\0\xb7\x01\0\0\0\0\0\0\x18\x62\0\0\0\0\0\0\0\0\0\0\xf8\
-\x15\0\0\xb7\x03\0\0\x48\0\0\0\x85\0\0\0\xa6\0\0\0\xbf\x07\0\0\0\0\0\0\xc5\x07\
-\x76\xff\0\0\0\0\x18\x61\0\0\0\0\0\0\0\0\0\0\x0c\0\0\0\x63\x71\0\0\0\0\0\0\x61\
-\xa0\x78\xff\0\0\0\0\x18\x61\0\0\0\0\0\0\0\0\0\0\x70\x16\0\0\x63\x01\0\0\0\0\0\
-\0\x61\x60\x5c\0\0\0\0\0\x15\0\x03\0\0\0\0\0\x18\x61\0\0\0\0\0\0\0\0\0\0\x4c\
-\x16\0\0\x63\x01\0\0\0\0\0\0\xb7\x01\0\0\0\0\0\0\x18\x62\0\0\0\0\0\0\0\0\0\0\
-\x40\x16\0\0\xb7\x03\0\0\x48\0\0\0\x85\0\0\0\xa6\0\0\0\xbf\x07\0\0\0\0\0\0\xc5\
-\x07\x63\xff\0\0\0\0\x18\x61\0\0\0\0\0\0\0\0\0\0\x10\0\0\0\x63\x71\0\0\0\0\0\0\
-\x61\xa0\x78\xff\0\0\0\0\x18\x61\0\0\0\0\0\0\0\0\0\0\xb8\x16\0\0\x63\x01\0\0\0\
-\0\0\0\x61\x60\x6c\0\0\0\0\0\x15\0\x03\0\0\0\0\0\x18\x61\0\0\0\0\0\0\0\0\0\0\
-\x94\x16\0\0\x63\x01\0\0\0\0\0\0\xb7\x01\0\0\0\0\0\0\x18\x62\0\0\0\0\0\0\0\0\0\
-\0\x88\x16\0\0\xb7\x03\0\0\x48\0\0\0\x85\0\0\0\xa6\0\0\0\xbf\x07\0\0\0\0\0\0\
-\xc5\x07\x50\xff\0\0\0\0\x18\x61\0\0\0\0\0\0\0\0\0\0\x14\0\0\0\x63\x71\0\0\0\0\
-\0\0\x79\x63\x70\0\0\0\0\0\x15\x03\x08\0\0\0\0\0\x18\x61\0\0\0\0\0\0\0\0\0\0\
-\xd0\x16\0\0\xb7\x02\0\0\xa5\x01\0\0\x61\x60\x04\0\0\0\0\0\x45\0\x02\0\x01\0\0\
-\0\x85\0\0\0\x94\0\0\0\x05\0\x01\0\0\0\0\0\x85\0\0\0\x71\0\0\0\x18\x62\0\0\0\0\
-\0\0\0\0\0\0\x14\0\0\0\x61\x20\0\0\0\0\0\0\x18\x61\0\0\0\0\0\0\0\0\0\0\x80\x18\
-\0\0\x63\x01\0\0\0\0\0\0\x18\x60\0\0\0\0\0\0\0\0\0\0\x78\x18\0\0\x18\x61\0\0\0\
-\0\0\0\0\0\0\0\x88\x18\0\0\x7b\x01\0\0\0\0\0\0\x18\x60\0\0\0\0\0\0\0\0\0\0\xd0\
-\x16\0\0\x18\x61\0\0\0\0\0\0\0\0\0\0\x90\x18\0\0\x7b\x01\0\0\0\0\0\0\xb7\x01\0\
-\0\x02\0\0\0\x18\x62\0\0\0\0\0\0\0\0\0\0\x80\x18\0\0\xb7\x03\0\0\x20\0\0\0\x85\
-\0\0\0\xa6\0\0\0\xbf\x07\0\0\0\0\0\0\xc5\x07\x2c\xff\0\0\0\0\x18\x62\0\0\0\0\0\
-\0\0\0\0\0\x14\0\0\0\x61\x20\0\0\0\0\0\0\x18\x61\0\0\0\0\0\0\0\0\0\0\xa0\x18\0\
-\0\x63\x01\0\0\0\0\0\0\xb7\x01\0\0\x16\0\0\0\x18\x62\0\0\0\0\0\0\0\0\0\0\xa0\
-\x18\0\0\xb7\x03\0\0\x04\0\0\0\x85\0\0\0\xa6\0\0\0\xbf\x07\0\0\0\0\0\0\xc5\x07\
-\x1f\xff\0\0\0\0\x61\x60\x7c\0\0\0\0\0\x15\0\x03\0\0\0\0\0\x18\x61\0\0\0\0\0\0\
-\0\0\0\0\xb4\x18\0\0\x63\x01\0\0\0\0\0\0\xb7\x01\0\0\0\0\0\0\x18\x62\0\0\0\0\0\
-\0\0\0\0\0\xa8\x18\0\0\xb7\x03\0\0\x48\0\0\0\x85\0\0\0\xa6\0\0\0\xbf\x07\0\0\0\
-\0\0\0\xc5\x07\x13\xff\0\0\0\0\x18\x61\0\0\0\0\0\0\0\0\0\0\x18\0\0\0\x63\x71\0\
-\0\0\0\0\0\x79\x63\x80\0\0\0\0\0\x15\x03\x08\0\0\0\0\0\x18\x61\0\0\0\0\0\0\0\0\
-\0\0\xf0\x18\0\0\xb7\x02\0\0\x0c\0\0\0\x61\x60\x04\0\0\0\0\0\x45\0\x02\0\x01\0\
-\0\0\x85\0\0\0\x94\0\0\0\x05\0\x01\0\0\0\0\0\x85\0\0\0\x71\0\0\0\x18\x62\0\0\0\
-\0\0\0\0\0\0\0\x18\0\0\0\x61\x20\0\0\0\0\0\0\x18\x61\0\0\0\0\0\0\0\0\0\0\x08\
-\x19\0\0\x63\x01\0\0\0\0\0\0\x18\x60\0\0\0\0\0\0\0\0\0\0\0\x19\0\0\x18\x61\0\0\
-\0\0\0\0\0\0\0\0\x10\x19\0\0\x7b\x01\0\0\0\0\0\0\x18\x60\0\0\0\0\0\0\0\0\0\0\
-\xf0\x18\0\0\x18\x61\0\0\0\0\0\0\0\0\0\0\x18\x19\0\0\x7b\x01\0\0\0\0\0\0\xb7\
-\x01\0\0\x02\0\0\0\x18\x62\0\0\0\0\0\0\0\0\0\0\x08\x19\0\0\xb7\x03\0\0\x20\0\0\
-\0\x85\0\0\0\xa6\0\0\0\xbf\x07\0\0\0\0\0\0\xc5\x07\xef\xfe\0\0\0\0\x18\x62\0\0\
-\0\0\0\0\0\0\0\0\x18\0\0\0\x61\x20\0\0\0\0\0\0\x18\x61\0\0\0\0\0\0\0\0\0\0\x28\
-\x19\0\0\x63\x01\0\0\0\0\0\0\xb7\x01\0\0\x16\0\0\0\x18\x62\0\0\0\0\0\0\0\0\0\0\
-\x28\x19\0\0\xb7\x03\0\0\x04\0\0\0\x85\0\0\0\xa6\0\0\0\xbf\x07\0\0\0\0\0\0\xc5\
-\x07\xe2\xfe\0\0\0\0\x18\x60\0\0\0\0\0\0\0\0\0\0\x30\x19\0\0\x18\x61\0\0\0\0\0\
-\0\0\0\0\0\x38\x22\0\0\x7b\x01\0\0\0\0\0\0\x18\x60\0\0\0\0\0\0\0\0\0\0\x38\x19\
-\0\0\x18\x61\0\0\0\0\0\0\0\0\0\0\x30\x22\0\0\x7b\x01\0\0\0\0\0\0\x18\x60\0\0\0\
-\0\0\0\0\0\0\0\x10\x1f\0\0\x18\x61\0\0\0\0\0\0\0\0\0\0\x78\x22\0\0\x7b\x01\0\0\
-\0\0\0\0\x18\x60\0\0\0\0\0\0\0\0\0\0\x18\x1f\0\0\x18\x61\0\0\0\0\0\0\0\0\0\0\
-\x88\x22\0\0\x7b\x01\0\0\0\0\0\0\x18\x60\0\0\0\0\0\0\0\0\0\0\x28\x22\0\0\x18\
-\x61\0\0\0\0\0\0\0\0\0\0\xa8\x22\0\0\x7b\x01\0\0\0\0\0\0\x18\x60\0\0\0\0\0\0\0\
-\0\0\0\0\0\0\0\x18\x61\0\0\0\0\0\0\0\0\0\0\xa0\x22\0\0\x7b\x01\0\0\0\0\0\0\x61\
-\x60\x08\0\0\0\0\0\x18\x61\0\0\0\0\0\0\0\0\0\0\x40\x22\0\0\x63\x01\0\0\0\0\0\0\
-\x61\x60\x0c\0\0\0\0\0\x18\x61\0\0\0\0\0\0\0\0\0\0\x44\x22\0\0\x63\x01\0\0\0\0\
-\0\0\x79\x60\x10\0\0\0\0\0\x18\x61\0\0\0\0\0\0\0\0\0\0\x48\x22\0\0\x7b\x01\0\0\
-\0\0\0\0\x61\xa0\x78\xff\0\0\0\0\x18\x61\0\0\0\0\0\0\0\0\0\0\x70\x22\0\0\x63\
-\x01\0\0\0\0\0\0\x18\x61\0\0\0\0\0\0\0\0\0\0\xb8\x22\0\0\xb7\x02\0\0\x12\0\0\0\
-\xb7\x03\0\0\x0c\0\0\0\xb7\x04\0\0\0\0\0\0\x85\0\0\0\xa7\0\0\0\xbf\x07\0\0\0\0\
-\0\0\xc5\x07\xac\xfe\0\0\0\0\x18\x60\0\0\0\0\0\0\0\0\0\0\x28\x22\0\0\x63\x70\
-\x6c\0\0\0\0\0\x77\x07\0\0\x20\0\0\0\x63\x70\x70\0\0\0\0\0\xb7\x01\0\0\x05\0\0\
-\0\x18\x62\0\0\0\0\0\0\0\0\0\0\x28\x22\0\0\xb7\x03\0\0\x8c\0\0\0\x85\0\0\0\xa6\
-\0\0\0\xbf\x07\0\0\0\0\0\0\x18\x60\0\0\0\0\0\0\0\0\0\0\x98\x22\0\0\x61\x01\0\0\
-\0\0\0\0\xd5\x01\x02\0\0\0\0\0\xbf\x19\0\0\0\0\0\0\x85\0\0\0\xa8\0\0\0\xc5\x07\
-\x9a\xfe\0\0\0\0\x63\x7a\x80\xff\0\0\0\0\x18\x60\0\0\0\0\0\0\0\0\0\0\xd0\x22\0\
-\0\x18\x61\0\0\0\0\0\0\0\0\0\0\x10\x23\0\0\x7b\x01\0\0\0\0\0\0\x18\x60\0\0\0\0\
-\0\0\0\0\0\0\xd8\x22\0\0\x18\x61\0\0\0\0\0\0\0\0\0\0\x08\x23\0\0\x7b\x01\0\0\0\
-\0\0\0\x18\x60\0\0\0\0\0\0\0\0\0\0\xe8\x22\0\0\x18\x61\0\0\0\0\0\0\0\0\0\0\x50\
-\x23\0\0\x7b\x01\0\0\0\0\0\0\x18\x60\0\0\0\0\0\0\0\0\0\0\xf0\x22\0\0\x18\x61\0\
-\0\0\0\0\0\0\0\0\0\x60\x23\0\0\x7b\x01\0\0\0\0\0\0\x18\x60\0\0\0\0\0\0\0\0\0\0\
-\0\x23\0\0\x18\x61\0\0\0\0\0\0\0\0\0\0\x80\x23\0\0\x7b\x01\0\0\0\0\0\0\x18\x60\
-\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x18\x61\0\0\0\0\0\0\0\0\0\0\x78\x23\0\0\x7b\x01\0\
-\0\0\0\0\0\x61\x60\x08\0\0\0\0\0\x18\x61\0\0\0\0\0\0\0\0\0\0\x18\x23\0\0\x63\
-\x01\0\0\0\0\0\0\x61\x60\x0c\0\0\0\0\0\x18\x61\0\0\0\0\0\0\0\0\0\0\x1c\x23\0\0\
-\x63\x01\0\0\0\0\0\0\x79\x60\x10\0\0\0\0\0\x18\x61\0\0\0\0\0\0\0\0\0\0\x20\x23\
-\0\0\x7b\x01\0\0\0\0\0\0\x61\xa0\x78\xff\0\0\0\0\x18\x61\0\0\0\0\0\0\0\0\0\0\
-\x48\x23\0\0\x63\x01\0\0\0\0\0\0\x18\x61\0\0\0\0\0\0\0\0\0\0\x90\x23\0\0\xb7\
-\x02\0\0\x17\0\0\0\xb7\x03\0\0\x0c\0\0\0\xb7\x04\0\0\0\0\0\0\x85\0\0\0\xa7\0\0\
-\0\xbf\x07\0\0\0\0\0\0\xc5\x07\x63\xfe\0\0\0\0\x18\x60\0\0\0\0\0\0\0\0\0\0\0\
-\x23\0\0\x63\x70\x6c\0\0\0\0\0\x77\x07\0\0\x20\0\0\0\x63\x70\x70\0\0\0\0\0\xb7\
-\x01\0\0\x05\0\0\0\x18\x62\0\0\0\0\0\0\0\0\0\0\0\x23\0\0\xb7\x03\0\0\x8c\0\0\0\
-\x85\0\0\0\xa6\0\0\0\xbf\x07\0\0\0\0\0\0\x18\x60\0\0\0\0\0\0\0\0\0\0\x70\x23\0\
-\0\x61\x01\0\0\0\0\0\0\xd5\x01\x02\0\0\0\0\0\xbf\x19\0\0\0\0\0\0\x85\0\0\0\xa8\
-\0\0\0\xc5\x07\x51\xfe\0\0\0\0\x63\x7a\x84\xff\0\0\0\0\x61\xa1\x78\xff\0\0\0\0\
-\xd5\x01\x02\0\0\0\0\0\xbf\x19\0\0\0\0\0\0\x85\0\0\0\xa8\0\0\0\x61\xa0\x80\xff\
-\0\0\0\0\x63\x06\x88\0\0\0\0\0\x61\xa0\x84\xff\0\0\0\0\x63\x06\x8c\0\0\0\0\0\
-\x18\x61\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x61\x10\0\0\0\0\0\0\x63\x06\x18\0\0\0\0\0\
-\x18\x61\0\0\0\0\0\0\0\0\0\0\x04\0\0\0\x61\x10\0\0\0\0\0\0\x63\x06\x28\0\0\0\0\
-\0\x18\x61\0\0\0\0\0\0\0\0\0\0\x08\0\0\0\x61\x10\0\0\0\0\0\0\x63\x06\x38\0\0\0\
-\0\0\x18\x61\0\0\0\0\0\0\0\0\0\0\x0c\0\0\0\x61\x10\0\0\0\0\0\0\x63\x06\x48\0\0\
-\0\0\0\x18\x61\0\0\0\0\0\0\0\0\0\0\x10\0\0\0\x61\x10\0\0\0\0\0\0\x63\x06\x58\0\
-\0\0\0\0\x18\x61\0\0\0\0\0\0\0\0\0\0\x14\0\0\0\x61\x10\0\0\0\0\0\0\x63\x06\x68\
-\0\0\0\0\0\x18\x61\0\0\0\0\0\0\0\0\0\0\x18\0\0\0\x61\x10\0\0\0\0\0\0\x63\x06\
-\x78\0\0\0\0\0\xb7\0\0\0\0\0\0\0\x95\0\0\0\0\0\0\0";
opts.ctx = (struct bpf_loader_ctx *)skel;
- opts.data_sz = sizeof(opts_data) - 1;
+ opts.data_sz = opts_data_sz;
opts.data = (void *)opts_data;
- opts.insns_sz = sizeof(opts_insn) - 1;
+ opts.insns_sz = opts_insn_sz;
opts.insns = (void *)opts_insn;
err = bpf_load_and_run(&opts);
The interface between bpf-prog and the kernel are constituted by: four ringbuf an array SEC("fentry/bpf_handle_pefile") SEC("fentry/bpf_post_handle_pefile") They are fixed and shared by all kexec bpf-prog. For different kexec bpf-prog, the opts_data[] and opts_insn[] generated by 'bpftool gen skeleton -L ' contains the bytecode to parse different file format. They can be split out and compiled as an ELF. The ELF can be embeded in a PE file (e.g. vmlinuz.efi or UKI) as a '.bpf' section. So opts_data[] and opts_insn[] can be extracted and run in kernel. By this way, the integrity of bpf-prog can be protected by the signature of the outermost PE file. Signed-off-by: Pingfan Liu <piliu@redhat.com> Cc: Alexei Starovoitov <ast@kernel.org> Cc: Baoquan He <bhe@redhat.com> Cc: Dave Young <dyoung@redhat.com> Cc: Eric Biederman <ebiederm@xmission.com> Cc: bpf@vger.kernel.org To: kexec@lists.infradead.org --- kernel/kexec_pe_image.c | 60 ++++ kernel/kexec_pe_parser_lskel.h | 484 +-------------------------------- 2 files changed, 65 insertions(+), 479 deletions(-)