From 79a18447fe70c67d682bcf585c2234efca25f46a Mon Sep 17 00:00:00 2001 From: "kfraser@localhost.localdomain" Date: Wed, 1 Aug 2007 19:17:08 +0100 Subject: [PATCH 01/24] xenstore: Do not assign to stdout/stderr/stdin - they are not implemented as variables on all systems. Signed-off-by: Keir Fraser --- tools/xenstore/utils.c | 7 +++---- tools/xenstore/utils.h | 2 +- tools/xenstore/xenstored_core.c | 6 +----- 3 files changed, 5 insertions(+), 10 deletions(-) diff --git a/tools/xenstore/utils.c b/tools/xenstore/utils.c index d7f5219a87..a1ac12584a 100644 --- a/tools/xenstore/utils.c +++ b/tools/xenstore/utils.c @@ -10,19 +10,18 @@ #include #include "utils.h" -void xprintf(const char *fmt, ...) +static void default_xprintf(const char *fmt, ...) { va_list args; - if (!stderr) - return; /* could trace()? */ - va_start(args, fmt); vfprintf(stderr, fmt, args); va_end(args); fflush(stderr); } +void (*xprintf)(const char *fmt, ...) = default_xprintf; + void barf(const char *fmt, ...) { char *str; diff --git a/tools/xenstore/utils.h b/tools/xenstore/utils.h index ce14f3a408..f378343707 100644 --- a/tools/xenstore/utils.h +++ b/tools/xenstore/utils.h @@ -24,7 +24,7 @@ static inline bool strends(const char *a, const char *b) void barf(const char *fmt, ...) __attribute__((noreturn)); void barf_perror(const char *fmt, ...) __attribute__((noreturn)); -void xprintf(const char *fmt, ...); +void (*xprintf)(const char *fmt, ...); #define eprintf(_fmt, _args...) xprintf("[ERR] %s" _fmt, __FUNCTION__, ##_args) diff --git a/tools/xenstore/xenstored_core.c b/tools/xenstore/xenstored_core.c index fc3171f14b..a969bcff56 100644 --- a/tools/xenstore/xenstored_core.c +++ b/tools/xenstore/xenstored_core.c @@ -1883,11 +1883,7 @@ int main(int argc, char *argv[]) close(STDIN_FILENO); close(STDOUT_FILENO); close(STDERR_FILENO); - - /* Get ourselves a nice xenstored crash if these are used. */ - stdin = NULL; - stdout = NULL; - stderr = NULL; + xprintf = trace; /* xprintf() must not use stderr */ } signal(SIGHUP, trigger_reopen_log); From 140b3cd6278a9f663a4fe64b38936d60791c18c9 Mon Sep 17 00:00:00 2001 From: "kfraser@localhost.localdomain" Date: Wed, 1 Aug 2007 19:34:56 +0100 Subject: [PATCH 02/24] xenstore: Redirect stdin/stdout/stderr to /dev/null. Signed-off-by: Keir Fraser --- tools/xenstore/xenstored_core.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/tools/xenstore/xenstored_core.c b/tools/xenstore/xenstored_core.c index a969bcff56..e68004ad05 100644 --- a/tools/xenstore/xenstored_core.c +++ b/tools/xenstore/xenstored_core.c @@ -1880,10 +1880,14 @@ int main(int argc, char *argv[]) /* close stdin/stdout now we're ready to accept connections */ if (dofork) { - close(STDIN_FILENO); - close(STDOUT_FILENO); - close(STDERR_FILENO); - xprintf = trace; /* xprintf() must not use stderr */ + int devnull = open("/dev/null", O_RDWR); + if (devnull == -1) + barf_perror("Could not open /dev/null\n"); + close(STDIN_FILENO); dup2(STDIN_FILENO, devnull); + close(STDOUT_FILENO); dup2(STDOUT_FILENO, devnull); + close(STDERR_FILENO); dup2(STDERR_FILENO, devnull); + close(devnull); + xprintf = trace; } signal(SIGHUP, trigger_reopen_log); From 5c0ffac838df120817e93dfe06574a5ffba522e2 Mon Sep 17 00:00:00 2001 From: Tim Deegan Date: Thu, 2 Aug 2007 09:02:08 +0100 Subject: [PATCH 03/24] [MINIOS] fix x86_64 p2m map and CFLAGS Signed-off-by: Tim Deegan --- extras/mini-os/Makefile | 4 ++++ extras/mini-os/arch/x86/Makefile | 3 +++ extras/mini-os/arch/x86/mm.c | 6 +++--- 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/extras/mini-os/Makefile b/extras/mini-os/Makefile index 75427676e5..26fe5ca8f6 100644 --- a/extras/mini-os/Makefile +++ b/extras/mini-os/Makefile @@ -123,3 +123,7 @@ cscope: tags: $(all_sources) | xargs ctags +.PHONY: TAGS +TAGS: + $(all_sources) | xargs etags + diff --git a/extras/mini-os/arch/x86/Makefile b/extras/mini-os/arch/x86/Makefile index 10cb1ff9a1..22cfe82811 100644 --- a/extras/mini-os/arch/x86/Makefile +++ b/extras/mini-os/arch/x86/Makefile @@ -3,6 +3,9 @@ # It's is used for x86_32, x86_32y and x86_64 # +XEN_ROOT = ../../../.. +include $(XEN_ROOT)/Config.mk + # include arch.mk has to be before mini-os.mk! include arch.mk diff --git a/extras/mini-os/arch/x86/mm.c b/extras/mini-os/arch/x86/mm.c index 15ed4877a8..8d4a8d42fb 100644 --- a/extras/mini-os/arch/x86/mm.c +++ b/extras/mini-os/arch/x86/mm.c @@ -405,9 +405,9 @@ void *map_frames(unsigned long *f, unsigned long n) void arch_init_p2m(unsigned long max_pfn) { -#define L1_P2M_SHIFT 10 -#define L2_P2M_SHIFT 20 -#define L3_P2M_SHIFT 30 +#define L1_P2M_SHIFT 9 +#define L2_P2M_SHIFT 18 +#define L3_P2M_SHIFT 27 #define L1_P2M_ENTRIES (1 << L1_P2M_SHIFT) #define L2_P2M_ENTRIES (1 << (L2_P2M_SHIFT - L1_P2M_SHIFT)) #define L3_P2M_ENTRIES (1 << (L3_P2M_SHIFT - L2_P2M_SHIFT)) From 9ce0c8557873af4936b3507bc9290ce5c0299baa Mon Sep 17 00:00:00 2001 From: "kfraser@localhost.localdomain" Date: Thu, 2 Aug 2007 09:53:13 +0100 Subject: [PATCH 04/24] libelf: Remove unneeded extra elf_set_verbose() invocation. Signed-off-by: Keir Fraser --- xen/common/libelf/libelf-loader.c | 4 ---- 1 file changed, 4 deletions(-) diff --git a/xen/common/libelf/libelf-loader.c b/xen/common/libelf/libelf-loader.c index bfb3cab57b..21e44be848 100644 --- a/xen/common/libelf/libelf-loader.c +++ b/xen/common/libelf/libelf-loader.c @@ -26,10 +26,6 @@ int elf_init(struct elf_binary *elf, const char *image, size_t size) elf->class = elf->ehdr->e32.e_ident[EI_CLASS]; elf->data = elf->ehdr->e32.e_ident[EI_DATA]; -#ifdef VERBOSE - elf_set_verbose(elf); -#endif - /* Sanity check phdr. */ offset = elf_uval(elf, elf->ehdr, e_phoff) + elf_uval(elf, elf->ehdr, e_phentsize) * elf_phdr_count(elf); From d2d0d5dd8307ec9b26a5c110621ef30426ce79d6 Mon Sep 17 00:00:00 2001 From: "kfraser@localhost.localdomain" Date: Thu, 2 Aug 2007 10:05:14 +0100 Subject: [PATCH 05/24] elfloader: Re-add break stmt I stupidly removed from elf parser. Signed-off-by: Keir Fraser --- xen/common/libelf/libelf-loader.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/xen/common/libelf/libelf-loader.c b/xen/common/libelf/libelf-loader.c index 21e44be848..3b68036382 100644 --- a/xen/common/libelf/libelf-loader.c +++ b/xen/common/libelf/libelf-loader.c @@ -93,6 +93,8 @@ int elf_init(struct elf_binary *elf, const char *image, size_t size) elf->send = high; elf_msg(elf, "%s: symbol map: 0x%" PRIx64 " -> 0x%" PRIx64 "\n", __FUNCTION__, elf->sstart, elf->send); + + break; } return 0; From 3e6b2f19e30b479b7b5fe86bc0d26853a1af0e71 Mon Sep 17 00:00:00 2001 From: "kfraser@localhost.localdomain" Date: Thu, 2 Aug 2007 14:18:38 +0100 Subject: [PATCH 06/24] libelf: Clean up and fix up BSD symtab handling. Should now (hopefully) work for domU and dom0 builders. Signed-off-by: Keir Fraser --- xen/arch/x86/domain_build.c | 8 +- xen/common/libelf/libelf-dominfo.c | 104 ++--------------------- xen/common/libelf/libelf-loader.c | 128 ++++++++++++++++++++++------- xen/common/libelf/libelf-tools.c | 30 ------- xen/include/public/libelf.h | 18 ++-- 5 files changed, 114 insertions(+), 174 deletions(-) diff --git a/xen/arch/x86/domain_build.c b/xen/arch/x86/domain_build.c index 2311f2e9c2..4cfd0433c1 100644 --- a/xen/arch/x86/domain_build.c +++ b/xen/arch/x86/domain_build.c @@ -316,9 +316,9 @@ int __init construct_dom0( parms.pae ? ", PAE" : "", elf_msb(&elf) ? "msb" : "lsb", elf.pstart, elf.pend); - if ( parms.bsd_symtab ) + if ( elf.bsd_symtab_pstart ) printk(" Dom0 symbol map 0x%" PRIx64 " -> 0x%" PRIx64 "\n", - elf.sstart, elf.send); + elf.bsd_symtab_pstart, elf.bsd_symtab_pend); if ( !compatible ) { @@ -388,7 +388,7 @@ int __init construct_dom0( v_start = parms.virt_base; vkern_start = parms.virt_kstart; vkern_end = parms.virt_kend; - vinitrd_start = round_pgup(parms.virt_end); + vinitrd_start = round_pgup(vkern_end); vinitrd_end = vinitrd_start + initrd_len; vphysmap_start = round_pgup(vinitrd_end); vphysmap_end = vphysmap_start + (nr_pages * (!is_pv_32on64_domain(d) ? @@ -798,7 +798,7 @@ int __init construct_dom0( /* Copy the OS image and free temporary buffer. */ elf.dest = (void*)vkern_start; - elf_xen_dom_load_binary(&elf, &parms); + elf_load_binary(&elf); if ( UNSET_ADDR != parms.virt_hypercall ) { diff --git a/xen/common/libelf/libelf-dominfo.c b/xen/common/libelf/libelf-dominfo.c index cff6710749..6b1a6379fc 100644 --- a/xen/common/libelf/libelf-dominfo.c +++ b/xen/common/libelf/libelf-dominfo.c @@ -333,99 +333,6 @@ static int elf_xen_note_check(struct elf_binary *elf, return 0; } - -static void elf_xen_loadsymtab(struct elf_binary *elf, - struct elf_dom_parms *parms) -{ - unsigned long maxva, len; - - if ( !parms->bsd_symtab ) - return; - - /* Calculate the required additional kernel space for the elf image */ - - /* The absolute base address of the elf image */ - maxva = elf_round_up(elf, parms->virt_kend); - maxva += sizeof(long); /* Space to store the size of the elf image */ - /* Space for the elf and elf section headers */ - maxva += (elf_uval(elf, elf->ehdr, e_ehsize) + - elf_shdr_count(elf) * elf_uval(elf, elf->ehdr, e_shentsize)); - maxva = elf_round_up(elf, maxva); - - /* Space for the symbol and string tabs */ - len = (unsigned long)elf->send - (unsigned long)elf->sstart; - maxva = elf_round_up(elf, maxva + len); - - /* The address the kernel must expanded to */ - parms->virt_end = maxva; -} - -int elf_xen_dom_load_binary(struct elf_binary *elf, - struct elf_dom_parms *parms) -{ - elf_ehdr *sym_ehdr; - unsigned long shdr, symtab_addr; - unsigned long maxva, symbase; - uint8_t i; - char *p; - - elf_load_binary(elf); - - if ( !parms->bsd_symtab ) - return 0; - -#define elf_hdr_elm(_elf, _hdr, _elm, _val) \ -do { \ - if ( elf_64bit(_elf) ) \ - (_hdr)->e64._elm = _val; \ - else \ - (_hdr)->e32._elm = _val; \ -} while ( 0 ) - - /* ehdr right after the kernel image (4 byte aligned) */ - symbase = elf_round_up(elf, parms->virt_kend); - symtab_addr = maxva = symbase + sizeof(long); - - /* Set up Elf header. */ - sym_ehdr = (elf_ehdr *)symtab_addr; - maxva = elf_copy_ehdr(elf, sym_ehdr); - - elf_hdr_elm(elf, sym_ehdr, e_phoff, 0); - elf_hdr_elm(elf, sym_ehdr, e_shoff, elf_uval(elf, elf->ehdr, e_ehsize)); - elf_hdr_elm(elf, sym_ehdr, e_phentsize, 0); - elf_hdr_elm(elf, sym_ehdr, e_phnum, 0); - - /* Copy Elf section headers. */ - shdr = maxva; - maxva = elf_copy_shdr(elf, (elf_shdr *)shdr); - - for ( i = 0; i < elf_shdr_count(elf); i++ ) - { - uint8_t type; - unsigned long tmp; - type = elf_uval(elf, (elf_shdr *)shdr, sh_type); - if ( (type == SHT_STRTAB) || (type == SHT_SYMTAB) ) - { - elf_msg(elf, "%s: shdr %i at 0x%p -> 0x%p\n", __func__, i, - elf_section_start(elf, (elf_shdr *)shdr), (void *)maxva); - tmp = elf_copy_section(elf, (elf_shdr *)shdr, (void *)maxva); - /* Mangled to be based on ELF header location. */ - elf_hdr_elm(elf, (elf_shdr *)shdr, sh_offset, - maxva - symtab_addr); - maxva = tmp; - } - shdr += elf_uval(elf, elf->ehdr, e_shentsize); - } - - /* Write down the actual sym size. */ - p = (char *)symbase; - *(long *)p = maxva - symtab_addr; /* sym size */ - -#undef elf_ehdr_elm - - return 0; -} - static int elf_xen_addr_calc_check(struct elf_binary *elf, struct elf_dom_parms *parms) { @@ -467,13 +374,16 @@ static int elf_xen_addr_calc_check(struct elf_binary *elf, parms->virt_offset = parms->virt_base - parms->elf_paddr_offset; parms->virt_kstart = elf->pstart + parms->virt_offset; parms->virt_kend = elf->pend + parms->virt_offset; - parms->virt_end = parms->virt_kend; if ( parms->virt_entry == UNSET_ADDR ) parms->virt_entry = elf_uval(elf, elf->ehdr, e_entry); if ( parms->bsd_symtab ) - elf_xen_loadsymtab(elf, parms); + { + elf_parse_bsdsyms(elf, parms->virt_kend); + if ( elf->bsd_symtab_pend ) + parms->virt_kend = elf->bsd_symtab_pend + parms->virt_offset; + } elf_msg(elf, "%s: addresses:\n", __FUNCTION__); elf_msg(elf, " virt_base = 0x%" PRIx64 "\n", parms->virt_base); @@ -481,14 +391,12 @@ static int elf_xen_addr_calc_check(struct elf_binary *elf, elf_msg(elf, " virt_offset = 0x%" PRIx64 "\n", parms->virt_offset); elf_msg(elf, " virt_kstart = 0x%" PRIx64 "\n", parms->virt_kstart); elf_msg(elf, " virt_kend = 0x%" PRIx64 "\n", parms->virt_kend); - elf_msg(elf, " virt_end = 0x%" PRIx64 "\n", parms->virt_end); elf_msg(elf, " virt_entry = 0x%" PRIx64 "\n", parms->virt_entry); if ( (parms->virt_kstart > parms->virt_kend) || (parms->virt_entry < parms->virt_kstart) || (parms->virt_entry > parms->virt_kend) || - (parms->virt_base > parms->virt_kstart) || - (parms->virt_kend > parms->virt_end) ) + (parms->virt_base > parms->virt_kstart) ) { elf_err(elf, "%s: ERROR: ELF start or entries are out of bounds.\n", __FUNCTION__); diff --git a/xen/common/libelf/libelf-loader.c b/xen/common/libelf/libelf-loader.c index 3b68036382..5e86555817 100644 --- a/xen/common/libelf/libelf-loader.c +++ b/xen/common/libelf/libelf-loader.c @@ -10,8 +10,6 @@ int elf_init(struct elf_binary *elf, const char *image, size_t size) { const elf_shdr *shdr; uint64_t i, count, section, offset; - uint64_t low = -1; - uint64_t high = 0; if ( !elf_is_elfbinary(image) ) { @@ -22,7 +20,7 @@ int elf_init(struct elf_binary *elf, const char *image, size_t size) memset(elf, 0, sizeof(*elf)); elf->image = image; elf->size = size; - elf->ehdr = (elf_ehdr *) image; + elf->ehdr = (elf_ehdr *)image; elf->class = elf->ehdr->e32.e_ident[EI_CLASS]; elf->data = elf->ehdr->e32.e_ident[EI_DATA]; @@ -56,44 +54,17 @@ int elf_init(struct elf_binary *elf, const char *image, size_t size) count = elf_shdr_count(elf); for ( i = 0; i < count; i++ ) { - const char *sh_symend, *sh_strend; - shdr = elf_shdr_by_index(elf, i); if ( elf_uval(elf, shdr, sh_type) != SHT_SYMTAB ) continue; elf->sym_tab = shdr; - sh_symend = (const char *)elf_section_end(elf, shdr); shdr = elf_shdr_by_index(elf, elf_uval(elf, shdr, sh_link)); if ( shdr == NULL ) { elf->sym_tab = NULL; - sh_symend = 0; continue; } elf->sym_strtab = elf_section_start(elf, shdr); - sh_strend = (const char *)elf_section_end(elf, shdr); - - if ( low > (unsigned long)elf->sym_tab ) - low = (unsigned long)elf->sym_tab; - if ( low > (unsigned long)shdr ) - low = (unsigned long)shdr; - - if ( high < ((unsigned long)sh_symend) ) - high = (unsigned long)sh_symend; - if ( high < ((unsigned long)sh_strend) ) - high = (unsigned long)sh_strend; - - elf_msg(elf, "%s: shdr: sym_tab=%p size=0x%" PRIx64 "\n", - __FUNCTION__, elf->sym_tab, - elf_uval(elf, elf->sym_tab, sh_size)); - elf_msg(elf, "%s: shdr: str_tab=%p size=0x%" PRIx64 "\n", - __FUNCTION__, elf->sym_strtab, elf_uval(elf, shdr, sh_size)); - - elf->sstart = low; - elf->send = high; - elf_msg(elf, "%s: symbol map: 0x%" PRIx64 " -> 0x%" PRIx64 "\n", - __FUNCTION__, elf->sstart, elf->send); - break; } @@ -113,6 +84,101 @@ void elf_set_verbose(struct elf_binary *elf) } #endif +/* Calculate the required additional kernel space for the elf image */ +void elf_parse_bsdsyms(struct elf_binary *elf, uint64_t pstart) +{ + uint64_t sz; + const elf_shdr *shdr; + int i, type; + + if ( !elf->sym_tab ) + return; + + pstart = elf_round_up(elf, pstart); + + /* Space to store the size of the elf image */ + sz = sizeof(uint32_t); + + /* Space for the elf and elf section headers */ + sz += (elf_uval(elf, elf->ehdr, e_ehsize) + + elf_shdr_count(elf) * elf_uval(elf, elf->ehdr, e_shentsize)); + sz = elf_round_up(elf, sz); + + /* Space for the symbol and string tables. */ + for ( i = 0; i < elf_shdr_count(elf); i++ ) + { + shdr = elf_shdr_by_index(elf, i); + type = elf_uval(elf, (elf_shdr *)shdr, sh_type); + if ( (type == SHT_STRTAB) || (type == SHT_SYMTAB) ) + sz = elf_round_up(elf, sz + elf_uval(elf, shdr, sh_size)); + } + + elf->bsd_symtab_pstart = pstart; + elf->bsd_symtab_pend = pstart + sz; +} + +static void elf_load_bsdsyms(struct elf_binary *elf) +{ + elf_ehdr *sym_ehdr; + unsigned long sz; + char *maxva, *symbase, *symtab_addr; + elf_shdr *shdr; + int i, type; + + if ( !elf->bsd_symtab_pstart ) + return; + +#define elf_hdr_elm(_elf, _hdr, _elm, _val) \ +do { \ + if ( elf_64bit(_elf) ) \ + (_hdr)->e64._elm = _val; \ + else \ + (_hdr)->e32._elm = _val; \ +} while ( 0 ) + + symbase = elf_get_ptr(elf, elf->bsd_symtab_pstart); + symtab_addr = maxva = symbase + sizeof(uint32_t); + + /* Set up Elf header. */ + sym_ehdr = (elf_ehdr *)symtab_addr; + sz = elf_uval(elf, elf->ehdr, e_ehsize); + memcpy(sym_ehdr, elf->ehdr, sz); + maxva += sz; /* no round up */ + + elf_hdr_elm(elf, sym_ehdr, e_phoff, 0); + elf_hdr_elm(elf, sym_ehdr, e_shoff, elf_uval(elf, elf->ehdr, e_ehsize)); + elf_hdr_elm(elf, sym_ehdr, e_phentsize, 0); + elf_hdr_elm(elf, sym_ehdr, e_phnum, 0); + + /* Copy Elf section headers. */ + shdr = (elf_shdr *)maxva; + sz = elf_shdr_count(elf) * elf_uval(elf, elf->ehdr, e_shentsize); + memcpy(shdr, elf->image + elf_uval(elf, elf->ehdr, e_shoff), sz); + maxva = (char *)(long)elf_round_up(elf, (long)maxva + sz); + + for ( i = 0; i < elf_shdr_count(elf); i++ ) + { + type = elf_uval(elf, shdr, sh_type); + if ( (type == SHT_STRTAB) || (type == SHT_SYMTAB) ) + { + elf_msg(elf, "%s: shdr %i at 0x%p -> 0x%p\n", __func__, i, + elf_section_start(elf, shdr), maxva); + sz = elf_uval(elf, shdr, sh_size); + memcpy(maxva, elf_section_start(elf, shdr), sz); + /* Mangled to be based on ELF header location. */ + elf_hdr_elm(elf, shdr, sh_offset, maxva - symtab_addr); + maxva = (char *)(long)elf_round_up(elf, (long)maxva + sz); + } + shdr = (elf_shdr *)((long)shdr + + (long)elf_uval(elf, elf->ehdr, e_shentsize)); + } + + /* Write down the actual sym size. */ + *(uint32_t *)symbase = maxva - symtab_addr; + +#undef elf_ehdr_elm +} + void elf_parse_binary(struct elf_binary *elf) { const elf_phdr *phdr; @@ -163,6 +229,8 @@ void elf_load_binary(struct elf_binary *elf) memcpy(dest, elf->image + offset, filesz); memset(dest + filesz, 0, memsz - filesz); } + + elf_load_bsdsyms(elf); } void *elf_get_ptr(struct elf_binary *elf, unsigned long addr) diff --git a/xen/common/libelf/libelf-tools.c b/xen/common/libelf/libelf-tools.c index c383a03111..99a0a91576 100644 --- a/xen/common/libelf/libelf-tools.c +++ b/xen/common/libelf/libelf-tools.c @@ -238,36 +238,6 @@ int elf_phdr_is_loadable(struct elf_binary *elf, const elf_phdr * phdr) return ((p_type == PT_LOAD) && (p_flags & (PF_W | PF_X)) != 0); } -unsigned long -elf_copy_ehdr(struct elf_binary *elf, void *dest) -{ - uint64_t size; - - size = elf_uval(elf, elf->ehdr, e_ehsize); - memcpy(dest, elf->ehdr, size); - return elf_round_up(elf, (unsigned long)(dest) + size); -} - -unsigned long -elf_copy_shdr(struct elf_binary *elf, void *dest) -{ - uint64_t size; - - size = elf_shdr_count(elf) * elf_uval(elf, elf->ehdr, e_shentsize); - memcpy(dest, elf->image + elf_uval(elf, elf->ehdr, e_shoff), size); - return elf_round_up(elf, (unsigned long)(dest) + size); -} - -unsigned long -elf_copy_section(struct elf_binary *elf, const elf_shdr *shdr, void *dest) -{ - uint64_t size; - - size = elf_uval(elf, shdr, sh_size); - memcpy(dest, elf_section_start(elf, shdr), size); - return elf_round_up(elf, (unsigned long)(dest) + size); -} - /* * Local variables: * mode: C diff --git a/xen/include/public/libelf.h b/xen/include/public/libelf.h index 929fa1ec6c..4f61b0a545 100644 --- a/xen/include/public/libelf.h +++ b/xen/include/public/libelf.h @@ -65,12 +65,13 @@ struct elf_binary { /* loaded to */ char *dest; - uint64_t sstart; - uint64_t send; uint64_t pstart; uint64_t pend; uint64_t reloc_offset; + uint64_t bsd_symtab_pstart; + uint64_t bsd_symtab_pend; + #ifndef __XEN__ /* misc */ FILE *log; @@ -150,11 +151,6 @@ const elf_note *elf_note_next(struct elf_binary *elf, const elf_note * note); int elf_is_elfbinary(const void *image); int elf_phdr_is_loadable(struct elf_binary *elf, const elf_phdr * phdr); -unsigned long elf_copy_ehdr(struct elf_binary *elf, void *dest); -unsigned long elf_copy_shdr(struct elf_binary *elf, void *dest); -unsigned long elf_copy_section(struct elf_binary *elf, - const elf_shdr *shdr, void *dest); - /* ------------------------------------------------------------------------ */ /* xc_libelf_loader.c */ @@ -171,6 +167,8 @@ void elf_load_binary(struct elf_binary *elf); void *elf_get_ptr(struct elf_binary *elf, unsigned long addr); uint64_t elf_lookup_addr(struct elf_binary *elf, const char *symbol); +void elf_parse_bsdsyms(struct elf_binary *elf, uint64_t pstart); /* private */ + /* ------------------------------------------------------------------------ */ /* xc_libelf_relocate.c */ @@ -221,8 +219,7 @@ struct elf_dom_parms { /* calculated */ uint64_t virt_offset; uint64_t virt_kstart; - uint64_t virt_kend; /* end of kernel image */ - uint64_t virt_end; /* end of kernel symtab (== virt_kend if none) */ + uint64_t virt_kend; }; static inline void elf_xen_feature_set(int nr, uint32_t * addr) @@ -245,7 +242,4 @@ int elf_xen_parse_guest_info(struct elf_binary *elf, int elf_xen_parse(struct elf_binary *elf, struct elf_dom_parms *parms); -int elf_xen_dom_load_binary(struct elf_binary *elf, - struct elf_dom_parms *parms); - #endif /* __XC_LIBELF__ */ From 1813dfa417134c05c5ba62f6abff9e0629666dfc Mon Sep 17 00:00:00 2001 From: Hollis Blanchard Date: Thu, 2 Aug 2007 09:50:55 -0500 Subject: [PATCH 07/24] [POWERPC][XEN] Commit missing multiboot files. Signed-off-by: Hollis Blanchard --- xen/arch/powerpc/multiboot2.c | 67 +++++++++++++++++++++++ xen/include/asm-powerpc/boot.h | 46 ++++++++++++++++ xen/include/xen/multiboot2.h | 99 ++++++++++++++++++++++++++++++++++ 3 files changed, 212 insertions(+) create mode 100644 xen/arch/powerpc/multiboot2.c create mode 100644 xen/include/asm-powerpc/boot.h create mode 100644 xen/include/xen/multiboot2.h diff --git a/xen/arch/powerpc/multiboot2.c b/xen/arch/powerpc/multiboot2.c new file mode 100644 index 0000000000..fb16738ba0 --- /dev/null +++ b/xen/arch/powerpc/multiboot2.c @@ -0,0 +1,67 @@ +/* + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Copyright IBM Corp. 2006, 2007 + * + * Authors: Hollis Blanchard + */ + +#include +#include +#include +#include +#include + +static struct mb2_tag_module *mb2_tag_mod_find(struct mb2_tag_header *tags, + const char *type) +{ + struct mb2_tag_header *tag; + + for_each_tag(tag, tags) { + if (tag->key == MB2_TAG_MODULE) { + struct mb2_tag_module *mod = (struct mb2_tag_module *)tag; + if (!strcmp((char *)mod->type, type)) + return mod; + } + } + return NULL; +} + +void parse_multiboot(ulong tags_addr) +{ + struct mb2_tag_header *tags = (struct mb2_tag_header *)tags_addr; + struct mb2_tag_module *mod; + + if (tags->key != MB2_TAG_START) + return; + + mod = mb2_tag_mod_find(tags, "kernel"); + if (mod) { + xen_cmdline = (char *)mod->cmdline; + } + + mod = mb2_tag_mod_find(tags, "dom0"); + if (mod) { + dom0_addr = mod->addr; + dom0_len = mod->size; + dom0_cmdline = (char *)mod->cmdline; + } + + mod = mb2_tag_mod_find(tags, "initrd"); + if (mod) { + initrd_start = mod->addr; + initrd_len = mod->size; + } +} diff --git a/xen/include/asm-powerpc/boot.h b/xen/include/asm-powerpc/boot.h new file mode 100644 index 0000000000..462b891bc5 --- /dev/null +++ b/xen/include/asm-powerpc/boot.h @@ -0,0 +1,46 @@ +/* + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Copyright IBM Corp. 2007 + * + * Authors: Hollis Blanchard + */ + +#ifndef _ASM_BOOT_H +#define _ASM_BOOT_H + +/* a collection of interfaces used during boot. */ + +extern void boot_of_init(ulong, ulong); +extern void *boot_of_devtree(void); +extern void boot_of_serial(void *); +extern void boot_of_finish(void); +extern int boot_of_mem_avail(int pos, ulong *startpage, ulong *endpage); + +extern void parse_multiboot(ulong tags_addr); + +extern void memory_init(void); + +extern char *xen_cmdline; +extern ulong dom0_addr; +extern ulong dom0_len; +extern char *dom0_cmdline; +extern ulong initrd_start; +extern ulong initrd_len; + +/* From linker script. */ +extern char builtin_cmdline[]; + +#endif diff --git a/xen/include/xen/multiboot2.h b/xen/include/xen/multiboot2.h new file mode 100644 index 0000000000..3014bba1fb --- /dev/null +++ b/xen/include/xen/multiboot2.h @@ -0,0 +1,99 @@ +/* + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * + * Copyright IBM Corp. 2006, 2007 + * + * Authors: Hollis Blanchard + * + */ + +#ifndef _MULTIBOOT2_H_ +#define _MULTIBOOT2_H_ + +/* How many bytes from the start of the file we search for the header. */ +#define MB2_HEADER_SEARCH 8192 + +/* The magic field should contain this. */ +#define MB2_HEADER_MAGIC 0xe85250d6 + +/* Passed from the bootloader to the kernel. */ +#define MB2_BOOTLOADER_MAGIC 0x36d76289 + +#include + +#define for_each_tag(_tag, _tags) \ + for ((_tag) = (_tags); \ + ((_tag)->key != MB2_TAG_END && (_tag)->key != 0); \ + (_tag) = (void *)(_tag) + (_tag)->len) + +typedef uint32_t mb2_word; + +struct mb2_header +{ + uint32_t magic; +}; + +struct mb2_tag_header +{ + uint32_t key; + uint32_t len; +}; + +#define MB2_TAG_START 1 +struct mb2_tag_start +{ + struct mb2_tag_header header; + mb2_word size; /* Total size of all mb2 tags. */ +}; + +#define MB2_TAG_NAME 2 +struct mb2_tag_name +{ + struct mb2_tag_header header; + char name[1]; +}; + +#define MB2_TAG_MODULE 3 +struct mb2_tag_module +{ + struct mb2_tag_header header; + mb2_word addr; + mb2_word size; + unsigned char type[36]; + unsigned char cmdline[1]; +}; + +#define MB2_TAG_MEMORY 4 +struct mb2_tag_memory +{ + struct mb2_tag_header header; + mb2_word addr; + mb2_word size; + mb2_word type; +}; + +#define MB2_TAG_UNUSED 5 +struct mb2_tag_unused +{ + struct mb2_tag_header header; +}; + +#define MB2_TAG_END 0xffff +struct mb2_tag_end +{ + struct mb2_tag_header header; +}; + +#endif From 81100c2a86950637ff25dbcff47c14e448b19c39 Mon Sep 17 00:00:00 2001 From: "kfraser@localhost.localdomain" Date: Fri, 3 Aug 2007 09:04:29 +0100 Subject: [PATCH 08/24] es7000: Remove the bulk of the ES7000 specific code from Xen. On the Unisys ES7000-One, Xen now uses the bigsmp APIC driver. This patch has been tested on the ES7000 and a commodity box. Signed-off-by: Raj Subrahmanian --- xen/arch/x86/genapic/Makefile | 2 - xen/arch/x86/genapic/bigsmp.c | 10 +- xen/arch/x86/genapic/es7000.c | 27 ---- xen/arch/x86/genapic/es7000plat.c | 141 ------------------ xen/arch/x86/genapic/probe.c | 2 - .../asm-x86/mach-es7000/mach_mpparse.h | 45 ------ 6 files changed, 7 insertions(+), 220 deletions(-) delete mode 100644 xen/arch/x86/genapic/es7000.c delete mode 100644 xen/arch/x86/genapic/es7000plat.c delete mode 100644 xen/include/asm-x86/mach-es7000/mach_mpparse.h diff --git a/xen/arch/x86/genapic/Makefile b/xen/arch/x86/genapic/Makefile index 1fcc2b9edb..83e406d4f7 100644 --- a/xen/arch/x86/genapic/Makefile +++ b/xen/arch/x86/genapic/Makefile @@ -1,7 +1,5 @@ obj-y += bigsmp.o obj-y += default.o obj-y += delivery.o -obj-y += es7000.o -obj-y += es7000plat.o obj-y += probe.o obj-y += summit.o diff --git a/xen/arch/x86/genapic/bigsmp.c b/xen/arch/x86/genapic/bigsmp.c index fb0a4d433b..95a0608b75 100644 --- a/xen/arch/x86/genapic/bigsmp.c +++ b/xen/arch/x86/genapic/bigsmp.c @@ -13,7 +13,7 @@ static int dmi_bigsmp; /* can be set by dmi scanners */ -static __init int hp_ht_bigsmp(struct dmi_system_id *d) +static __init int force_bigsmp(struct dmi_system_id *d) { printk(KERN_NOTICE "%s detected: force use of apic=bigsmp\n", d->ident); dmi_bigsmp = 1; @@ -22,15 +22,19 @@ static __init int hp_ht_bigsmp(struct dmi_system_id *d) static struct dmi_system_id __initdata bigsmp_dmi_table[] = { - { hp_ht_bigsmp, "HP ProLiant DL760 G2", { + { force_bigsmp, "HP ProLiant DL760 G2", { DMI_MATCH(DMI_BIOS_VENDOR, "HP"), DMI_MATCH(DMI_BIOS_VERSION, "P44-"), }}, - { hp_ht_bigsmp, "HP ProLiant DL740", { + { force_bigsmp, "HP ProLiant DL740", { DMI_MATCH(DMI_BIOS_VENDOR, "HP"), DMI_MATCH(DMI_BIOS_VERSION, "P47-"), }}, + { force_bigsmp, "UNISYS ES7000-ONE", { + DMI_MATCH(DMI_PRODUCT_NAME, "ES7000-ONE") + }}, + { } }; diff --git a/xen/arch/x86/genapic/es7000.c b/xen/arch/x86/genapic/es7000.c deleted file mode 100644 index 09228f7dea..0000000000 --- a/xen/arch/x86/genapic/es7000.c +++ /dev/null @@ -1,27 +0,0 @@ -/* - * APIC driver for the Unisys ES7000 chipset. - */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -static __init int probe_es7000(void) -{ - /* probed later in mptable/ACPI hooks */ - return 0; -} - -struct genapic apic_es7000 = { - APIC_INIT("es7000", probe_es7000), - GENAPIC_PHYS -}; diff --git a/xen/arch/x86/genapic/es7000plat.c b/xen/arch/x86/genapic/es7000plat.c deleted file mode 100644 index 895de54fd4..0000000000 --- a/xen/arch/x86/genapic/es7000plat.c +++ /dev/null @@ -1,141 +0,0 @@ -/* - * Written by: Garry Forsgren, Unisys Corporation - * Natalie Protasevich, Unisys Corporation - * Modified by: Raj Subrahmanian Unisys Corp. - * This file contains the code to configure and interface - * with Unisys ES7000 series hardware system manager. - * - * Copyright (c) 2003 Unisys Corporation. All Rights Reserved. - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of version 2 of the GNU General Public License as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it would be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write the Free Software Foundation, Inc., 59 - * Temple Place - Suite 330, Boston MA 02111-1307, USA. - * - * Contact information: Unisys Corporation, Township Line & Union Meeting - * Roads-A, Unisys Way, Blue Bell, Pennsylvania, 19424, or: - * - * http://www.unisys.com - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#define MIP_REG 1 -#define MIP_PSAI_REG 4 - -struct acpi_table_sdt { - unsigned long pa; - unsigned long count; - struct { - unsigned long pa; - enum acpi_table_id id; - unsigned long size; - } entry[50]; -}; - -struct oem_table { - struct acpi_table_header Header; - u32 OEMTableAddr; - u32 OEMTableSize; -}; - -int __init -parse_unisys_oem(char *oemptr) -{ - int i; - int success = 0; - unsigned char type, size; - char *tp = NULL; - - tp = oemptr; - - tp += 8; - - for (i=0; i <= 6; i++) { - type = *tp++; - size = *tp++; - tp -= 2; - switch (type) { - case MIP_REG: - case MIP_PSAI_REG: - success++; - break; - default: - break; - } - tp += size; - } - - return (success >= 2); -} - -int __init -find_unisys_acpi_oem_table(unsigned long *oem_addr) -{ - struct acpi_table_rsdp *rsdp = NULL; - unsigned long rsdp_phys = 0; - struct acpi_table_header *header = NULL; - int i; - struct acpi_table_sdt sdt = { 0 }; /* initialise sdt.count */ - - rsdp_phys = acpi_find_rsdp(); - rsdp = __va(rsdp_phys); - if (rsdp->rsdt_address) { - struct acpi_table_rsdt *mapped_rsdt = NULL; - sdt.pa = rsdp->rsdt_address; - - header = (struct acpi_table_header *) - __acpi_map_table(sdt.pa, sizeof(struct acpi_table_header)); - if (!header) - return -ENODEV; - - sdt.count = (header->length - sizeof(struct acpi_table_header)) >> 3; - mapped_rsdt = (struct acpi_table_rsdt *) - __acpi_map_table(sdt.pa, header->length); - if (!mapped_rsdt) - return -ENODEV; - - header = &mapped_rsdt->header; - - for (i = 0; i < sdt.count; i++) - sdt.entry[i].pa = (unsigned long) mapped_rsdt->entry[i]; - }; - for (i = 0; i < sdt.count; i++) { - - header = (struct acpi_table_header *) - __acpi_map_table(sdt.entry[i].pa, - sizeof(struct acpi_table_header)); - if (!header) - continue; - if (!strncmp((char *) &header->signature, "OEM1", 4)) { - if (!strncmp((char *) &header->oem_id, "UNISYS", 6)) { - void *addr; - struct oem_table *t; - acpi_table_print(header, sdt.entry[i].pa); - t = (struct oem_table *) __acpi_map_table(sdt.entry[i].pa, header->length); - addr = (void *) __acpi_map_table(t->OEMTableAddr, t->OEMTableSize); - *oem_addr = (unsigned long) addr; - return 0; - } - } - } - return -1; -} diff --git a/xen/arch/x86/genapic/probe.c b/xen/arch/x86/genapic/probe.c index 324594bc56..eaf1df24c7 100644 --- a/xen/arch/x86/genapic/probe.c +++ b/xen/arch/x86/genapic/probe.c @@ -16,7 +16,6 @@ extern struct genapic apic_summit; extern struct genapic apic_bigsmp; -extern struct genapic apic_es7000; extern struct genapic apic_default; struct genapic *genapic; @@ -24,7 +23,6 @@ struct genapic *genapic; struct genapic *apic_probe[] __initdata = { &apic_summit, &apic_bigsmp, - &apic_es7000, &apic_default, /* must be last */ NULL, }; diff --git a/xen/include/asm-x86/mach-es7000/mach_mpparse.h b/xen/include/asm-x86/mach-es7000/mach_mpparse.h deleted file mode 100644 index 470793e853..0000000000 --- a/xen/include/asm-x86/mach-es7000/mach_mpparse.h +++ /dev/null @@ -1,45 +0,0 @@ -#ifndef __ASM_MACH_MPPARSE_H -#define __ASM_MACH_MPPARSE_H - -#include - -extern int parse_unisys_oem(char *oemptr); -extern int find_unisys_acpi_oem_table(unsigned long *oem_addr); - -static inline int mps_oem_check(struct mp_config_table *mpc, char *oem, - char *productid) -{ - if (mpc->mpc_oemptr) { - struct mp_config_oemtable *oem_table = - (struct mp_config_oemtable *)(long)mpc->mpc_oemptr; - if (!strncmp(oem, "UNISYS", 6)) - return parse_unisys_oem((char *)oem_table); - } - return 0; -} - -static inline int es7000_check_dsdt(void) -{ - struct acpi_table_header *header = NULL; - if(!acpi_get_table_header_early(ACPI_DSDT, &header)) - acpi_table_print(header, 0); - if (!strncmp(header->oem_id, "UNISYS", 6)) - return 1; - return 0; -} - -/* Hook from generic ACPI tables.c */ -static inline int acpi_madt_oem_check(char *oem_id, char *oem_table_id) -{ - unsigned long oem_addr; - if (!find_unisys_acpi_oem_table(&oem_addr)) { - if (es7000_check_dsdt()) - return parse_unisys_oem((char *)oem_addr); - else - return 1; - } - return 0; -} - - -#endif /* __ASM_MACH_MPPARSE_H */ From e8f0f5cb24be59a8416b9bfb7bd6934ad0d0e946 Mon Sep 17 00:00:00 2001 From: Tim Deegan Date: Fri, 3 Aug 2007 12:10:35 +0100 Subject: [PATCH 09/24] [HVM] Yet another MCA/MCE MSR. Signed-off-by: Tim Deegan --- xen/arch/x86/hvm/svm/svm.c | 1 + xen/arch/x86/hvm/vmx/vmx.c | 1 + xen/include/asm-x86/msr.h | 5 +++++ 3 files changed, 7 insertions(+) diff --git a/xen/arch/x86/hvm/svm/svm.c b/xen/arch/x86/hvm/svm/svm.c index 2cb210e173..4578aaa616 100644 --- a/xen/arch/x86/hvm/svm/svm.c +++ b/xen/arch/x86/hvm/svm/svm.c @@ -2159,6 +2159,7 @@ static void svm_do_msr_access( case MSR_K8_MC2_STATUS: case MSR_K8_MC3_STATUS: case MSR_K8_MC4_STATUS: + case MSR_K8_MC5_STATUS: /* No point in letting the guest see real MCEs */ msr_content = 0; break; diff --git a/xen/arch/x86/hvm/vmx/vmx.c b/xen/arch/x86/hvm/vmx/vmx.c index 61aa6d5b6f..37d8857acc 100644 --- a/xen/arch/x86/hvm/vmx/vmx.c +++ b/xen/arch/x86/hvm/vmx/vmx.c @@ -2596,6 +2596,7 @@ static int vmx_do_msr_read(struct cpu_user_regs *regs) case MSR_K8_MC2_STATUS: case MSR_K8_MC3_STATUS: case MSR_K8_MC4_STATUS: + case MSR_K8_MC5_STATUS: /* No point in letting the guest see real MCEs */ msr_content = 0; break; diff --git a/xen/include/asm-x86/msr.h b/xen/include/asm-x86/msr.h index 862e02c5d3..1f89ee0a37 100644 --- a/xen/include/asm-x86/msr.h +++ b/xen/include/asm-x86/msr.h @@ -240,6 +240,11 @@ static inline void write_efer(__u64 val) #define MSR_K8_MC4_ADDR 0x412 #define MSR_K8_MC4_MISC 0x413 +#define MSR_K8_MC5_CTL 0x414 +#define MSR_K8_MC5_STATUS 0x415 +#define MSR_K8_MC5_ADDR 0x416 +#define MSR_K8_MC5_MISC 0x417 + /* Pentium IV performance counter MSRs */ #define MSR_P4_BPU_PERFCTR0 0x300 #define MSR_P4_BPU_PERFCTR1 0x301 From ae52354f2b02b9acbc2f226b1fcfd82d5b3c8eae Mon Sep 17 00:00:00 2001 From: "kfraser@localhost.localdomain" Date: Fri, 3 Aug 2007 12:22:33 +0100 Subject: [PATCH 10/24] On debug builds, scrub pages with non-zero poison. Will flush out guests which are relying on zeroed memory. Signed-off-by: Keir Fraser --- xen/common/page_alloc.c | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/xen/common/page_alloc.c b/xen/common/page_alloc.c index 1be4933ab9..854887a484 100644 --- a/xen/common/page_alloc.c +++ b/xen/common/page_alloc.c @@ -91,6 +91,14 @@ custom_param("dma_emergency_pool", parse_dma_emergency_pool); #define round_pgdown(_p) ((_p)&PAGE_MASK) #define round_pgup(_p) (((_p)+(PAGE_SIZE-1))&PAGE_MASK) +#ifndef NDEBUG +/* Avoid callers relying on allocations returning zeroed pages. */ +#define scrub_page(p) memset((p), 0xc2, PAGE_SIZE) +#else +/* For a production build, clear_page() is the fastest way to scrub. */ +#define scrub_page(p) clear_page(p) +#endif + static DEFINE_SPINLOCK(page_scrub_lock); LIST_HEAD(page_scrub_list); static unsigned long scrub_pages; @@ -618,13 +626,13 @@ void __init scrub_heap_pages(void) { p = page_to_virt(mfn_to_page(mfn)); memguard_unguard_range(p, PAGE_SIZE); - clear_page(p); + scrub_page(p); memguard_guard_range(p, PAGE_SIZE); } else { p = map_domain_page(mfn); - clear_page(p); + scrub_page(p); unmap_domain_page(p); } } @@ -1018,7 +1026,7 @@ static void page_scrub_softirq(void) pg = list_entry(ent, struct page_info, list); ent = ent->prev; p = map_domain_page(page_to_mfn(pg)); - clear_page(p); + scrub_page(p); unmap_domain_page(p); free_heap_pages(pfn_dom_zone_type(page_to_mfn(pg)), pg, 0); } From 5a9b83aea8ae7cf8a1b7ecb9a37d361ae25c02a2 Mon Sep 17 00:00:00 2001 From: "kfraser@localhost.localdomain" Date: Fri, 3 Aug 2007 12:23:03 +0100 Subject: [PATCH 11/24] domain builder: Zero start_info struct. Signed-off-by: Keir Fraser --- tools/libxc/xc_dom_x86.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tools/libxc/xc_dom_x86.c b/tools/libxc/xc_dom_x86.c index bbb4e1c9bc..1a6aeb1972 100644 --- a/tools/libxc/xc_dom_x86.c +++ b/tools/libxc/xc_dom_x86.c @@ -417,6 +417,7 @@ static int start_info_x86_32(struct xc_dom_image *dom) xc_dom_printf("%s: called\n", __FUNCTION__); + memset(start_info, 0, sizeof(*start_info)); sprintf(start_info->magic, dom->guest_type); start_info->nr_pages = dom->total_pages; start_info->shared_info = shinfo << PAGE_SHIFT_X86; @@ -455,6 +456,7 @@ static int start_info_x86_64(struct xc_dom_image *dom) xc_dom_printf("%s: called\n", __FUNCTION__); + memset(start_info, 0, sizeof(*start_info)); sprintf(start_info->magic, dom->guest_type); start_info->nr_pages = dom->total_pages; start_info->shared_info = shinfo << PAGE_SHIFT_X86; From b163ba1607b51ff361dc7c61e15bbd7277dcb359 Mon Sep 17 00:00:00 2001 From: "kfraser@localhost.localdomain" Date: Mon, 6 Aug 2007 10:10:34 +0100 Subject: [PATCH 12/24] [ACM] Support for running unlabeled domains alongside labeled ones Add support for running unlabeled domains alongside labeled ones, if the policy contains a VM label with name '__UNLABELED__' and an STE type with the same name. The ezpolicy tool has been modified to automatically suggest a policy under which unlabeled domains can run. The user may delete this, if this is not desired. Signed-off-by: Stefan Berger --- tools/python/xen/util/acmpolicy.py | 32 ++++-- tools/python/xen/util/security.py | 8 +- tools/python/xen/xend/XendDomainInfo.py | 2 - tools/python/xen/xend/server/blkif.py | 27 ++--- tools/python/xen/xm/main.py | 3 +- tools/security/xensec_ezpolicy | 7 +- xen/acm/acm_chinesewall_hooks.c | 103 ++++++++++++-------- xen/acm/acm_simple_type_enforcement_hooks.c | 2 +- 8 files changed, 117 insertions(+), 67 deletions(-) diff --git a/tools/python/xen/util/acmpolicy.py b/tools/python/xen/util/acmpolicy.py index 277e6b49fa..5577193a76 100644 --- a/tools/python/xen/util/acmpolicy.py +++ b/tools/python/xen/util/acmpolicy.py @@ -47,6 +47,9 @@ ACM_POLICY_UNDEFINED = 15 ACM_SCHEMA_FILE = "/etc/xen/acm-security/policies/security_policy.xsd" +ACM_LABEL_UNLABELED = "__UNLABELED__" +ACM_LABEL_UNLABELED_DISPLAY = "unlabeled" + class ACMPolicy(XSPolicy): """ ACMPolicy class. Implements methods for getting information from @@ -925,11 +928,13 @@ class ACMPolicy(XSPolicy): return -xsconstants.XSERR_POLICY_INCONSISTENT, "", "" vms_with_chws = [] - chws_by_vm = {} + chws_by_vm = { ACM_LABEL_UNLABELED : [] } for v in vms: if v.has_key("chws"): vms_with_chws.append(v["name"]) chws_by_vm[v["name"]] = v["chws"] + + if bootstrap in vms_with_chws: vms_with_chws.remove(bootstrap) vms_with_chws.sort() @@ -937,12 +942,16 @@ class ACMPolicy(XSPolicy): else: vms_with_chws.sort() + if ACM_LABEL_UNLABELED in vms_with_chws: + vms_with_chws.remove(ACM_LABEL_UNLABELED) ; # @1 + vms_with_stes = [] - stes_by_vm = {} + stes_by_vm = { ACM_LABEL_UNLABELED : [] } for v in vms: if v.has_key("stes"): vms_with_stes.append(v["name"]) stes_by_vm[v["name"]] = v["stes"] + if bootstrap in vms_with_stes: vms_with_stes.remove(bootstrap) vms_with_stes.sort() @@ -950,6 +959,9 @@ class ACMPolicy(XSPolicy): else: vms_with_stes.sort() + if ACM_LABEL_UNLABELED in vms_with_stes: + vms_with_stes.remove(ACM_LABEL_UNLABELED) ; # @2 + resnames = self.policy_get_resourcelabel_names() resnames.sort() stes_by_res = {} @@ -958,6 +970,9 @@ class ACMPolicy(XSPolicy): if r.has_key("stes"): stes_by_res[r["name"]] = r["stes"] + if ACM_LABEL_UNLABELED in resnames: + resnames.remove(ACM_LABEL_UNLABELED) + max_chw_ssids = 1 + len(vms_with_chws) max_chw_types = 1 + len(vms_with_chws) max_ste_ssids = 1 + len(vms_with_stes) + len(resnames) @@ -1083,6 +1098,8 @@ class ACMPolicy(XSPolicy): pr_bin += "\x00" # Build chinese wall part + vms_with_chws.insert(0, ACM_LABEL_UNLABELED) + cfses_names = self.policy_get_chwall_cfses_names_sorted() cfses = self.policy_get_chwall_cfses() @@ -1105,9 +1122,7 @@ class ACMPolicy(XSPolicy): chw_running_types_offset, chw_conf_agg_offset) chw_bin_body = "" - # simulate __NULL_LABEL__ - for c in chws: - chw_bin_body += struct.pack("!h",0) + # VMs that are listed and their chinese walls for v in vms_with_chws: for c in chws: @@ -1143,6 +1158,8 @@ class ACMPolicy(XSPolicy): chw_bin += "\x00" # Build STE part + vms_with_stes.insert(0, ACM_LABEL_UNLABELED) # Took out in @2 + steformat="!iiiii" ste_bin = struct.pack(steformat, ACM_STE_VERSION, @@ -1152,10 +1169,7 @@ class ACMPolicy(XSPolicy): struct.calcsize(steformat)) ste_bin_body = "" if stes: - # Simulate __NULL_LABEL__ - for s in stes: - ste_bin_body += struct.pack("!h",0) - # VMs that are listed and their chinese walls + # VMs that are listed and their STE types for v in vms_with_stes: unknown_ste |= (set(stes_by_vm[v]) - set(stes)) for s in stes: diff --git a/tools/python/xen/util/security.py b/tools/python/xen/util/security.py index 47d51cb20a..9452687336 100644 --- a/tools/python/xen/util/security.py +++ b/tools/python/xen/util/security.py @@ -155,7 +155,7 @@ def calc_dom_ssidref_from_info(info): ssidref = label2ssidref(vmlabel, policyname, "dom") return ssidref else: - return 0 + return 0x0 raise VmError("security.calc_dom_ssidref_from_info: info of type '%s'" "not supported." % type(info)) @@ -232,6 +232,10 @@ def ssidref2label(ssidref_var): else: err("Instance type of ssidref not supported (must be of type 'str' or 'int')") + if ssidref == 0: + from xen.util.acmpolicy import ACM_LABEL_UNLABELED + return ACM_LABEL_UNLABELED + try: mapfile_lock() @@ -867,7 +871,7 @@ def get_domain_resources(dominfo): resources[typ].append("%s:%s:%s" % (xsconstants.ACM_POLICY_ID, active_policy, - "unlabeled")) + ACM_LABEL_UNLABELED)) return resources diff --git a/tools/python/xen/xend/XendDomainInfo.py b/tools/python/xen/xend/XendDomainInfo.py index 9d57d15b33..0d3a8ea055 100644 --- a/tools/python/xen/xend/XendDomainInfo.py +++ b/tools/python/xen/xend/XendDomainInfo.py @@ -1463,8 +1463,6 @@ class XendDomainInfo: ssidref = 0 if security.on(): ssidref = security.calc_dom_ssidref_from_info(self.info) - if ssidref == 0: - raise VmError('VM is not properly labeled.') if security.has_authorization(ssidref) == False: raise VmError("VM is not authorized to run.") diff --git a/tools/python/xen/xend/server/blkif.py b/tools/python/xen/xend/server/blkif.py index 31089b704c..62512a4cd9 100644 --- a/tools/python/xen/xend/server/blkif.py +++ b/tools/python/xen/xend/server/blkif.py @@ -73,17 +73,7 @@ class BlkifController(DevController): back['uuid'] = uuid if security.on(): - (label, ssidref, policy) = \ - security.get_res_security_details(uname) - domain_label = self.vm.get_security_label() - if domain_label: - rc = security.res_security_check_xapi(label, ssidref, policy, - domain_label) - if rc == 0: - raise VmError("VM's access to block device '%s' denied." % - uname) - else: - raise VmError("VM must have a security label.") + self.do_access_control(config, uname) devid = blkif.blkdev_name_to_number(dev) if devid is None: @@ -95,6 +85,21 @@ class BlkifController(DevController): return (devid, back, front) + def do_access_control(self, config, uname): + (label, ssidref, policy) = \ + security.get_res_security_details(uname) + domain_label = self.vm.get_security_label() + if domain_label: + rc = security.res_security_check_xapi(label, ssidref, policy, + domain_label) + if rc == 0: + raise VmError("VM's access to block device '%s' denied" % + uname) + else: + from xen.util.acmpolicy import ACM_LABEL_UNLABELED + if label != ACM_LABEL_UNLABELED: + raise VmError("VM must have a security label to access " + "block device '%s'" % uname) def reconfigureDevice(self, _, config): """@see DevController.reconfigureDevice""" diff --git a/tools/python/xen/xm/main.py b/tools/python/xen/xm/main.py index 9bd95605c7..59210dc526 100644 --- a/tools/python/xen/xm/main.py +++ b/tools/python/xen/xm/main.py @@ -51,6 +51,7 @@ from xen.xm.opts import OptionError, Opts, wrap, set_true from xen.xm import console from xen.util.xmlrpcclient import ServerProxy from xen.util.security import ACMError +from xen.util.acmpolicy import ACM_LABEL_UNLABELED_DISPLAY import XenAPI @@ -947,7 +948,7 @@ def xm_label_list(doms): d = parse_doms_info(dom) if security.active_policy not in ['INACTIVE', 'NULL', 'DEFAULT']: if not d['seclabel']: - d['seclabel'] = 'ERROR' + d['seclabel'] = ACM_LABEL_UNLABELED_DISPLAY elif security.active_policy in ['DEFAULT']: d['seclabel'] = 'DEFAULT' else: diff --git a/tools/security/xensec_ezpolicy b/tools/security/xensec_ezpolicy index 458ff556f2..550196f774 100644 --- a/tools/security/xensec_ezpolicy +++ b/tools/security/xensec_ezpolicy @@ -36,6 +36,8 @@ conflict_bmp = None realm_icon = None workload_icon = None +ACM_LABEL_UNLABELED = '__UNLABELED__' + class orgTreeCtrl(wx.TreeCtrl): event = None @@ -870,7 +872,8 @@ class ezFrame(wx.Frame): self.realm_menu.Enable(self.ID_ORGDEL, True) self.realm_menu.Enable(self.ID_ORGEDT, True) self.realm_menu.Enable(self.ID_ORGADD, True) - if len(self.orgs.GetSelections()) > 1: + if len(self.orgs.GetSelections()) > 1 or \ + ACM_LABEL_UNLABELED == self.orgs.GetItemText(item): self.realm_menu.Enable(self.ID_ORGEDT, False) self.realm_menu.Enable(self.ID_ORGADD, False) self.PopupMenu(self.realm_menu) @@ -1622,6 +1625,8 @@ def main(): app = ezApp(0) if len(sys.argv) in [2]: app.Load(sys.argv[1]) + else: + dict2org({'orgs' : [[ACM_LABEL_UNLABELED,[]]], 'cons': []}) app.MainLoop() print "Goodbye" diff --git a/xen/acm/acm_chinesewall_hooks.c b/xen/acm/acm_chinesewall_hooks.c index 90e20a19d0..b05cecf9ae 100644 --- a/xen/acm/acm_chinesewall_hooks.c +++ b/xen/acm/acm_chinesewall_hooks.c @@ -93,6 +93,7 @@ int acm_init_chwall_policy(void) return ACM_OK; } + static int chwall_init_domain_ssid(void **chwall_ssid, ssidref_t ssidref) { struct chwall_ssid *chwall_ssidp = xmalloc(struct chwall_ssid); @@ -104,10 +105,10 @@ static int chwall_init_domain_ssid(void **chwall_ssid, ssidref_t ssidref) chwall_ssidp->chwall_ssidref = GET_SSIDREF(ACM_CHINESE_WALL_POLICY, ssidref); - if ( (chwall_ssidp->chwall_ssidref >= chwall_bin_pol.max_ssidrefs) - || (chwall_ssidp->chwall_ssidref == ACM_DEFAULT_LOCAL_SSID) ) + if ( chwall_ssidp->chwall_ssidref >= chwall_bin_pol.max_ssidrefs ) { - printkd("%s: ERROR chwall_ssidref(%x) undefined (>max) or unset (0).\n", + printkd("%s: ERROR chwall_ssidref(%x) undefined (>max) or unset " + "(0).\n", __func__, chwall_ssidp->chwall_ssidref); xfree(chwall_ssidp); return ACM_INIT_SSID_ERROR; @@ -118,6 +119,7 @@ static int chwall_init_domain_ssid(void **chwall_ssid, ssidref_t ssidref) return ACM_OK; } + static void chwall_free_domain_ssid(void *chwall_ssid) { xfree(chwall_ssid); @@ -205,7 +207,9 @@ chwall_init_state(struct acm_chwall_policy_buffer *chwall_buf, read_lock(&ssid_list_rwlock); - /* go through all domains and adjust policy as if this domain was started now */ + /* go through all domains and adjust policy as if this domain was + * started now + */ for_each_acmssid( rawssid ) { chwall_ssid = @@ -220,8 +224,8 @@ chwall_init_state(struct acm_chwall_policy_buffer *chwall_buf, /* b) check for conflict */ for ( i = 0; i < chwall_buf->chwall_max_types; i++ ) - if (conflict_aggregate_set[i] && - ssidrefs[chwall_ssidref * chwall_buf->chwall_max_types + i]) + if ( conflict_aggregate_set[i] && + ssidrefs[chwall_ssidref * chwall_buf->chwall_max_types + i] ) { printk("%s: CHINESE WALL CONFLICT in type %02x.\n", __func__, i); @@ -231,37 +235,46 @@ chwall_init_state(struct acm_chwall_policy_buffer *chwall_buf, goto out; } + /* set violation and break out of the loop */ - /* c) adapt conflict aggregate set for this domain (notice conflicts) */ + /* c) adapt conflict aggregate set for this domain + * (notice conflicts) + */ for ( i = 0; i < chwall_buf->chwall_max_conflictsets; i++ ) { int common = 0; /* check if conflict_set_i and ssidref have common types */ for ( j = 0; j < chwall_buf->chwall_max_types; j++ ) - if (conflict_sets[i * chwall_buf->chwall_max_types + j] && - ssidrefs[chwall_ssidref * - chwall_buf->chwall_max_types + j]) + if ( conflict_sets[i * chwall_buf->chwall_max_types + j] && + ssidrefs[chwall_ssidref * + chwall_buf->chwall_max_types + j] ) { common = 1; break; } - if (common == 0) + + if ( common == 0 ) continue; /* try next conflict set */ - /* now add types of the conflict set to conflict_aggregate_set (except types in chwall_ssidref) */ + + /* now add types of the conflict set to conflict_aggregate_set + * (except types in chwall_ssidref) + */ for ( j = 0; j < chwall_buf->chwall_max_types; j++ ) - if (conflict_sets[i * chwall_buf->chwall_max_types + j] && - !ssidrefs[chwall_ssidref * - chwall_buf->chwall_max_types + j]) + if ( conflict_sets[i * chwall_buf->chwall_max_types + j] && + !ssidrefs[chwall_ssidref * + chwall_buf->chwall_max_types + j] ) conflict_aggregate_set[j]++; } } out: read_unlock(&ssid_list_rwlock); return violation; - /* returning "violation != 0" means that the currently running set of domains would - * not be possible if the new policy had been enforced before starting them; for chinese - * wall, this means that the new policy includes at least one conflict set of which - * more than one type is currently running */ + /* returning "violation != 0" means that the currently running set of + * domains would not be possible if the new policy had been enforced + * before starting them; for chinese wall, this means that the new + * policy includes at least one conflict set of which more than one + * type is currently running + */ } @@ -348,8 +361,10 @@ static int _chwall_update_policy(u8 *buf, u32 buf_size, int test_only, memset(conflict_aggregate_set, 0, sizeof(domaintype_t) * chwall_buf->chwall_max_types); - /* 3. now re-calculate the state for the new policy based on running domains; - * this can fail if new policy is conflicting with running domains */ + /* 3. now re-calculate the state for the new policy based on + * running domains; this can fail if new policy is conflicting + * with running domains + */ if ( chwall_init_state(chwall_buf, ssids, conflict_sets, running_types, conflict_aggregate_set, @@ -483,31 +498,27 @@ static int _chwall_pre_domain_create(void *subject_ssid, ssidref_t ssidref) chwall_ssidref = GET_SSIDREF(ACM_CHINESE_WALL_POLICY, ssidref); - if (chwall_ssidref == ACM_DEFAULT_LOCAL_SSID) - { - printk("%s: ERROR CHWALL SSID is NOT SET but policy enforced.\n", - __func__); - return ACM_ACCESS_DENIED; /* catching and indicating config error */ - } - - if (chwall_ssidref >= chwall_bin_pol.max_ssidrefs) + if ( chwall_ssidref >= chwall_bin_pol.max_ssidrefs ) { printk("%s: ERROR chwall_ssidref > max(%x).\n", __func__, chwall_bin_pol.max_ssidrefs - 1); return ACM_ACCESS_DENIED; } + /* A: chinese wall check for conflicts */ - for (i = 0; i < chwall_bin_pol.max_types; i++) - if (chwall_bin_pol.conflict_aggregate_set[i] && - chwall_bin_pol.ssidrefs[chwall_ssidref * - chwall_bin_pol.max_types + i]) + for ( i = 0; i < chwall_bin_pol.max_types; i++ ) + if ( chwall_bin_pol.conflict_aggregate_set[i] && + chwall_bin_pol.ssidrefs[chwall_ssidref * + chwall_bin_pol.max_types + i] ) { printk("%s: CHINESE WALL CONFLICT in type %02x.\n", __func__, i); return ACM_ACCESS_DENIED; } /* B: chinese wall conflict set adjustment (so that other - * other domains simultaneously created are evaluated against this new set)*/ + * other domains simultaneously created are evaluated against + * this new set) + */ for ( i = 0; i < chwall_bin_pol.max_conflictsets; i++ ) { int common = 0; @@ -521,7 +532,7 @@ static int _chwall_pre_domain_create(void *subject_ssid, ssidref_t ssidref) common = 1; break; } - if (common == 0) + if ( common == 0 ) continue; /* try next conflict set */ /* now add types of the conflict set to conflict_aggregate_set (except types in chwall_ssidref) */ for ( j = 0; j < chwall_bin_pol.max_types; j++ ) @@ -571,9 +582,15 @@ static void _chwall_post_domain_create(domid_t domid, ssidref_t ssidref) common = 1; break; } + if ( common == 0 ) - continue; /* try next conflict set */ - /* now add types of the conflict set to conflict_aggregate_set (except types in chwall_ssidref) */ + { + /* try next conflict set */ + continue; + } + + /* now add types of the conflict set to conflict_aggregate_set + (except types in chwall_ssidref) */ for ( j = 0; j < chwall_bin_pol.max_types; j++ ) if ( chwall_bin_pol. conflict_sets[i * chwall_bin_pol.max_types + j] @@ -638,9 +655,15 @@ static void chwall_domain_destroy(void *object_ssid, struct domain *d) common = 1; break; } - if (common == 0) - continue; /* try next conflict set, this one does not include any type of chwall_ssidref */ - /* now add types of the conflict set to conflict_aggregate_set (except types in chwall_ssidref) */ + if ( common == 0 ) + { + /* try next conflict set, this one does not include + any type of chwall_ssidref */ + continue; + } + + /* now add types of the conflict set to conflict_aggregate_set + (except types in chwall_ssidref) */ for ( j = 0; j < chwall_bin_pol.max_types; j++ ) if ( chwall_bin_pol. conflict_sets[i * chwall_bin_pol.max_types + j] diff --git a/xen/acm/acm_simple_type_enforcement_hooks.c b/xen/acm/acm_simple_type_enforcement_hooks.c index a4fcbd488d..eaeb0a233b 100644 --- a/xen/acm/acm_simple_type_enforcement_hooks.c +++ b/xen/acm/acm_simple_type_enforcement_hooks.c @@ -408,7 +408,7 @@ _ste_update_policy(u8 *buf, u32 buf_size, int test_only, ste_bin_pol.max_ssidrefs = ste_buf->ste_max_ssidrefs; ste_bin_pol.ssidrefs = (domaintype_t *)ssidrefsbuf; - if ( ste_init_state(NULL) ) + if ( ste_init_state(errors) ) { /* new policy conflicts with sharing of running domains */ printk("%s: New policy conflicts with running domains. " From 883ff6165736e4ac0511245fd76f1645d10bdde4 Mon Sep 17 00:00:00 2001 From: "kfraser@localhost.localdomain" Date: Mon, 6 Aug 2007 10:11:25 +0100 Subject: [PATCH 13/24] [ACM] Support for removing / replacing a policy Add support for removing/replacing a policy from the running system. This operation is only successful if currently running VMs would also be allowed to run under the new policy. Removing the current policy means that the default policy is installed, which then only has support for a single VM label and STE type (SystemManagement) and is the same policy that the system starts up with when no policy is chosen. Signed-off-by: Stefan Berger --- tools/python/xen/util/acmpolicy.py | 64 +++++++++++++++++++-------- tools/python/xen/util/security.py | 32 ++++++++++++-- tools/python/xen/xm/activatepolicy.py | 27 ++++++++++- tools/python/xen/xm/resources.py | 1 - tools/python/xen/xm/setpolicy.py | 40 ++++++++++++++++- tools/security/Makefile | 11 ++--- 6 files changed, 142 insertions(+), 33 deletions(-) diff --git a/tools/python/xen/util/acmpolicy.py b/tools/python/xen/util/acmpolicy.py index 5577193a76..bb36cd7fa2 100644 --- a/tools/python/xen/util/acmpolicy.py +++ b/tools/python/xen/util/acmpolicy.py @@ -142,6 +142,21 @@ class ACMPolicy(XSPolicy): return xsconstants.XSERR_SUCCESS + def is_default_policy(self): + """ + Determine whether this is the default policy + """ + default = ['SystemManagement'] + if self.policy_get_virtualmachinelabel_names() == default and \ + self.policy_get_bootstrap_vmlabel() == default[0] and \ + self.policy_get_stetypes_types() == default and \ + self.policy_get_stes_of_vmlabel(default[0]) == default and \ + self.policy_get_resourcelabel_names() == [] and \ + self.policy_get_chwall_types() == default and \ + self.get_name() == "DEFAULT": + return True + return False + def update(self, xml_new): """ Update the policy with the new XML. The hypervisor decides @@ -156,27 +171,18 @@ class ACMPolicy(XSPolicy): return -xsconstants.XSERR_XML_PROCESSING, errors vmlabel_map = acmpol_new.policy_get_vmlabel_translation_map() + # An update requires version information in the current # and new policy. The version number of the current policy # must be the same as what is in the FromPolicy/Version node # in the new one and the current policy's name must be the # same as in FromPolicy/PolicyName - - now_vers = acmpol_old.policy_dom_get_hdr_item("Version") - now_name = acmpol_old.policy_dom_get_hdr_item("PolicyName") - req_oldvers = acmpol_new.policy_dom_get_frompol_item("Version") - req_oldname = acmpol_new.policy_dom_get_frompol_item("PolicyName") - - if now_vers == "" or \ - now_vers != req_oldvers or \ - now_name != req_oldname: - log.info("Policy rejected: %s != %s or %s != %s" % \ - (now_vers,req_oldvers,now_name,req_oldname)) - return -xsconstants.XSERR_VERSION_PREVENTS_UPDATE, errors - - if not self.isVersionUpdate(acmpol_new): - log.info("Policy rejected since new version is not an update.") - return -xsconstants.XSERR_VERSION_PREVENTS_UPDATE, errors + # The default policy when it is set skips this step. + if not acmpol_new.is_default_policy() and \ + not acmpol_old.is_default_policy(): + irc = self.__do_update_version_check(acmpol_new) + if irc != xsconstants.XSERR_SUCCESS: + return irc, errors if self.isloaded(): newvmnames = \ @@ -258,6 +264,29 @@ class ACMPolicy(XSPolicy): self.compile() return rc, errors + + def __do_update_version_check(self, acmpol_new): + acmpol_old = self + + now_vers = acmpol_old.policy_dom_get_hdr_item("Version") + now_name = acmpol_old.policy_dom_get_hdr_item("PolicyName") + req_oldvers = acmpol_new.policy_dom_get_frompol_item("Version") + req_oldname = acmpol_new.policy_dom_get_frompol_item("PolicyName") + + if now_vers == "" or \ + now_vers != req_oldvers or \ + now_name != req_oldname: + log.info("Policy rejected: %s != %s or %s != %s" % \ + (now_vers,req_oldvers,now_name,req_oldname)) + return -xsconstants.XSERR_VERSION_PREVENTS_UPDATE + + if not self.isVersionUpdate(acmpol_new): + log.info("Policy rejected since new version is not an update.") + return -xsconstants.XSERR_VERSION_PREVENTS_UPDATE + + return xsconstants.XSERR_SUCCESS + + def compareVersions(self, v1, v2): """ Compare two policy versions given their tuples of major and @@ -848,8 +877,7 @@ class ACMPolicy(XSPolicy): if self.isloaded(): return -xsconstants.XSERR_POLICY_LOADED files = [ self.get_filename(".map",""), - self.get_filename(".bin",""), - self.path_from_policy_name(self.get_name())] + self.get_filename(".bin","") ] for f in files: try: os.unlink(f) diff --git a/tools/python/xen/util/security.py b/tools/python/xen/util/security.py index 9452687336..18e6219f9b 100644 --- a/tools/python/xen/util/security.py +++ b/tools/python/xen/util/security.py @@ -146,7 +146,7 @@ def calc_dom_ssidref_from_info(info): raise VmError("VM label '%s' in wrong format." % seclab) typ, policyname, vmlabel = seclab.split(":") if typ != xsconstants.ACM_POLICY_ID: - raise VmError("Policy type '%s' not supported." % typ) + raise VmError("Policy type '%s' must be changed." % typ) refresh_security_policy() if active_policy != policyname: raise VmError("Active policy '%s' different than " @@ -502,7 +502,7 @@ def hv_chg_policy(bin_pol, del_array, chg_array): rc, errors = acm.chgpolicy(bin_pol, del_array, chg_array) except Exception, e: pass - if (len(errors) > 0): + if len(errors) > 0: rc = -xsconstants.XSERR_HV_OP_FAILED return rc, errors @@ -785,6 +785,24 @@ def res_security_check_xapi(rlabel, rssidref, rpolicy, xapi_dom_label): return rtnval +def validate_label(label, policyref): + """ + Make sure that this label is part of the currently enforced policy + and that it reference the current policy. + """ + rc = xsconstants.XSERR_SUCCESS + from xen.xend.XendXSPolicyAdmin import XSPolicyAdminInstance + curpol = XSPolicyAdminInstance().get_loaded_policy() + if not curpol or curpol.get_name() != policyref: + rc = -xsconstants.XSERR_BAD_LABEL + else: + try: + label2ssidref(label, curpol.get_name() , 'res') + except: + rc = -xsconstants.XSERR_BAD_LABEL + return rc + + def set_resource_label_xapi(resource, reslabel_xapi, oldlabel_xapi): """Assign a resource label to a resource @param resource: The name of a resource, i.e., "phy:/dev/hda", or @@ -809,10 +827,16 @@ def set_resource_label_xapi(resource, reslabel_xapi, oldlabel_xapi): return -xsconstants.XSERR_BAD_LABEL_FORMAT otyp, opolicyref, olabel = tmp # Only ACM is supported - if otyp != xsconstants.ACM_POLICY_ID: + if otyp != xsconstants.ACM_POLICY_ID and \ + otyp != xsconstants.INVALID_POLICY_PREFIX + \ + xsconstants.ACM_POLICY_ID: return -xsconstants.XSERR_WRONG_POLICY_TYPE + rc = validate_label(label, policyref) + if rc != xsconstants.XSERR_SUCCESS: + return rc return set_resource_label(resource, typ, policyref, label, olabel) + def is_resource_in_use(resource): """ Investigate all running domains whether they use this device """ from xen.xend import XendDomain @@ -1228,7 +1252,7 @@ def change_acm_policy(bin_pol, del_array, chg_array, sec_lab, new_seclab = labels if sec_lab != new_seclab: log.info("Updating domain %s to new label '%s'." % \ - (new_seclab, sec_lab)) + (sec_lab, new_seclab)) # This better be working! dominfo.set_security_label(new_seclab, sec_lab, diff --git a/tools/python/xen/xm/activatepolicy.py b/tools/python/xen/xm/activatepolicy.py index 46b1b920eb..270b510eac 100644 --- a/tools/python/xen/xm/activatepolicy.py +++ b/tools/python/xen/xm/activatepolicy.py @@ -23,7 +23,7 @@ import sys from xen.util import xsconstants from xml.dom import minidom from xen.xm.opts import OptionError -from xen.xm import getpolicy +from xen.xm import getpolicy, setpolicy from xen.xm import main as xm_main from xen.xm.main import server @@ -38,6 +38,9 @@ def help(): --boot Have the system boot with the policy. Changes the default title in grub.conf. --noboot Remove the policy from the default entry in grub.conf. + --remove Attempt to remove the current policy by installing the + default policy; this works only if no domains are + running. """ def activate_policy(flags): @@ -56,6 +59,25 @@ def activate_policy(flags): def remove_bootpolicy(): server.xenapi.XSPolicy.rm_xsbootpolicy() +def install_default_policy(): + if xm_main.serverType != xm_main.SERVER_XEN_API: + raise OptionError('xm needs to be configured to use the xen-api.') + xs_type = int(server.xenapi.XSPolicy.get_xstype()) + if xs_type & xsconstants.XS_POLICY_ACM == 0: + raise OptionError('ACM policy type not supported on system.') + policystate = server.xenapi.XSPolicy.get_xspolicy() + if int(policystate['type']) == 0: + print 'No policy is installed.' + return + if int(policystate['type']) != xsconstants.XS_POLICY_ACM: + print "Unknown policy type '%s'." % policystate['type'] + flags = int(policystate['flags']) + if flags & xsconstants.XS_INST_LOAD == 0: + print "Default policy is already loaded." + return + setpolicy.setpolicy(xsconstants.ACM_POLICY_ID, 'default', flags, True, + False) + def main(argv): if xm_main.serverType != xm_main.SERVER_XEN_API: raise OptionError('xm needs to be configured to use the xen-api.') @@ -69,6 +91,9 @@ def main(argv): flags |= xsconstants.XS_INST_LOAD elif '--noboot' == argv[c]: remove_bootpolicy() + elif '--remove' == argv[c]: + install_default_policy() + return else: raise OptionError("Unknown command line option '%s'" % argv[c]) c += 1 diff --git a/tools/python/xen/xm/resources.py b/tools/python/xen/xm/resources.py index 966742c5ac..a51df974e4 100644 --- a/tools/python/xen/xm/resources.py +++ b/tools/python/xen/xm/resources.py @@ -58,7 +58,6 @@ def main (argv): try: filename = security.res_label_filename access_control = dictio.dict_read("resources", filename) - print access_control except: raise OptionError("Resource file not found") diff --git a/tools/python/xen/xm/setpolicy.py b/tools/python/xen/xm/setpolicy.py index 8960888040..b1c58d4ac0 100644 --- a/tools/python/xen/xm/setpolicy.py +++ b/tools/python/xen/xm/setpolicy.py @@ -24,6 +24,7 @@ import struct import sys import string from xen.util import xsconstants +from xen.util.acmpolicy import ACMPolicy from xen.xm.opts import OptionError from xen.util.security import policy_dir_prefix from xen.xm import main as xm_main @@ -40,9 +41,38 @@ def help(): The following options are defined --load Load the policy immediately --boot Have the system load the policy during boot + --update Automatically adapt the policy so that it will be + treated as an update to the current policy """ -def setpolicy(policytype, policy_name, flags, overwrite): +def create_update_xml(xml): + """ + Adapt the new policy's xml header to be a simple type of an + update to the currently enforce policy on the remote system. + Increases the minor number by '1'. + """ + policystate = server.xenapi.XSPolicy.get_xspolicy() + if int(policystate['type']) == 0: + return xml + curpol = ACMPolicy(xml = policystate['repr']) + curpol_version = curpol.get_version() + tmp = curpol_version.split('.') + if len(tmp) == 2: + maj = int(tmp[0]) + min = int(tmp[1]) + else: + maj = int(tmp) + min = 0 + min += 1 + newpol_version = ""+str(maj)+"."+str(min) + + newpol = ACMPolicy(xml = xml) + newpol.set_frompolicy_name(curpol.get_name()) + newpol.set_frompolicy_version(curpol.get_version()) + newpol.set_policy_version(newpol_version) + return newpol.toxml() + +def setpolicy(policytype, policy_name, flags, overwrite, is_update=False): if xm_main.serverType != xm_main.SERVER_XEN_API: raise OptionError('xm needs to be configured to use the xen-api.') if policytype != xsconstants.ACM_POLICY_ID: @@ -61,6 +91,9 @@ def setpolicy(policytype, policy_name, flags, overwrite): except: raise OptionError("Not a valid policy file") + if is_update: + xml = create_update_xml(xml) + try: policystate = server.xenapi.XSPolicy.set_xspolicy(xs_type, xml, @@ -96,18 +129,21 @@ def main(argv): policytype = argv[1] policy_name = argv[2] + is_update = False flags = 0 if '--load' in argv: flags |= xsconstants.XS_INST_LOAD if '--boot' in argv: flags |= xsconstants.XS_INST_BOOT + if '--update' in argv: + is_update = True overwrite = True if '--nooverwrite' in argv: overwrite = False - setpolicy(policytype, policy_name, flags, overwrite) + setpolicy(policytype, policy_name, flags, overwrite, is_update) if __name__ == '__main__': try: diff --git a/tools/security/Makefile b/tools/security/Makefile index 2ce8fbf4df..b31ad41ca7 100644 --- a/tools/security/Makefile +++ b/tools/security/Makefile @@ -13,13 +13,6 @@ CFLAGS += $(shell xml2-config --cflags ) CFLAGS += $(shell if [[ $(XML2VERSION) < 2.6.20 ]]; then echo ""; else echo "-DVALIDATE_SCHEMA"; fi ) LDFLAGS += $(shell xml2-config --libs ) # if this does not work, try -L/usr/lib -lxml2 -lz -lpthread -lm -ifeq ($(ACM_DEFAULT_SECURITY_POLICY),ACM_NULL_POLICY) -POLICY=null -endif -ifeq ($(ACM_DEFAULT_SECURITY_POLICY),ACM_CHINESE_WALL_AND_SIMPLE_TYPE_ENFORCEMENT_POLICY) -POLICY=chwall_ste -endif - SRCS_TOOL = secpol_tool.c OBJS_TOOL := $(patsubst %.c,%.o,$(filter %.c,$(SRCS_TOOL))) SRCS_XML2BIN = secpol_xml2bin.c secpol_xml2bin.h @@ -41,6 +34,7 @@ ACM_SECGEN_CGIDIR = $(ACM_SECGEN_HTMLDIR)/cgi-bin ACM_SCHEMA = security_policy.xsd ACM_EXAMPLES = client_v1 test +ACM_DEF_POLICIES = default default-ul ACM_POLICY_SUFFIX = security_policy.xml ifeq ($(ACM_SECURITY),y) @@ -62,6 +56,9 @@ install: all $(ACM_CONFIG_FILE) for i in $(ACM_EXAMPLES); do \ $(INSTALL_DATA) policies/example/$$i-$(ACM_POLICY_SUFFIX) $(DESTDIR)$(ACM_POLICY_DIR)/example/; \ done + for i in $(ACM_DEF_POLICIES); do \ + $(INSTALL_DATA) policies/$$i-$(ACM_POLICY_SUFFIX) $(DESTDIR)$(ACM_POLICY_DIR); \ + done $(INSTALL_DIR) $(DESTDIR)$(ACM_SCRIPT_DIR) $(INSTALL_PROG) $(ACM_SCRIPTS) $(DESTDIR)$(ACM_SCRIPT_DIR) $(INSTALL_DIR) $(DESTDIR)$(ACM_SECGEN_HTMLDIR) From e080ffba8d9368b57e4b9a882f7c9729efe9f9db Mon Sep 17 00:00:00 2001 From: "kfraser@localhost.localdomain" Date: Mon, 6 Aug 2007 10:12:34 +0100 Subject: [PATCH 14/24] Fix/cleanup destroyDevice code path in xend. When calling destroyDevice code path (e.g. xm block-detach dom devid), allow specifying an integer device id or a device name such as xvdN or /dev/xvdN. Allowing the /dev/xvdN form is useful when detaching devices from dom0. Bootloaders may do this to unmount a disk previously mounted in dom0. Move examination of device ID format into the DevController, permitting device controllers to determine a valid device ID instead of higher level code. Signed-off-by: Jim Fehlig --- tools/python/xen/xend/XendDomainInfo.py | 14 +------ tools/python/xen/xend/server/DevController.py | 23 +++++++---- tools/python/xen/xend/server/blkif.py | 15 ++++--- .../policies/default-security_policy.xml | 30 ++++++++++++++ .../policies/default-ul-security_policy.xml | 41 +++++++++++++++++++ 5 files changed, 96 insertions(+), 27 deletions(-) create mode 100644 tools/security/policies/default-security_policy.xml create mode 100644 tools/security/policies/default-ul-security_policy.xml diff --git a/tools/python/xen/xend/XendDomainInfo.py b/tools/python/xen/xend/XendDomainInfo.py index 0d3a8ea055..095c665214 100644 --- a/tools/python/xen/xend/XendDomainInfo.py +++ b/tools/python/xen/xend/XendDomainInfo.py @@ -559,18 +559,8 @@ class XendDomainInfo: self.getDeviceController(devclass).waitForDevices() def destroyDevice(self, deviceClass, devid, force = False): - try: - dev = int(devid) - except ValueError: - # devid is not a number but a string containing either device - # name (e.g. xvda) or device_type/device_id (e.g. vbd/51728) - dev = type(devid) is str and devid.split('/')[-1] or None - if dev == None: - log.debug("Could not find the device %s", devid) - return None - - log.debug("dev = %s", dev) - return self.getDeviceController(deviceClass).destroyDevice(dev, force) + log.debug("dev = %s", devid) + return self.getDeviceController(deviceClass).destroyDevice(devid, force) def getDeviceSxprs(self, deviceClass): if self._stateGet() in (DOM_STATE_RUNNING, DOM_STATE_PAUSED): diff --git a/tools/python/xen/xend/server/DevController.py b/tools/python/xen/xend/server/DevController.py index c43ed2681b..0de81efa3a 100644 --- a/tools/python/xen/xend/server/DevController.py +++ b/tools/python/xen/xend/server/DevController.py @@ -203,27 +203,32 @@ class DevController: The implementation here simply deletes the appropriate paths from the store. This may be overridden by subclasses who need to perform other - tasks on destruction. Further, the implementation here can only - accept integer device IDs, or values that can be converted to - integers. Subclasses may accept other values and convert them to - integers before passing them here. + tasks on destruction. The implementation here accepts integer device + IDs or paths containg integer deviceIDs, e.g. vfb/0. Subclasses may + accept other values and convert them to integers before passing them + here. """ - devid = int(devid) + try: + dev = int(devid) + except ValueError: + # Does devid contain devicetype/deviceid? + # Propogate exception if unable to find an integer devid + dev = int(type(devid) is str and devid.split('/')[-1] or None) # Modify online status /before/ updating state (latter is watched by # drivers, so this ordering avoids a race). - self.writeBackend(devid, 'online', "0") - self.writeBackend(devid, 'state', str(xenbusState['Closing'])) + self.writeBackend(dev, 'online', "0") + self.writeBackend(dev, 'state', str(xenbusState['Closing'])) if force: - frontpath = self.frontendPath(devid) + frontpath = self.frontendPath(dev) backpath = xstransact.Read(frontpath, "backend") if backpath: xstransact.Remove(backpath) xstransact.Remove(frontpath) - self.vm._removeVm("device/%s/%d" % (self.deviceClass, devid)) + self.vm._removeVm("device/%s/%d" % (self.deviceClass, dev)) def configurations(self): return map(self.configuration, self.deviceIDs()) diff --git a/tools/python/xen/xend/server/blkif.py b/tools/python/xen/xend/server/blkif.py index 62512a4cd9..b63e05f2a5 100644 --- a/tools/python/xen/xend/server/blkif.py +++ b/tools/python/xen/xend/server/blkif.py @@ -154,13 +154,16 @@ class BlkifController(DevController): def destroyDevice(self, devid, force): """@see DevController.destroyDevice""" - # If we are given a device name, then look up the device ID from it, - # and destroy that ID instead. If what we are given is an integer, - # then assume it's a device ID and pass it straight through to our - # superclass's method. - + # vbd device IDs can be either string or integer. Further, the + # following string values are possible: + # - devicetype/deviceid (vbd/51728) + # - devicetype/devicename (/dev/xvdb) + # - devicename (xvdb) + # Let our superclass handle integer or devicetype/deviceid forms. + # If we are given a device name form, then look up the device ID + # from it, and destroy that ID instead. try: - DevController.destroyDevice(self, int(devid), force) + DevController.destroyDevice(self, devid, force) except ValueError: devid_end = type(devid) is str and devid.split('/')[-1] or None diff --git a/tools/security/policies/default-security_policy.xml b/tools/security/policies/default-security_policy.xml new file mode 100644 index 0000000000..f52663e708 --- /dev/null +++ b/tools/security/policies/default-security_policy.xml @@ -0,0 +1,30 @@ + + + + DEFAULT + 1.0 + + + + SystemManagement + + + + + SystemManagement + + + + + + SystemManagement + + SystemManagement + + + + + + + + diff --git a/tools/security/policies/default-ul-security_policy.xml b/tools/security/policies/default-ul-security_policy.xml new file mode 100644 index 0000000000..1dad2d19c0 --- /dev/null +++ b/tools/security/policies/default-ul-security_policy.xml @@ -0,0 +1,41 @@ + + + + DEFAULT-UL + 1.0 + + + + SystemManagement + __UNLABELED__ + + + + + SystemManagement + + + + + + SystemManagement + + SystemManagement + __UNLABELED__ + + + + + + + __UNLABELED__ + + __UNLABELED__ + + + + + + + + From f26a3dbc3640aeb728cff637f486927d5bf13777 Mon Sep 17 00:00:00 2001 From: "kfraser@localhost.localdomain" Date: Mon, 6 Aug 2007 10:13:34 +0100 Subject: [PATCH 15/24] pygrub: LiloConf.py supports root and read-only LiloConf.py ignores the following options: root and read-only. This patch fixes the issue. Signed-off-by: KUWAMURA Shin'ya --- tools/pygrub/src/LiloConf.py | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/tools/pygrub/src/LiloConf.py b/tools/pygrub/src/LiloConf.py index 3a2172f92a..2dde05825a 100644 --- a/tools/pygrub/src/LiloConf.py +++ b/tools/pygrub/src/LiloConf.py @@ -18,12 +18,13 @@ class LiloImage(object): " initrd: %s\n" %(self.title, self.root, self.kernel, self.args, self.initrd)) def reset(self, lines, path): - self._root = self._initrd = self._kernel = self._args = None + self._initrd = self._kernel = self._readonly = None + self._args = "" self.title = "" self.lines = [] self.path = path + self.root = "" map(self.set_from_line, lines) - self.root = "" # dummy def set_from_line(self, line, replace = None): (com, arg) = GrubConf.grub_exact_split(line, 2) @@ -55,6 +56,23 @@ class LiloImage(object): return self._initrd initrd = property(get_initrd, set_initrd) + def set_args(self, val): + self._args = val + def get_args(self): + args = self._args + if self.root: + args += " root=" + self.root + if self.readonly: + args += " ro" + return args + args = property(get_args, set_args) + + def set_readonly(self, val): + self._readonly = 1 + def get_readonly(self): + return self._readonly + readonly = property(get_readonly, set_readonly) + # set up command handlers commands = { "label": "self.title", "root": "self.root", @@ -62,7 +80,7 @@ class LiloImage(object): "image": "self.kernel", "initrd": "self.initrd", "append": "self.args", - "read-only": None, + "read-only": "self.readonly", "chainloader": None, "module": None} From b12c493fd8591cd69825d97079e8590b3196d163 Mon Sep 17 00:00:00 2001 From: "kfraser@localhost.localdomain" Date: Mon, 6 Aug 2007 11:08:57 +0100 Subject: [PATCH 16/24] hvm: Fix save/restore when callback_via line is routed through a PCI INTx wire. Signed-off-by: Edwin Zhai Signed-off-by: Keir Fraser --- xen/arch/x86/hvm/irq.c | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/xen/arch/x86/hvm/irq.c b/xen/arch/x86/hvm/irq.c index 6494ea8567..9212e93fe1 100644 --- a/xen/arch/x86/hvm/irq.c +++ b/xen/arch/x86/hvm/irq.c @@ -395,9 +395,33 @@ static void irq_dump(struct domain *d) static int irq_save_pci(struct domain *d, hvm_domain_context_t *h) { struct hvm_irq *hvm_irq = &d->arch.hvm_domain.irq; + unsigned int asserted, pdev, pintx; + int rc; + + spin_lock(&d->arch.hvm_domain.irq_lock); + + pdev = hvm_irq->callback_via.pci.dev; + pintx = hvm_irq->callback_via.pci.intx; + asserted = (hvm_irq->callback_via_asserted && + (hvm_irq->callback_via_type == HVMIRQ_callback_pci_intx)); + + /* + * Deassert virtual interrupt via PCI INTx line. The virtual interrupt + * status is not save/restored, so the INTx line must be deasserted in + * the restore context. + */ + if ( asserted ) + __hvm_pci_intx_deassert(d, pdev, pintx); /* Save PCI IRQ lines */ - return ( hvm_save_entry(PCI_IRQ, 0, h, &hvm_irq->pci_intx) ); + rc = hvm_save_entry(PCI_IRQ, 0, h, &hvm_irq->pci_intx); + + if ( asserted ) + __hvm_pci_intx_assert(d, pdev, pintx); + + spin_unlock(&d->arch.hvm_domain.irq_lock); + + return rc; } static int irq_save_isa(struct domain *d, hvm_domain_context_t *h) From 647f41c70db5a47e3376d2ad0892e43814aaf4db Mon Sep 17 00:00:00 2001 From: "kfraser@localhost.localdomain" Date: Mon, 6 Aug 2007 11:16:14 +0100 Subject: [PATCH 17/24] hvm: Fix PV-on-HVM drivers to not execuite hypercall page while it is being re-initialised. Signed-off-by: Edwin Zhai --- .../linux-2.6/platform-pci/machine_reboot.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/unmodified_drivers/linux-2.6/platform-pci/machine_reboot.c b/unmodified_drivers/linux-2.6/platform-pci/machine_reboot.c index 15ceef8da6..bd58d2ceb5 100644 --- a/unmodified_drivers/linux-2.6/platform-pci/machine_reboot.c +++ b/unmodified_drivers/linux-2.6/platform-pci/machine_reboot.c @@ -11,6 +11,12 @@ struct ap_suspend_info { atomic_t nr_spinning; }; +/* + * Use a rwlock to protect the hypercall page from being executed in AP context + * while the BSP is re-initializing it after restore. + */ +static DEFINE_RWLOCK(suspend_lock); + /* * Spinning prevents, for example, APs touching grant table entries while * the shared grant table is not mapped into the address space imemdiately @@ -27,7 +33,9 @@ static void ap_suspend(void *_info) while (info->do_spin) { cpu_relax(); + read_lock(&suspend_lock); HYPERVISOR_yield(); + read_unlock(&suspend_lock); } mb(); @@ -43,7 +51,9 @@ static int bp_suspend(void) suspend_cancelled = HYPERVISOR_shutdown(SHUTDOWN_suspend); if (!suspend_cancelled) { + write_lock(&suspend_lock); platform_pci_resume(); + write_unlock(&suspend_lock); gnttab_resume(); irq_resume(); } From 44cdadd1cd9fc7e081498d4b453b52ffd4cc6380 Mon Sep 17 00:00:00 2001 From: Ian Campbell Date: Mon, 6 Aug 2007 13:19:44 +0100 Subject: [PATCH 18/24] [32on64] Copy the right grant table status code back to the guest. Signed-off-by: Ian Campbell --- xen/common/compat/grant_table.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/xen/common/compat/grant_table.c b/xen/common/compat/grant_table.c index 342e35622d..882d435a65 100644 --- a/xen/common/compat/grant_table.c +++ b/xen/common/compat/grant_table.c @@ -161,7 +161,7 @@ int compat_grant_table_op(unsigned int cmd, while ( n-- ) { guest_handle_add_offset(xfer, -1); - if ( __copy_field_to_guest(xfer, nat.xfer, status) ) + if ( __copy_field_to_guest(xfer, nat.xfer + n, status) ) rc = -EFAULT; } } @@ -199,7 +199,7 @@ int compat_grant_table_op(unsigned int cmd, while ( n-- ) { guest_handle_add_offset(copy, -1); - if ( __copy_field_to_guest(copy, nat.copy, status) ) + if ( __copy_field_to_guest(copy, nat.copy + n, status) ) rc = -EFAULT; } } From 050883d0fd37f147be8af0dbb037c4116825e36a Mon Sep 17 00:00:00 2001 From: "kfraser@localhost.localdomain" Date: Mon, 6 Aug 2007 13:39:20 +0100 Subject: [PATCH 19/24] xm: pass --skipdtd parameter through to 'xm new' Pass the command line parameter '--skipdtd|-s' through to the actual 'xm new' command. Signed-off-by: Stefan Berger --- tools/python/xen/xm/new.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tools/python/xen/xm/new.py b/tools/python/xen/xm/new.py index 742c7ff8fd..0fb7d8fc58 100644 --- a/tools/python/xen/xm/new.py +++ b/tools/python/xen/xm/new.py @@ -75,7 +75,8 @@ def main(argv): doc = sxp2xml_inst.convert_sxp_to_xml(config) xenapi_create_inst = xenapi_create() - vm_refs = xenapi_create_inst.create(document = doc) + vm_refs = xenapi_create_inst.create(document = doc, + skipdtd=opts.vals.skipdtd) else: make_unstarted_domain(opts, config) From 4eee6b24357e3835018163e11cf01a4107ecae55 Mon Sep 17 00:00:00 2001 From: "kfraser@localhost.localdomain" Date: Mon, 6 Aug 2007 13:42:15 +0100 Subject: [PATCH 20/24] xm: Fix control characters causing xm tests to fail. On my FC7 installation some of the test in the xm test suite fail for no apparent reason. The problem is that the python 'readline' module puts out control characters that confuse code that parses the output of some of the xm commands that are being run. The readline module dumps those characters upon import. The attached patch works around this problem. Here's what I get in out.txt when doing 'python 2>&1 | tee out.txt' and 'import readline' on the python command line: Python 2.5 (r25:51908, Apr 10 2007, 10:29:13) [GCC 4.1.2 20070403 (Red Hat 4.1.2-8)] on linux2 Type "help", "copyright", "credits" or "license" for more information. [[?1034h>>> >>> The characters before the '>>>' above are those printed by that version of 'readline' and remain invisible on the screen but appear in the file and confuse the xm test suite parser. Signed-off-by: Stefan Berger --- tools/python/xen/xm/main.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/python/xen/xm/main.py b/tools/python/xen/xm/main.py index 59210dc526..dd0202920a 100644 --- a/tools/python/xen/xm/main.py +++ b/tools/python/xen/xm/main.py @@ -25,7 +25,6 @@ import atexit import cmd import os import pprint -import readline import shlex import sys import re @@ -616,6 +615,7 @@ class Shell(cmd.Cmd): def preloop(self): cmd.Cmd.preloop(self) + import readline readline.set_completer_delims(' ') def default(self, line): From 617f3606512ddafeeb80f3192fa4a4e73ac03fed Mon Sep 17 00:00:00 2001 From: Tim Deegan Date: Mon, 6 Aug 2007 15:33:42 +0100 Subject: [PATCH 21/24] [HVM] Store Etherboot ROM as hexdump, not binary for ease of patch management Signed-off-by: Tim Deegan --- tools/firmware/etherboot/README | 3 + tools/firmware/etherboot/eb-rtl8139.zrom | Bin 32768 -> 0 bytes tools/firmware/etherboot/eb-rtl8139.zrom.h | 2051 ++++++++++++++++++++ tools/firmware/hvmloader/Makefile | 4 +- 4 files changed, 2056 insertions(+), 2 deletions(-) delete mode 100644 tools/firmware/etherboot/eb-rtl8139.zrom create mode 100644 tools/firmware/etherboot/eb-rtl8139.zrom.h diff --git a/tools/firmware/etherboot/README b/tools/firmware/etherboot/README index c2d4eca067..6506c3c4ad 100644 --- a/tools/firmware/etherboot/README +++ b/tools/firmware/etherboot/README @@ -6,3 +6,6 @@ and for stricter DHCP spec compliance. Rom-o-matic.net will provide this image at the following URL: http://rom-o-matic.net/5.4.3/build.php?version=5.4.3&F=ignore&nic=rtl8139%3Artl8139+--+%5B0x10ec%2C0x8139%5D&ofmt=Binary+ROM+Image%28.zrom%29&arch=i386&ASK_BOOT=-1&BOOT_FIRST=BOOT_NIC&BOOT_SECOND=BOOT_NOTHING&BOOT_THIRD=BOOT_NOTHING&BOOT_INDEX=0&STATIC_CLIENT_IP=&STATIC_SUBNET_MASK=&STATIC_SERVER_IP=&STATIC_GATEWAY_IP=&STATIC_BOOTFILE=&EXIT_ON_FILE_LOAD_ERROR=on&DHCP_CLIENT_ID=&DHCP_CLIENT_ID_LEN=&DHCP_CLIENT_ID_TYPE=&DHCP_USER_CLASS=&DHCP_USER_CLASS_LEN=&ALLOW_ONLY_ENCAPSULATED=on&DEFAULT_BOOTFILE=&CONGESTED=on&BACKOFF_LIMIT=7&TIMEOUT=180&TRY_FLOPPY_FIRST=0&EXIT_IF_NO_OFFER=on&TAGGED_IMAGE=on&ELF_IMAGE=on&PXE_IMAGE=on&DOWNLOAD_PROTO_TFTP=on&COMCONSOLE=0x3F8&CONSPEED=9600&COMPARM=0x03&PXE_EXPORT=on&CONFIG_PCI=on&CONFIG_ISA=on&BUILD_ID=&PCBIOS=on&PXE_DHCP_STRICT=on&A=Get+ROM + +and the mkhex script in tools/firmware/hvmloader will make the header +file from the downloaded image. diff --git a/tools/firmware/etherboot/eb-rtl8139.zrom b/tools/firmware/etherboot/eb-rtl8139.zrom deleted file mode 100644 index 42291f4a9d82ab5f6ae7b9d384d65bce3d885474..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32768 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 lQXYKEDO&bIz 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 diff --git a/tools/firmware/etherboot/eb-rtl8139.zrom.h b/tools/firmware/etherboot/eb-rtl8139.zrom.h new file mode 100644 index 0000000000..3141c3dd18 --- /dev/null +++ b/tools/firmware/etherboot/eb-rtl8139.zrom.h @@ -0,0 +1,2051 @@ +unsigned etherboot[] = { +0xeb40aa55, 0xbfe96c65, 0x68744500, 0x6f627265, +0x0000746f, 0x00540000, 0x0034001c, 0x52494350, +0x813910ec, 0x00180000, 0x00000200, 0x00010040, +0x00008000, 0x506e5024, 0x00000201, 0x00008a00, +0x00090000, 0x00027fd7, 0x00001400, 0x00cc0000, +0x00000000, 0x49444e55, 0x0000a016, 0x01000201, +0x10001000, 0x43500abe, 0x81265249, 0x5024007d, +0x81260c75, 0x506e027d, 0x20b80475, 0x1e50cb00, +0xd88ec031, 0x3d0304a1, 0x1d74e44c, 0xa30064a1, +0x66a10300, 0x0302a300, 0xa300afb8, 0xc88c0064, +0xb80066a3, 0x04a3e44c, 0xb8581f03, 0x31cb0020, +0xa3d88ec0, 0x02a10304, 0x0066a303, 0xa30300a1, +0x50660064, 0x0aeb026a, 0x06eb006a, 0x016a5066, +0xe78900eb, 0x1e505716, 0xb60f2e0e, 0xc1000206, +0x6a5009e0, 0x012be812, 0x8ec88c58, 0x4a068fd8, +0x48068f06, 0x50581f06, 0x6a0c6a66, 0x0060e900, +0x16e08953, 0x55506650, 0x468be589, 0x02468910, +0x8912468b, 0x685d0446, 0x5066104d, 0x0f2e0e50, +0x000206b6, 0x5009e0c1, 0xe6e8146a, 0x8f2e5800, +0x2e064a06, 0x0648068f, 0xc72e6658, 0x00038006, +0x66000000, 0x00020168, 0x50686600, 0xe8000178, +0xc4830010, 0x89175b12, 0x3ce85bdc, 0x0002ca01, +0x6650006a, 0xc0200f50, 0x586601a8, 0x832d7458, +0x0000247c, 0x44871175, 0x44890424, 0x00b80024, +0x87000500, 0x50042444, 0x0002b4b8, 0x74c08500, +0x011ee805, 0xe9580000, 0x000006c0, 0xe5895550, +0x00067e83, 0x8b501375, 0x46890646, 0x46c76602, +0x05000004, 0xeb5d5800, 0x1e585d02, 0xb8665066, +0x000002b4, 0x74c08566, 0x0f061e2f, 0x83a80fa0, +0x895508ec, 0x46010fe5, 0xe80e1602, 0xd1e803a8, +0xe8000000, 0x0000027e, 0x010f5858, 0x835d0256, +0xa90f08c4, 0x1f07a10f, 0x8cc03166, 0x66d88ec8, +0x6604e0c1, 0x00038005, 0x0ba36600, 0x1f586604, +0x500175e9, 0xbb061e60, 0xc38e0040, 0x131e8b26, +0x06e3c100, 0x0d7feb81, 0x2606ebc1, 0x00131e89, +0x8c06e3c1, 0x89d88ed0, 0x4c8b36e6, 0x78c98518, +0x47878d15, 0xbfc08e0c, 0xc1831000, 0x8ecf291a, +0xfcfc89d0, 0x6066a4f3, 0x1f0ec38e, 0x57afb966, +0x89660000, 0xcf8966ce, 0xf3fd4166, 0x66fca467, +0x66506661, 0xd889c031, 0x04e0c166, 0x80a32666, +0xc7266603, 0xf0038406, 0x660000d7, 0x87e58958, +0x5e89165e, 0x611f0714, 0xb80650cb, 0xc08e0040, +0x0013a126, 0x0506e0c1, 0xe8c10dbe, 0x13a32606, +0xc3580700, 0x0000e860, 0x815d0000, 0x0002baed, +0x56b9fd00, 0x8d000051, 0x06530db4, 0xbc8d0000, +0x00457c0d, 0xfca4f300, 0x457db58d, 0xbd8d0000, +0x00000650, 0xffffffbd, 0xa405ebff, 0x0775db01, +0xee831e8b, 0x72db11fc, 0x40c031f2, 0x0775db01, +0xee831e8b, 0x11db11fc, 0x75db01c0, 0x831e8b07, +0xdb11fcee, 0xc931e673, 0x7203e883, 0x08e0c10d, +0x8346068a, 0x5074fff0, 0xdb01c589, 0x1e8b0775, +0x11fcee83, 0x01c911db, 0x8b0775db, 0xfcee831e, +0xc911db11, 0x01411d75, 0x8b0775db, 0xfcee831e, +0xc911db11, 0x0775db01, 0xee831e8b, 0x73db11fc, +0x814141e6, 0xfff300fd, 0x01d183ff, 0x2f348d56, +0xe95ea4f3, 0xffffff74, 0x9090c361, 0x90909090, +0x00000000, 0x00000000, 0x0feb02eb, 0x89559c50, +0x87c88ce5, 0x46870646, 0x9c9d5d04, 0x0fa80f50, +0x161e06a0, 0x01dee80e, 0x550cec83, 0x24448b50, +0x00000d28, 0x44890006, 0x00e81024, 0x5d000000, +0x003fed81, 0x858b0000, 0x0000008b, 0x0000002d, +0x04dc0500, 0x44890000, 0x858d0824, 0x00000067, +0x0c244489, 0xe8c35d58, 0x0000007a, 0x071f1f1f, +0xa90fa10f, 0x5502c483, 0xf766e589, 0x00000646, +0x755d0004, 0x9dcb9d02, 0x000004ca, 0x53000000, +0xe8555756, 0x00000000, 0x98ed815d, 0x8b000000, +0x0001bb9d, 0xa3eb8100, 0x8f000002, 0x0002b783, +0xb3838f00, 0x8f000002, 0x0002af83, 0xab838f00, +0x8f000002, 0x0002a383, 0xa7a38900, 0x8b000002, +0x0001b3a5, 0xb7b5ff00, 0xe8000001, 0x00000006, +0xe904c483, 0x535500d9, 0x0000e850, 0x815d0000, +0x0000eeed, 0x9b858d00, 0x89000001, 0x00019d85, +0x44b70f00, 0xe0c11024, 0x24442904, 0xc1c3890c, +0x896604eb, 0x890e245c, 0x04ebc1c3, 0x9d8d5366, +0x0000018e, 0x5366c329, 0x00000868, 0x849d8d00, +0x29000001, 0x896653c3, 0x0001a585, 0x10e8c100, +0x01a78588, 0xa5880000, 0x000001aa, 0x2444b70f, +0x04e0c11e, 0xad858966, 0x89000001, 0x10ebc1c3, +0x01af9d88, 0xbd880000, 0x000001b2, 0x9b95010f, +0x66000001, 0x8e0010bb, 0x8ec429d3, 0x8ec38edb, +0xcbeb8ee3, 0x80c3200f, 0x220ffee3, 0xc166cbc3, +0xd08e04e8, 0x5b665866, 0x17cb5d66, 0x00000000, +0xff000000, 0x000000ff, 0xff00009b, 0x000000ff, +0x00000093, 0x00000000, 0x00000000, 0x30000000, +0x0042e801, 0x000000e8, 0xed815d00, 0x000001c9, +0x02bbbd8b, 0x8d8b0000, 0x000002bf, 0xf3fce689, +0xa7a58ba4, 0xff000002, 0x0002a3b5, 0xab9d8b00, +0x8b000002, 0x0002afb5, 0xb3bd8b00, 0x8b000002, +0x0002b7ad, 0x6afac300, 0x66556600, 0x89506653, +0xdb3166e5, 0xdb8e5b0e, 0x04e3c166, 0x46b70f66, +0xd801660e, 0x0c468966, 0x66dd8966, 0x00e8db31, +0x8d665b00, 0x66005287, 0x8966e801, 0x66005487, +0x003e878d, 0x66e80166, 0x006a8789, 0x16c03166, +0xe0c16658, 0xb70f6604, 0xc50166ec, 0x97010f66, +0x200f0052, 0x0f010cc0, 0xff66c022, 0x66006aaf, +0x8e0010b8, 0x8eec89d0, 0x8ec08ed8, 0x58e88ee0, +0x17c35d5b, 0x00000000, 0xff000000, 0x000000ff, +0xff00cf9f, 0x000000ff, 0x6f00cf93, 0x08000002, +0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x02000000, 0x0002bd01, 0x00000000, 0x90909090, +0x00008008, 0xfffffb7f, 0xc7835f58, 0x5b585e06, +0x89d68e59, 0x00f883fc, 0x53510375, 0x750207cb, +0xcd19cd02, 0xffeefdbb, 0x9090fb18, 0xf958fbfa, +0x069c15cd, 0xbb660eb4, 0xcd000001, 0x5cd20c10, +0xc0317f6e, 0xe43016cd, 0x9c01b407, 0xadff0258, +0xe083fffb, 0x12cdfa03, 0x31c931f9, 0x523158d2, +0xc4835048, 0x165b6606, 0xbff7ed07, 0x66e789fd, +0x39e820b8, 0x4150ba66, 0xb966534d, 0x66154514, +0xeddf7609, 0x5b9c50fe, 0x7c009a07, 0x1f0e5819, +0x099e8d5d, 0x55cb1500, 0xdfffb7dd, 0x1eff2e18, +0x729c002d, 0x81e5891c, 0x0f3c027e, 0x08009584, +0xedff7f01, 0x8000c637, 0x0788037e, 0x5d9d0101, +0x0002ca5d, 0xc1016600, 0x6ffffedb, 0x2966da02, +0x660377c3, 0xff85db31, 0x39661274, 0x132b76c2, +0xe6ed07c3, 0x13cb6ef6, 0x1eebd989, 0xd272ca1d, +0xde28f766, 0x39f7ee76, 0x07e376da, 0x1527ca01, +0xc11dd089, 0xfffe56c3, 0x5292eede, 0x2e4d9bbe, +0x54045c8b, 0xffa5e804, 0x8108c683, 0xc877abfe, +0xeaa4dede, 0x5ecb5a66, 0x660000c3, 0x97b7d33d, +0x850fffed, 0x2666ff72, 0x00047d83, 0x66506809, +0x458b0d51, 0xbbfedbe5, 0x084d0400, 0xe8ff3157, +0x0b5fffa4, 0xfd891089, 0x66dbb7fb, 0x42e9ee59, +0x91000c14, 0x06e8da87, 0xff33e905, 0x56f85757, +0xbf5033d8, 0xc166aa60, 0x5b3010e1, 0x36dfdd6d, +0xc14b6ced, 0xcb8910e9, 0x030a1359, 0xdb6fffe8, +0x115a90b7, 0x45582a0a, 0xe853c35f, 0xe95bffc8, +0x9b30fef7, 0x01f0d0bb, 0x09016866, 0x00686eeb, +0xfe500507, 0x789785ed, 0x80002be8, 0xa19ccb08, +0x9d137556, 0xad564eb8, 0x5317dbe1, 0x07004036, +0x003e1ed7, 0x0f9d38f8, 0xd93c2ff7, 0x42c83a2e, +0x66d55000, 0x4487c88c, 0x76030424, 0x7b05fbbb, +0x0f08ec83, 0x0f660801, 0x66a002a8, 0xfb76dd5a, +0x66164185, 0x128d600e, 0x0c038938, 0xfb6e4407, +0xe850dff6, 0xed815d39, 0x89060514, 0x058138ad, +0x7dbf168b, 0xbaa9bbfb, 0x8d217400, 0x09c470b5, +0xd470bd8d, 0x72f43905, 0x6f8e3904, 0x76fcfeec, +0xb9e6890d, 0xcf293248, 0xe8a4f36d, 0xb9b64fe3, +0x2d8bdfb7, 0x686c2936, 0x450b83e8, 0xed12203f, +0x0f7b6dfe, 0x04240ab7, 0x5026245c, 0x6088858d, +0x6dbffa50, 0x548fb6ff, 0x01d38e7c, 0x6158cbec, +0xa102a993, 0x1f660766, 0x6ffb9a14, 0x8b9d0ce4, +0x9cd42464, 0x832696f7, 0x6fb7fec5, 0x9dcb9dbc, +0x565507ca, 0x247c8b57, 0x983d2b10, 0xb6bfb7b8, +0xafa81061, 0x0480e868, 0x7cbae855, 0x336edd63, +0x0ee05b1f, 0x8904e2a3, 0x6dbfbe77, 0xb9237dfb, +0xa3f129b4, 0x2015732e, 0x7ffe00ea, 0x00a80bf7, +0x10b80008, 0x8ed88e1c, 0x8ed08ec0, 0x5fe88ee0, +0xe6c35d5e, 0x35dbbbf3, 0x3589e620, 0x283d0524, +0xddbf2c1d, 0xa358efdd, 0x34250b30, 0x70bb5905, +0x5f1d033e, 0x770f6853, 0x4328bacf, 0xb1e8e451, +0x0ca5890b, 0xcde9a528, 0x2f00bf75, 0x612974a5, +0x768de4cf, 0x4d7b7f00, 0xbcfc77b7, 0x6020a88f, +0x1b22ed0a, 0xa15bb7b1, 0x35b70234, 0xd0ff0b07, +0x91cf7e8b, 0x8b8b9191, 0x8b158b8b, 0x23bbc28d, +0xff041ca1, 0xda4c8be2, 0xb7ff1bd4, 0x5189680b, +0x89045902, 0x69890861, 0x5e71890c, 0xdcd0bd79, +0x006d148f, 0x431f1bc3, 0xbf4a8b08, 0x37b6dbfe, +0x0862095a, 0x728b0c6a, 0x147a8b10, 0x59b80519, +0xfd4f6b69, 0x9c284389, 0xb664bea0, 0x5401c2d8, +0x208dce0c, 0xb849687e, 0x1f30b8b9, 0x5d5821a2, +0x87bc3c9d, 0x3d282ef1, 0x50802b07, 0x2e4070f0, +0x89003881, 0xb1fa8285, 0x6fd23921, 0x29077095, +0x7ee68d4f, 0x530c281d, 0x9da95350, 0xdd4bed1d, +0x43892a4b, 0x1d0a0302, 0x04438810, 0xfdb84702, +0x63880cf2, 0x585b0f07, 0x560090c3, 0x6cbe72a1, +0x1b0aed6e, 0x0483000d, 0x6a24c629, 0x33736f00, +0xf2b801fd, 0xee2d0629, 0xdd056850, 0xe8efe37a, +0x189008bc, 0x0dbd3b80, 0x057003c6, 0x2f62b63c, +0x00b03cdc, 0x5b060e18, 0x51000c03, 0x1dbe9b63, +0x24046f21, 0x0602026a, 0xcd0c0650, 0x50eebdb3, +0x2d40f9b8, 0x70f24b52, 0xe816e589, 0x1a2d955a, +0x7d550119, 0x79dfd6df, 0x0374c085, 0x6dd5b60f, +0x49509b5a, 0x2f973488, 0x8f0203b6, 0x03060e46, +0xf636b0f9, 0x9229f98c, 0xf7b42f1c, 0x0e722f6b, +0x05212603, 0x672107e8, 0x2625b987, 0x16d861c0, +0x32ee0e23, 0xe30e233c, 0xf7063e4c, 0x872723d0, +0x1f298bcd, 0x2ece1616, 0x4db93ccc, 0xad1f2321, +0x1f46792f, 0x53565795, 0x5b4bee27, 0xc76614ee, +0x6c8dadc5, 0x570a6a04, 0x7778d7ca, 0x2ebb7497, +0xeb81562a, 0x6c05f23e, 0xe8ee7598, 0x24f3375d, +0x34750d83, 0x705eb6d8, 0xd2854c72, 0x3c835b75, +0x7f68eb0a, 0xf51664da, 0x06e0c106, 0xae018c07, +0x702ad7c8, 0xe87414c4, 0x1b060a15, 0xebd2f63b, +0x88006dea, 0x025a5669, 0xc9ec60d8, 0x55cceb92, +0x3b072094, 0xdba3ffee, 0x062b381d, 0x31617d7b, +0x6ae089ed, 0xe102501e, 0xb8c3bdaf, 0xd09f6450, +0x06c4e805, 0x607f78f7, 0x0282811b, 0x8b4175cd, +0xdde3a404, 0x75b14777, 0x4334b22a, 0xd5283c8d, +0x05b9fc0a, 0xffba5eb4, 0x5b14c5f7, 0x0b7da5f3, +0xa874db85, 0x89a106ba, 0xc156b7da, 0xdeada599, +0xf2eb3a14, 0x67eb102f, 0xd4e80c87, 0xabbbd601, +0xbbddfffe, 0xa3bd02f7, 0x0a71ba40, 0x4c68206a, +0x7bbba30b, 0x1044bedb, 0x6cff0f47, 0x0c48a35a, +0xcb737559, 0x6f6fbb67, 0x0af22705, 0x0854a399, +0xc70d44a1, 0xbc1ed7bd, 0x09f42005, 0x336e003c, +0x5009b20f, 0x0f581589, 0xbac1055c, 0x1901b191, +0x64091060, 0xd9360d23, 0x2268a3d8, 0x2c703c6c, +0xafb876a1, 0x082e59e1, 0xe3073916, 0xd7861b73, +0x83351763, 0x18744ebd, 0x9b181aff, 0xfc6bf033, +0x77e7721d, 0x868bebed, 0x95bf0b7f, 0xdbfa837f, +0x52779285, 0x7e24ff3d, 0x77e070ad, 0x8532be4b, +0xb52b941e, 0xfdafe0df, 0x23d3391b, 0x770c72ce, +0x0676c60e, 0x2d8d8b8b, 0x2c0db5bc, 0x3fc70729, +0xc3b1d835, 0x19d209da, 0x629d8b3d, 0xdb7f0db6, +0x228d08fb, 0x2e70870f, 0x0903f981, 0xe9bb1f7b, +0xce89640b, 0xdf894203, 0x5230bd13, 0x70deedbd, +0x04b7d739, 0x1d46820f, 0x0f6c0877, 0xdfec3c86, +0x8009cdc1, 0xc1891b77, 0xc8291577, 0x8c89da19, +0x6c7701db, 0x1de96289, 0x4c0e011e, 0xb03ec990, +0x85c781ba, 0x66580954, 0xe970ddd0, 0x13b8bff0, +0xab05d704, 0x1f12b86d, 0x6a83c39c, 0x2e400a0c, +0x08b221de, 0xe208af48, 0xe07b8376, 0xef4c35ff, +0x74e70d5b, 0x60380310, 0xa337f6f7, 0xfdd2e91e, +0x770f684d, 0x704d3e1e, 0x38ed93bc, 0x0949feeb, +0x2b8520a1, 0xc9b59b30, 0x1d4f4669, 0xf75837f5, +0x59379ae8, 0xda380062, 0xbafc5357, 0x109ffc77, +0x89d6ff05, 0x15c5e8c3, 0x0d8ba6ba, 0x48f16e2d, +0xebc1ca65, 0x91028b46, 0x16a178b6, 0x891f2af6, +0x62dff5c7, 0xcab6df6b, 0xc1d7bd3a, 0x071c0ae2, +0x7625b7cb, 0x896802d1, 0x04aa9cd7, 0xd0a15b5a, +0xf889c5e1, 0xf1516b63, 0x70edbbd6, 0x54689fe8, +0x89587524, 0x78935bd8, 0x56c08fbf, 0x03c28984, +0xe2815d15, 0xb102c575, 0x8c8d921f, 0xd66b801a, +0xcdc5a9a9, 0xf289bdac, 0x4e1d280d, 0x7b7ffbbc, +0x701474c9, 0x02c7044a, 0x45524621, 0x9a00c281, +0xec754966, 0x6e867b19, 0x5c1deb47, 0x04a36965, +0xe8b0df6e, 0x5a5863f8, 0x06fcb5e9, 0xedc75790, +0xb96f81ad, 0x115429ca, 0xe7c1faaa, 0xb77d1bb2, +0xfa81c06f, 0x81580280, 0x53754f3f, 0xed8bb603, +0x5f0457da, 0xc9044f1d, 0xc3c5ebc7, 0xd9846170, +0x53b0fe56, 0xa9998df8, 0x2dfdc184, 0x5900e381, +0xa13b29b9, 0xde1866a3, 0x0c0eafc1, 0x51b5bb1b, +0x6bf37268, 0x03768f00, 0xfba25795, 0x52561882, +0x599161e8, 0x25b929d8, 0x3529eefc, 0xeb5b0046, +0x5ab890e4, 0xbb65b856, 0x08fc4aed, 0x60158b46, +0xbac5b350, 0x74da6f6f, 0xff475b02, 0x41144c39, +0x587421b6, 0x097a05c7, 0xd5b87704, 0xd8eb5ae0, +0x403d3417, 0xd72d4cd1, 0xc774dcd5, 0x22960d39, +0xb1cdbdad, 0xe869df6b, 0x448a24c7, 0x6c2d82d1, +0xeb87b83a, 0x365621db, 0xb62d7b54, 0x1c0777be, +0x477a9639, 0x8b7008d8, 0xb854be9b, 0x37bbfbe3, +0x43900578, 0x938389cf, 0xbd828d07, 0xfa63ba2f, +0xb85d0183, 0xba0f2df2, 0xd1bbdffb, 0x9615be34, +0xa13a148d, 0xc83bc46c, 0x7c4beac1, 0x8b1a5ef8, +0x0d180409, 0x765689b6, 0x7ec103c7, 0x7605ab4f, +0xae8d0001, 0xb0f08d8b, 0xb63e7489, 0x2fc57cbb, +0x53b1a975, 0xb7926702, 0xc229760b, 0x9ec6fd3b, +0xdfa315bd, 0x8294ea81, 0x86038992, 0x509c8789, +0x2bdfeb00, 0xd32b696b, 0x109e4d81, 0xd5b139d0, +0xfc3d3a70, 0xdb001822, 0x7fe9dd1b, 0x89130480, +0x1c2d2bc5, 0x8bda1425, 0xc68ea96e, 0x7adc0c42, +0x1fa291fe, 0x0d9eef64, 0x8f01bf42, 0x84e8560c, +0x6ed9124c, 0xc601e3b1, 0x1cff20c4, 0x6c1730ff, +0x9d76ee15, 0xc31b2c3f, 0xf45e5502, 0x08b0be03, +0xc134b9ef, 0x4e1c4f01, 0x6a61731e, 0xe0304cfb, +0x80972a78, 0x85b5a903, 0x3a0d06ed, 0x07c3248e, +0x7ab84d45, 0x9e084377, 0x10438b14, 0xe08df891, +0x1cded6db, 0x9c979902, 0x1859c541, 0xc05c7a03, +0x033e5df4, 0x675e4d3d, 0x36ff5046, 0x756f847c, +0x4bebe857, 0x730320f8, 0x45e9d70c, 0x3960e857, +0x19744c29, 0xbf4e0873, 0x2d2befc2, 0x06e88933, +0x2a0ee9ec, 0x056f6df4, 0xe0eb0419, 0xd10d9690, +0x82eb7e03, 0xa110a32d, 0x08a5080a, 0xfce18303, +0x2ed1beb6, 0x4355045f, 0x5154cc29, 0xd56bae3e, +0x5f5b99dd, 0x3ef632e8, 0x830655d0, 0x89b89b08, +0xc3415dec, 0x1eb76990, 0x387e1dbc, 0x9024ac8b, +0xf7503658, 0xe0f873c5, 0x4c96e83a, 0x9c47c713, +0x4a274674, 0x18ef9a94, 0x4e601236, 0x898984bc, +0xc3830ffb, 0xe16fc818, 0x75118dd6, 0x108b2029, +0xa12ab9ab, 0x99e056a5, 0x1a8ff9f7, 0xfe10c206, +0x7d7709bb, 0x940e1810, 0xca114208, 0x5553f07c, +0xeb718ef5, 0x29920862, 0xe581ca0b, 0x3db5c06b, +0x087466bb, 0x140a7449, 0xb8956d38, 0x8f69f17b, +0x106a102c, 0xa119e1c3, 0xd02db00f, 0x2900d028, +0xc4ddcba1, 0x8b90d1fe, 0x020d68f3, 0xae07718a, +0xc10a19c5, 0xa0882f72, 0x714719bd, 0x1b0e8ba3, +0xc177ce3b, 0x0972edf5, 0x15154a72, 0xe685ed5e, +0xc308b985, 0xe30b0abe, 0xb8077768, 0xd939d5d1, +0x0b73288b, 0x5fa5ede1, 0x423204c1, 0x72d4c101, +0xc10b5bf5, 0x1931c35e, 0x1007a60a, 0xea4ed4a1, +0xb85bbde5, 0x6e85b75b, 0x840fd848, 0x50bd6a07, +0x942d7c88, 0xb3f0e783, 0xb5e370cb, 0xb9f72724, +0x01a13880, 0xaf94afde, 0x0e838d0f, 0xf7f63759, +0x77982db4, 0xa00505b8, 0xaf081304, 0x5d038607, +0x6e030ada, 0x6b04a77f, 0x8dc2b077, 0xf0e5566c, +0x1febf622, 0x9a28776d, 0x772a6804, 0x05499d29, +0xc6e57598, 0xc65899c6, 0x36880707, 0x38d7ec47, +0x862b666f, 0xb61c18bb, 0x1cec7418, 0x12bf071d, +0xeb2a076e, 0x02d8171e, 0xa166d622, 0x032e1661, +0xac43335c, 0x3e1a3b26, 0xd6da2e0d, 0x285314dd, +0x321b2003, 0x6da9182b, 0x2b127d9b, 0x0330155b, +0x91919a7b, 0x43c770ce, 0x0e080542, 0x91919106, +0x2c14160c, 0xdd236375, 0x1e1805ff, 0x40093670, +0x7609db63, 0x6342435a, 0x48054607, 0x7c83637c, +0x054e4a12, 0x1d521250, 0x5683475b, 0x49f558a9, +0x325d28dc, 0x0543e97c, 0x60738d6a, 0xba082f68, +0x2b584894, 0x14bbff52, 0x2c0846c6, 0x23a7e2bf, +0xd5ad6ec5, 0xf40a466c, 0x917546c4, 0x0320bace, +0x9b8bf714, 0x2bf7220f, 0x1603d739, 0x36fd2ddf, +0x0311fb01, 0x2671ae77, 0xf295fa01, 0x0fe38337, +0xdfb6cf0d, 0x23030c5c, 0x010646c7, 0x910e0402, +0x23221246, 0x18056323, 0xb7761c1a, 0x46e6c76f, +0x285e032a, 0x979e2c6a, 0x0946b1fd, 0x31e0c108, +0x8c80c740, 0x3ea7f40d, 0x98a42372, 0xcde81c04, +0x43318b47, 0x160a6377, 0xd0e85532, 0x91063503, +0x027a4736, 0x38652510, 0xede9b4d8, 0xf8431011, +0x0558c2d3, 0x6eee0981, 0x2d7a8585, 0x4e53deeb, +0xb46eebe8, 0x9c8ae3a0, 0xf71d1cf7, 0x20d9de5b, +0xc3bf3ee0, 0x813256de, 0xbb05ec52, 0x88ba830e, +0x760fd788, 0x98f9044b, 0x2168be6d, 0x188b068d, +0xf8ce54b2, 0x06815fe3, 0x89a4c24f, 0x840b5282, +0xe11dfe13, 0x58824d19, 0x8019840c, 0x1bee5e06, +0x82c7eebc, 0xf9601056, 0xb8da293a, 0x811b31b3, +0x65018df7, 0x83c71689, 0x8393ec69, 0x34ad64f0, +0x7581826f, 0xbd09b908, 0xc87a1fb3, 0x82b865c3, +0xf7380b0e, 0x70928bef, 0x89e81089, 0xd967349a, +0x090d75a8, 0xe835eb44, 0x136bd5e9, 0x1b1e754e, +0xc4132305, 0x04afa1b8, 0xb2c75859, 0x7c4c2d00, +0x833668e8, 0xf78843ba, 0xd9c13add, 0x8b8a5151, +0x601376b5, 0x6d4b0c35, 0xe0e201bd, 0x23720beb, +0xd81f68b4, 0x6a0ee2fa, 0x6fd01aae, 0x8d046780, +0x96600f01, 0x57130835, 0x5f233e2f, 0x5c505067, +0x115e70fa, 0xe8d8f08a, 0x43b01eb0, 0xfea75d38, +0xc283d70c, 0xdb388104, 0x06d318c0, 0x4276d0ae, +0x042d67a6, 0xde0fb8ef, 0x0842af8d, 0x1e045162, +0x4a2581a2, 0xe3e88ebe, 0x0a13b4d1, 0x0a246cd0, +0xac400e50, 0x21431a36, 0x6e25ca55, 0x5bc9cddb, +0x012b518b, 0x75065209, 0x70effba9, 0x1058f42b, +0xc4ebd109, 0x8b7ae068, 0x0bba5ad4, 0x25e8bbb1, +0x3e40043f, 0x097b2013, 0x7343efc0, 0x0a6a13ef, +0xb09e35e8, 0x4d42af0a, 0xb604c1c2, 0x0657a510, +0x77a957cc, 0x77be1cb7, 0x8b07771b, 0xdb121934, +0x7bc5b6ea, 0x7bc574ce, 0x05352218, 0x90b6ede9, +0x1825178d, 0x76012648, 0x00ede007, 0x0f3b91ed, +0xab6942c4, 0x01e8dc97, 0x5a14dd6a, 0xf1dae240, +0x823749fc, 0xc917d19f, 0x755a405f, 0xdc1f81bc, +0x08b302d3, 0x247b8df6, 0x3bc2d42b, 0xeb0024b2, +0x03068797, 0xc868377f, 0xbb535212, 0x594503c7, +0x1bddf2eb, 0xf0850222, 0x5c478b18, 0x0cef1c24, +0x683e0dbf, 0x41e9c578, 0xfce0b953, 0x8e0b4789, +0x8a68dbdb, 0x6c478855, 0xd33aa272, 0x0a145712, +0x5e68da17, 0xee52795d, 0x789fb7b3, 0xc87e4b42, +0xe4293d4f, 0xf0f0c094, 0xf0de02ff, 0x0636748d, +0x8d56ed31, 0x837b0745, 0xdea56786, 0x5750028c, +0x83280b45, 0x1ab4fafd, 0x7e03edfc, 0x684f48e0, +0xec58518d, 0xeef70cb7, 0x51fc2fc7, 0xa9ed6662, +0x7f7cbacf, 0x81ba0575, 0x7b1dc206, 0xb8520029, +0x89b80e86, 0xad770f06, 0x5c77ee5d, 0x6807895e, +0x427d6068, 0x736bdc09, 0x38fe81a6, 0xfebbf496, +0x50965ad6, 0x267504b4, 0x364e07c7, 0xe84147c7, +0x0c48efe7, 0x144c061b, 0x1c14501a, 0x77e0f022, +0x68f75aa4, 0x40fc45a0, 0x60c5fc5b, 0x95eb0fb0, +0x708bdd0c, 0x7fb61768, 0xbf283577, 0x50c6b506, +0x0bd1e7d3, 0xbcb02428, 0x80a97f89, 0x88b0ee99, +0xcb89edee, 0x8833788c, 0x80dddcd9, 0xf8d3895b, +0xfa950ff9, 0x7be0d1c0, 0x7b7eedab, 0xc9f64c8a, +0x0275e688, 0xbf30c888, 0xedb776f6, 0xc883158a, +0x794b088c, 0xbb113dcd, 0xfdddf610, 0x8cb05876, +0xb3e5d10a, 0x56c50901, 0x622df34b, 0xe97ffb40, +0x2a08f7b0, 0x04fe1bb3, 0x5390a46e, 0xb968587f, +0x53dc840e, 0x6db77144, 0x05efca1b, 0x06ff4f08, +0x0b5bef0c, 0x6b98a50f, 0xb4b004b6, 0x3e905bc2, +0x68ee37fa, 0xe0662e9a, 0x45e409a6, 0xe820f570, +0x2df558d9, 0xaefc03d6, 0x74107626, 0x5908e809, +0x460cea2f, 0x8bf685ad, 0x5c1a5c5f, 0x2fc48d8a, +0x31ffa171, 0xf98341ee, 0xd0f37e05, 0xda41b037, +0xdab78dee, 0x444ef76d, 0x897f00b8, 0x405675ca, +0xef03550a, 0x167bbb5b, 0x9588d422, 0x24ef3056, +0x42c2ee28, 0x251e6b17, 0xef534c23, 0x3eda059c, +0x6ecd3fc7, 0x2d3c6f58, 0x8f08c3e9, 0x5067d6ef, +0x76c48665, 0x874789e0, 0x86842425, 0xbe9da106, +0x6820a96e, 0x5a136be8, 0x21abf30f, 0xee6877ce, +0x1cf2040e, 0x86475d1a, 0xf310f46f, 0x315339fc, +0xfec46f2c, 0xd0f668c0, 0xdee80ec3, 0x3bfb6414, +0xddb46a77, 0x83c60def, 0x0c430047, 0xc883f376, +0xd0fc09ef, 0x2c8d069d, 0xc1818690, 0x86e29b1f, +0x55758dd6, 0xcb81efa3, 0x4e558d3d, 0x6d437b78, +0xecf7e8ef, 0x12708db5, 0x7da03e27, 0x829a3573, +0x0c256616, 0xded7c080, 0x33e0b82d, 0xf03920d6, +0x5249de72, 0xbfc2837e, 0x8a548d27, 0x7428b510, +0x01418d11, 0x896f8c42, 0x5818a3d9, 0x09c60566, +0x985bc037, 0xa855f1eb, 0xc17bfb14, 0xe37f6150, +0x836175f8, 0x8fdac4fc, 0x7496f886, 0x0e6e1655, +0x9d0b6dad, 0x6dae1ae8, 0x70fdc3b2, 0x1f27036a, +0xc68969ed, 0xef03f625, 0xee1d4ba0, 0xe93ea910, +0xdefe830d, 0xa25a1b0b, 0x76aaee70, 0xec8d1b1d, +0xbf4f7360, 0xe5751a29, 0x85d231c2, 0x4960da0d, +0x166587d0, 0x7eeeadc5, 0x003dfcf7, 0x644f4520, +0xfcbb6476, 0x53d32955, 0x374d42d3, 0x5658d8b9, +0x0b9ee860, 0x9fd27189, 0x3ad8c2a9, 0x5f036ec3, +0xdfd7f960, 0x1588dc06, 0x8c350322, 0x1707468d, +0x5e2562e6, 0x05f60aa3, 0xefb12fcd, 0xb910db6b, +0x51b6af38, 0xa3cfefc3, 0xebec06c7, 0x415c5185, +0xb7eb0c46, 0xd0fb406f, 0x93015cc6, 0x17081176, +0x00a8b71a, 0xbb528b75, 0xb636c237, 0xeeb11c17, +0x25062d0a, 0x49307fac, 0xad6fbb58, 0x0dc34c07, +0xf64d8053, 0xc60ccb90, 0x0b90b6e6, 0xed5326d9, +0xfe3190c7, 0xe8ef3868, 0x53db55fd, 0x1c9a50f2, +0x7a24562c, 0xbd77134c, 0xfa810183, 0xbeab6948, +0xeb0ed03d, 0x3d8d806d, 0x05c61310, 0x9e261c0d, +0x481a5bb5, 0x7722126f, 0x85dd523a, 0xb024a3ad, +0x0ec50350, 0xcf637823, 0xbb08fde0, 0xffc8c33c, +0x5ffa8954, 0x6d361588, 0x555b3ebd, 0xe8013f56, +0xe24b5c19, 0xb76dc4cb, 0x752e5041, 0x4ce819c2, +0x1f445c68, 0x91c3601e, 0x3d5630b8, 0xd52db62a, +0xc61753e6, 0xf00b4005, 0x175c1637, 0x1833dce8, +0x57a7e803, 0xf81b6fdd, 0xd6c81556, 0x5884665d, +0x1ee85975, 0x3a27e8dc, 0x17a9dd76, 0xe84f6e04, +0xdae880d1, 0xeedba471, 0x13ba2468, 0x3d0ee953, +0xa8fceaff, 0x6716836e, 0xdc0d5f18, 0xbbae0860, +0x5e1763c4, 0x00c3f275, 0x5b572aa9, 0x8ebc0c84, +0x0da1115b, 0x26b63703, 0x1017151c, 0x78e0e7c2, +0x1407c18f, 0xebc73be7, 0x064fa187, 0x25ba23bb, +0xff681cfc, 0x6ea37100, 0x4bc705a0, 0x3369e8fc, +0xafa9043d, 0x7e091a96, 0x0f71be0c, 0xdb20e21b, +0x440802fb, 0xdbc1d58f, 0x6c36ed74, 0x7e035cb7, +0x27e48417, 0xff54eca1, 0x43a15b50, 0x17cba72c, +0xc0fd2728, 0x74f0f7ee, 0x613b6826, 0xf43d796d, +0xb5bb0220, 0x0b376cff, 0x0e097f58, 0x31d47ef8, +0xe1d0ebdb, 0xf6360895, 0xf4eb030c, 0xc3c5a209, +0xe022a21f, 0x0fe85d74, 0x5bd87e23, 0x893cf4c2, +0x2818ab75, 0x5d0db91c, 0x51d900b8, 0x38f0a3a2, +0x9b30fd82, 0xc77c4e5d, 0x8025e405, 0x2fe8125d, +0x300939a8, 0xb6348d33, 0x265436d9, 0xcfe74303, +0xe7f876b2, 0xe604b5b6, 0x7c04008b, 0x77fb8111, +0xb9d72110, 0xe92857dd, 0xe4280430, 0xc1890e7d, +0x53575f62, 0xba04f873, 0xb7f12c5b, 0x5916158b, +0x5bf17a83, 0xc6ffa107, 0x66e884ec, 0x1939eb22, +0x7420423b, 0x3bb76814, 0x124487d8, 0xe9ad3a5a, +0x02bb78ce, 0x66c1df09, 0xa204c5cf, 0xf0b1e9b6, +0xd4c15e83, 0x208edb00, 0x6a37716a, 0x82abd76f, +0x5e23a158, 0xc200a6d6, 0x907bfdf7, 0x0c8d4362, +0xe1a1359d, 0x6a162cd3, 0xe62e8174, 0x079efd0f, +0xb61ac70f, 0x89b6035a, 0x62158924, 0xb0b84f7e, +0xc46a0a84, 0x039e0975, 0x7a6c0a74, 0x08fe52ad, +0xf8397fc1, 0x0b52c533, 0xa2d4eca9, 0xdf8b1ce4, +0x770a8bec, 0x89d440c7, 0xb6fbf448, 0x1c705b0b, +0xbb75200c, 0x8400e94b, 0xd40de2bb, 0x1378e802, +0xfdf1e9f6, 0xf70b1833, 0x5cfd8a70, 0xd5ed35a4, +0xc2664777, 0x0f970832, 0x3d25c588, 0x5d001f76, +0xc709bbe9, 0xb1c28105, 0xe80ef88d, 0x328b4293, +0x8d8cf685, 0x72dcdee1, 0x8e0fb21c, 0x618c076a, +0xeadd830e, 0x0001b12d, 0xb48d5652, 0x0fd09e86, +0x99788321, 0x05872724, 0x85ce4bbe, 0x03018c39, +0x3bdbf004, 0x2c68eed2, 0x2abb59bf, 0x4b1ee913, +0x01baeb86, 0x53d7ae47, 0x4aa1bdf3, 0x7b719fc4, +0x3c89b10c, 0xbcd88a24, 0x31078a50, 0xc2fe25ba, +0x10d284f6, 0x0c743a3c, 0x0b3e5446, 0x81b76d04, +0xbbf4755f, 0xfbd37548, 0x1e730550, 0x7a463a7f, +0x4ac0338a, 0x30020c70, 0x0db3c6df, 0x721d08c8, +0x5a354be2, 0xdcd03e68, 0x5306568f, 0xda8a0938, +0x89d81bfa, 0x699d01d6, 0xa9764a4f, 0x6ad33f75, +0x27656803, 0xfbf8698d, 0x02d04e3a, 0x881e0a34, +0x5ffdda01, 0x894e94aa, 0x78802414, 0x1a742f03, +0x5250a88d, 0x5827a9fd, 0x081e1223, 0x3a388025, +0x737a705e, 0x2a2fec4b, 0x89752f09, 0xd78b6ceb, +0x4c69d26d, 0x37357ea3, 0x5d02eb79, 0xcc40bd11, +0xb61b0453, 0x81f13e06, 0x8d0ab240, 0x9f7152c6, +0xebc0fe9f, 0xe2faa34e, 0x21e890b6, 0xddfb0887, +0x9b086ac6, 0x6a00902e, 0xe0b3ebfe, 0xe4c1b167, +0x8005ffff, 0x833e653d, 0x5f14301b, 0x1f74288e, +0xe0563ccd, 0x1652d454, 0x551d860f, 0xac36fde1, +0x8112ee81, 0x8ed705c7, 0xdfb6b97d, 0x298e88c7, +0xb6852460, 0xedc860ad, 0x0b64a005, 0x230f68ff, +0x25801eee, 0x89105c29, 0xbe822bea, 0x1ed59c2a, +0x4a11a35a, 0xd0708db4, 0x8af284f6, 0xaa16ddbd, +0x88d5192b, 0x893803e8, 0x8dba370d, 0x48a24ff7, +0x3c53d63c, 0x09c8840b, 0x077cb1f7, 0x5434ac02, +0xefbb201a, 0x68a3775f, 0x8a04a106, 0x13a3240c, +0x58a34403, 0x7ab90b7a, 0x15f7696f, 0x73685b42, +0x57ee1455, 0x02904e3c, 0x7a57ec3d, 0x4ec9842a, +0xb55b7490, 0x4b764a84, 0xcec41734, 0x74ce7c51, +0xfdbb1a37, 0x39179995, 0xf3aa76f3, 0x6c575d53, +0xaab044b7, 0xde76398f, 0x3a232029, 0x1d0177e2, +0xefdf011a, 0x144b97ef, 0x5ec7c072, 0x50825dec, +0x5fc3843f, 0xffffe361, 0x72377603, 0x701caed1, +0x036d47e9, 0x8ebc1b1d, 0xe941a3c5, 0x14b4a53b, +0x87bf8847, 0x92444806, 0x7b507958, 0xb76f4090, +0x52d115b1, 0x0515507e, 0x7da082ec, 0xf34844a0, +0xc733e23e, 0x24dd13e2, 0xc02e7c20, 0x05f61935, +0xbd4bbec1, 0xbba89045, 0x08dbd0fe, 0x06dd7b6e, +0x68057095, 0x21483c49, 0x60a9f740, 0x53e95442, +0x0644901a, 0x37ca3058, 0xd230ce14, 0xa2128876, +0xd04b1810, 0x182a3407, 0x1b29ca2e, 0x084466d0, +0x662907cd, 0x34efe1e2, 0x32e80557, 0x602807ec, +0x8a5df886, 0x35628068, 0x4851b64e, 0x60a6bd1b, +0x508d0310, 0xd358a515, 0x0375ba2d, 0x4dc753c2, +0xaa608efe, 0x2a367134, 0xdc3d95e2, 0xad7285ad, +0x141a4c0f, 0x3502bb07, 0x7710eef5, 0x7614050f, +0xad546609, 0x581b6868, 0x5231c31d, 0x2974ed03, +0xdf89c8ee, 0xfb398303, 0x35882b54, 0x01dc9103, +0x6a170683, 0x7308acff, 0x8d138b29, 0x8d468042, +0x6db1d64b, 0x348d0ce3, 0xc0e74386, 0x77302c0e, +0xff6f8e6f, 0xfa830b77, 0x083e7408, 0xd772eb89, +0x29743218, 0x4cea7783, 0x74403cb7, 0x28579e23, +0xa3fb079d, 0x4e245dd8, 0xd1787520, 0x3433e967, +0x6f77ac0b, 0x68080624, 0xe8511a8e, 0x2d0836f2, +0xae3b40b4, 0x6cf83d66, 0xda16d540, 0x147704da, +0x03e89e83, 0x5d5ddb78, 0x75d312a2, 0xeb04aa93, +0xfd03188d, 0x75ab7d86, 0x2b068bb6, 0x66e5bc74, +0x7c0ec3a3, 0x3589f2f8, 0xc866e90b, 0x7fd21d37, +0x0e57654b, 0x4fe92434, 0x6e1ccdff, 0x95c03e81, +0xc48631a6, 0x88466b32, 0x93e5ff8d, 0x4bd0ad00, +0xfeab946f, 0x74c809d8, 0xf8c82534, 0x2d03d339, +0x0e72fa6d, 0xd8c4870f, 0xbc2cc139, 0xc21ec183, +0xc7253d5f, 0x053ed405, 0x8bba09d0, 0xd8a1dc06, +0x6b442308, 0x77fb2934, 0x772d4a14, 0x343ef229, +0x576cfa01, 0xc0a1e0b0, 0xd48ee4ad, 0x720b2d35, +0x2efc11a9, 0x683aadc0, 0xa36f1268, 0xac610713, +0xed0cd62a, 0x62ed312b, 0x7e70ab62, 0x69adf1df, +0xa12e740a, 0xcc15aec8, 0xcb80bc7b, 0x83cce376, +0xd0e6c0be, 0x61a007ff, 0x624517b0, 0x3920c683, +0xa1e67cc5, 0x78574437, 0x9beb3e3d, 0xe6c1c677, +0xf75ff7da, 0xcc868b05, 0x897aa32c, 0xc48e8bf8, +0x09efdb69, 0x9435f23f, 0xc1291358, 0x1189d319, +0x84f742d9, 0x25d0861d, 0xa534f23b, 0xe9820f78, +0x3245ba82, 0x0c0025c8, 0x584c2fb7, 0x5e493499, +0xdf11c601, 0x3b350116, 0x4f7e7c2d, 0xac0f3d11, +0x2c3d8958, 0x6e5336d6, 0x4afba1ff, 0xfe3f8238, +0x1537a2da, 0xd9985e34, 0xee9215b7, 0x290719ba, +0xdf1031e6, 0xc22f750c, 0x0aba1a90, 0x2f5b7e09, +0x13cc0d14, 0x40269cdd, 0xaf6da555, 0x9a4e0957, +0xe06a6c66, 0x34a4f5e8, 0x0b0a696b, 0x6943ee43, +0x056e4deb, 0x52e82691, 0xa21da216, 0x2a65de00, +0xd6211680, 0x2c710e60, 0x36e77f09, 0x4b29d05a, +0x788dd539, 0x5c1a7d34, 0x2db04270, 0x5a494576, +0xc15a15e8, 0x817fa5c3, 0x68f08f5c, 0xaf5a99a8, +0xb6ff5c4d, 0x30bb2cd4, 0xf1f2a984, 0x4d6f09e2, +0x214b63bc, 0xbe03941a, 0x1beb2921, 0xa9b4381a, +0x43735c5f, 0xc1968d47, 0x84be15d0, 0xf991f887, +0xbbe29514, 0x1366c271, 0x77a8d339, 0x261c8290, +0x876e087b, 0x07148290, 0xb41674de, 0xb7ddc6c5, +0x8b22808b, 0x40423937, 0x048ff4b0, 0x890ddbf7, +0xe9e9202d, 0x3ce9d30a, 0x73d48d7c, 0x405b923f, +0x43d48b6e, 0xa6f210a0, 0x7037ddba, 0x86418abf, +0x261020a1, 0x7ab75206, 0x988dee89, 0xc7502600, +0xeb50501e, 0x8a7000a1, 0xf4c0623b, 0x592b566c, +0xedd2215e, 0x32f3179a, 0x8336ffd8, 0xe8190a0d, +0x035b462d, 0xe29a8cf4, 0xec41bf5e, 0xe2c3e894, +0xa3603c53, 0x61344abc, 0xe0715a23, 0x2d50e81f, +0x6ce67460, 0x0cec91b7, 0x90046a0d, 0xb5b80729, +0xa0c0456a, 0x236deeeb, 0x68c5fa1e, 0x2fd77b96, +0x014258fa, 0xd984a814, 0xd4281027, 0xe95bf683, +0xd2077f07, 0xc740bad6, 0x03c0246c, 0x46e0ce2c, +0x013ee893, 0xc28152c4, 0x2781f82b, 0x7612d51f, +0x7ddc050f, 0xc5d7056a, 0x3461bb59, 0x54ece0be, +0x34181ced, 0x3bb1d818, 0x105c24b9, 0x000c0b10, +0x9f020809, 0x257304ae, 0x65035d51, 0x6db8a024, +0x750a8855, 0x134a815b, 0x3d0c3014, 0x19aadbb1, +0x3b573e15, 0xc5137691, 0x5e76eb6d, 0x2b092b2c, +0x89e00807, 0xace046e9, 0x140c1b2a, 0xe0345531, +0x80480be1, 0x034deaa0, 0xe3468bb8, 0x888be2c7, +0x00964edb, 0x32988bb3, 0x025bb8b0, 0x70da4eee, +0x2e857228, 0x6dd6b6c8, 0x9d7b639d, 0x71fdfa13, +0xc6137209, 0xf5db8468, 0x2bff6709, 0xdf6ca910, +0x0ce42bd2, 0xc0396878, 0x03a38168, 0xe91420f6, +0x7d001a76, 0x7b1e27f6, 0x9c68e3b8, 0x5a215f77, +0xc42d56e9, 0x650f0dc2, 0x8d1c6353, 0x01cabd45, +0x67bc22b7, 0x262575e8, 0x4bc7390b, 0x7b75384f, +0x140d4514, 0x66143e47, 0x3b837741, 0x28ee7235, +0xf7ef0059, 0xcc3595fb, 0x8bc48603, 0x9613d296, +0x6ed7e2c8, 0xcf778901, 0xd3891c10, 0x11df847f, +0x249e031c, 0xc37d818d, 0xc2390676, 0x307b4273, +0xc20f6903, 0xc7090c76, 0x2ff606ee, 0x34a1c215, +0x0a1e24be, 0x8df4153b, 0x1ccd1dfe, 0xd8f7e889, +0x21ff1521, 0x41fd57c2, 0x3e225ca1, 0x843bd329, +0x69ef409a, 0x61cc5a82, 0xb43b2ad7, 0x2e2b8d04, +0x27f1e1bf, 0x5970073b, 0x330f4974, 0x05ad7501, +0x68f0e1e0, 0x714d11ac, 0xe1a3995e, 0x582080b3, +0x2d2924b8, 0x430781d4, 0x018a3534, 0x0aad2360, +0xb3e84b1f, 0x0d91e82d, 0xaf5b8169, 0x39db982c, +0xde283bd6, 0xe00ded12, 0x77c3615d, 0xd20c0f57, +0xa1de9605, 0x9709d510, 0x3b5aa930, 0x203f8370, +0x0155c529, 0x2015d8c7, 0xb1101dbe, 0x3f3bc0af, +0x208520c7, 0x0c5a6300, 0xa04653b8, 0x61476a95, +0x06396f64, 0x21c7dfed, 0x3d8bad72, 0x73ef3907, +0xc0de182d, 0x05de17ed, 0xeac1071a, 0xfac93109, +0x8d8dce19, 0xdbc78a5d, 0x898a8938, 0xad6ca39b, +0x2930fbd5, 0xc9f8052d, 0x2587286a, 0x2c0982d9, +0xf836e87e, 0x40cdb82e, 0xa0a35e11, 0xa519ca5a, +0x638787c7, 0x2c321ab2, 0xfe36922c, 0x1163bab3, +0x3e815457, 0x1b031336, 0xf3d2f174, 0xaf0b6add, +0xcc682bd0, 0xc46f0928, 0x8159619f, 0x10ba9b28, +0xbfe03a22, 0xf418fb40, 0xb9c0a107, 0x106a372c, +0x41116856, 0xadd68e03, 0x454a9181, 0x379c2289, +0x25422d48, 0x360e86be, 0x5207908e, 0x7e87b570, +0xc750a3df, 0xfbef315c, 0xf7a2208a, 0x598fbc06, +0x44a18674, 0x250f5ae8, 0xf52f5cf0, 0xe51d2996, +0xf73c8d96, 0xdfbb003f, 0x3d7d5b78, 0x07864274, +0x8a5a72c4, 0x16216f47, 0x3ac003a9, 0xc7db47c2, +0x1b7df021, 0xea5659a1, 0x3a2d03f7, 0x81553076, +0x02ea53e2, 0xdeacfc67, 0x0182550b, 0x013a2805, +0x7c221cba, 0xad23138b, 0x0374d8e9, 0x60500847, +0x142b5aad, 0x06fe0704, 0xfd881ecf, 0xe80477ff, +0x3c60ae40, 0x5c5f037d, 0x08abd3ec, 0x078ac441, +0xdb73b2b7, 0x97c5a46c, 0x1b5597b5, 0xb98f48b4, +0x46e9a527, 0x96e9b10e, 0xbc0ba7fe, 0x57573a60, +0x332061d8, 0x245e9577, 0x9242715e, 0xfe32dc34, +0x366e0035, 0x0d3dbac0, 0x464c457f, 0x026e0fbb, +0xa1d6ebd6, 0x004c2595, 0x0be0f63d, 0xd00001b4, +0x90a166eb, 0x2d487ebf, 0x77a981f1, 0x6794b1dc, +0xdb7016d9, 0x08a838d3, 0xc72320d0, 0x44eeeef8, +0x740320cc, 0x75060506, 0x30d268b5, 0xe47d18df, +0xd7782a24, 0xf4a2180b, 0xaac4693b, 0xd0af06ac, +0x12e8e5e9, 0x5e78de70, 0xb51d493b, 0x97abb00c, +0x76a20a61, 0xefa6bc6d, 0x36dd6815, 0xd7b85be1, +0x241d3753, 0x5295d47e, 0xdfc801e7, 0x85df2c72, +0x72c38b6f, 0x1403a33d, 0x3d860151, 0x7d180ec1, +0x05fb005d, 0x986b09c4, 0x3074c488, 0xf7354247, +0xfdb03df1, 0x04407a83, 0x15c6f235, 0x358e4218, +0xf5f82080, 0xedd07c0f, 0x4dcb64d9, 0xc12b2d43, +0xd84344e2, 0x788291d6, 0x405eed40, 0x5f64d1d3, +0x05c7d642, 0xb0cc90c8, 0x5794a303, 0x3709d86b, +0xb8786a1e, 0x3fd025ea, 0xb22f4075, 0xf0687ecc, +0x300c2b0f, 0xd0240c89, 0x405a8ba6, 0x350bc5bd, +0x03f56a0d, 0x55536d6a, 0x30ee0151, 0xf8f8a86e, +0xdb101847, 0x22337208, 0x4ef3b213, 0xdbd28459, +0xe94b823d, 0x8852fdec, 0xbb3743c4, 0x7e8609dd, +0x5268f87d, 0xe8243651, 0xb11b1076, 0xe5b635a6, +0xf83d8bfe, 0xa48c307d, 0xbecb0448, 0xecfd0b01, +0xfe261342, 0xe1c1d189, 0x1184b952, 0x98a3460e, +0x0cc71000, 0x9c6fa54b, 0x89a68dda, 0x6ec721f7, +0x6d037dd8, 0x1e8675d5, 0x2b63565d, 0x681b8451, +0x72f9a1ee, 0x894c76c0, 0x1acb46c1, 0xc72b1a2d, +0x842967de, 0x267dc21f, 0xcc8801bf, 0x0e01b5a9, +0x01dae8f1, 0x8dce640d, 0x5dc56b15, 0x2799e86a, +0xdfb8fc8f, 0xeea56d1d, 0x8c998d49, 0xfa40433f, +0x4aa9fbe0, 0x8103b0cc, 0xc6e844d4, 0xfa36dfd3, +0x395018c5, 0x3e860ff0, 0x0579c6b5, 0x71235f98, +0x01fd6cb1, 0x5d8c0a26, 0xd87c4cd2, 0x5d770e02, +0x0ec1f729, 0xda263163, 0x9b3235ba, 0xfa120108, +0x742dbf21, 0x400b76c0, 0xa0105f10, 0xd93941d0, +0xa3805a72, 0xf70fd7b7, 0x7f215bd0, 0x28605d73, +0x79f7cb45, 0xe8bae73d, 0x1ad2f7f6, 0xd28e0274, +0x68213320, 0x423d58ef, 0x1a062d05, 0x28d8afe6, +0xf08eecc4, 0x5eb78265, 0x08474c83, 0xd1a4b952, +0x1c2eff6f, 0xc96933ad, 0x29da890a, 0xd269b2ca, +0xa1b5684e, 0x690b9cb7, 0x2934b3f6, 0xa8d15cf2, +0x2d1857f7, 0x06a10978, 0xddfa967a, 0xab82472e, +0x0ea37f58, 0xd419eaeb, 0x097ba057, 0xc4440596, +0x0660bfc4, 0x0159d2a0, 0x26991a5d, 0xf4b42c48, +0x7501e4a4, 0xa05b1727, 0xf674fa01, 0xf886eee8, +0xd0041ad3, 0x047806e9, 0xe2b31574, 0x859dfdba, +0xc09e1b7f, 0xcac9d368, 0xebed17ff, 0x77da90e6, +0x2abae829, 0x12ef6b5e, 0x0c1de84f, 0x7eef4274, +0x0773d839, 0xeb31a2e8, 0xe3c35bf0, 0xdb92dcf5, +0xeff3edf1, 0xed0e8958, 0x744d1dc6, 0x6a7bcbf7, +0x7453e82e, 0x43f5eb58, 0x0dc42808, 0x84118af4, +0x1074ebd2, 0x2f16318a, 0xe26e2370, 0x38df1ddf, +0x52b774c2, 0x138afb9d, 0x100a018a, 0xd202cd0f, +0xb6dd8c29, 0x41c36f0b, 0x742f432e, 0x4cde2be4, +0xe893c08c, 0x5127d2eb, 0x168b71ab, 0x242c4597, +0x1c8bc5ba, 0x1c239b5e, 0x50b59d4e, 0x4c142a16, +0xe80795ae, 0x07ffe25e, 0x77c6b9b5, 0x02ff8337, +0x428d0b7f, 0xfedf8501, 0x3a80efef, 0xc127752e, +0x094708e6, 0x7e0315ce, 0xc0f089c1, 0xed0a1ba3, +0x0410c8c1, 0x891cdb81, 0x81a11d30, 0xe829b548, +0xc1f65dea, 0x94aa7ba2, 0xc50a29ef, 0x4c15ad0c, +0x05741d7c, 0x50a18e2e, 0xff77d83e, 0x77093cd0, +0x0ac36b14, 0x5c8d41b5, 0x7613d002, 0x0df685ec, +0x18370a05, 0x9dea0e89, 0x4b06de4b, 0xbcd28ef5, +0x64e41258, 0x841988ec, 0xe0edcb77, 0x0775d301, +0xe80de002, 0x6b5bd2c1, 0x047ea978, 0xdeeb60e4, +0x24016895, 0xbf14fe54, 0xbe85c1e1, 0xb054bdc1, +0xe864e6d1, 0xdda1b8b4, 0xe6df087e, 0x4753ae26, +0x0afb836f, 0xb71384e1, 0x09bcd00d, 0x6cc3137e, +0x6aad889b, 0xeb42de50, 0x31bb77ec, 0x881377e8, +0x4ad34fe8, 0x9a681875, 0x74db0680, 0x360d36ef, +0xdc85bb12, 0x2debae1b, 0x200ae8f5, 0xac55627f, +0x8edfebc5, 0xa93a9329, 0x0c9f0ac3, 0xa90dc68f, +0x815f5d0f, 0xc581bcc6, 0xf0530a4e, 0x8de8f142, +0x28a36b78, 0x00795e94, 0x8d83fff0, 0xc2d19cdc, +0x60bb3f02, 0x83260051, 0xf7c3dc51, 0xec6d8f53, +0xdd2dc381, 0x56882b74, 0xc1670555, 0xcc85d7ee, +0x9404e068, 0xebe50423, 0x0daee807, 0x1acf9484, +0xa93ec7e8, 0x1521c833, 0xcf839315, 0x9eefdb21, +0x97778b3d, 0x86545817, 0x220553e8, 0x8b8b6e30, +0xc7bf6e17, 0x9303cab4, 0xc3c1831a, 0xf08ef0e1, +0xa9b75539, 0x0573caf7, 0x828c25ba, 0x16f72753, +0x83cadd6a, 0x0211750a, 0xf16ba990, 0x740af896, +0x3e07ea7b, 0x6bdc2826, 0x6d2cca19, 0xff47ab1e, +0x2083f8dd, 0xd689c50b, 0xdd9e17e9, 0x0c5237fa, +0x8de2a818, 0xc8d470b0, 0x9eb2c22a, 0xab10a32b, +0x73087f09, 0xbcdca13e, 0x13abda5f, 0x123fc216, +0xac503dbf, 0x042d59c3, 0xe6abc7fa, 0x1ef5674a, +0x3826a35e, 0x12bc38a3, 0x63d597a7, 0xbe34a33b, +0xacfe68a8, 0x81812e28, 0x5daf4c46, 0xa2a7dbe6, +0xd9ebf26d, 0xa7757d58, 0x3cfc5808, 0x8b9e23c2, +0x03cb1a8f, 0x73cb399f, 0x47785ff6, 0x76ce39f0, +0x0e739e12, 0x3877cd39, 0xa9e8de39, 0x75cf1b81, +0xc82943f1, 0x06001089, 0x055e0dba, 0x3b155faa, +0xde0b9dfc, 0x1f558202, 0xc0890d1f, 0x9d4a2276, +0xa673375d, 0x101bad1a, 0x35d9c889, 0x758df5f1, +0xeb42c083, 0xa5a145be, 0x1b7c4529, 0xfc48ed2e, +0xc40d3b85, 0x2c5df673, 0x3102ade2, 0x8d1889d0, +0x06754841, 0x280dd8f0, 0xb9e5ebd0, 0x28478114, +0xf843854e, 0xb06ff129, 0x217fb1a7, 0xf8598dc1, +0x06411d3b, 0x2d435fa2, 0xd8e696e5, 0x4106fc30, +0xd19858c8, 0x1533352b, 0x40b69003, 0x223b7034, +0x83405c24, 0x8d4bb106, 0x03f09ffc, 0x0e071336, +0xc25d80c6, 0xb52fa65d, 0x03343c18, 0x8b27b72d, +0x44b6bb42, 0x8939fc89, 0xc27824f8, 0x939acd03, +0xd1300db1, 0x46afc1c1, 0x47335a26, 0x32a00489, +0xd3598941, 0x0b5a991f, 0xb6ec084b, 0x882c5b2a, +0x4d5a5905, 0xdd7dec1c, 0x0314160c, 0x8c1f0453, +0x9a604a82, 0x08bac022, 0x0e62b545, 0xa69ce496, +0x8039a21d, 0x594edb01, 0x3b904dc3, 0xbc14d753, +0x7e20684d, 0x21042003, 0x02bbbae2, 0x8314da34, +0x11791968, 0x09e3ba45, 0xff6a16ec, 0xa6cd74f3, +0xe64035ff, 0x2a2ebe66, 0x0f281c2a, 0xc8348210, +0x18329e6d, 0x2a1e5ea1, 0x350b7cda, 0x3dc20d21, +0x58590116, 0x2cefd475, 0xef114563, 0xf3582d1f, +0xefc0a675, 0x155027fd, 0x733befd9, 0x54a12737, +0x155c3d26, 0x07d12bc3, 0xfe5a8237, 0xac2dfb36, +0x5def754b, 0x42745807, 0x172608b8, 0x655fdba7, +0x689d1dbe, 0x3d972b69, 0x991ca3eb, 0x7f6818ef, +0xcb9d8610, 0xb1730f05, 0xca7c78e8, 0xe144cca9, +0xbf7ffd5d, 0x109f6653, 0xff740806, 0xa0e12ddc, +0xa47a463f, 0xf17629cd, 0x4b007752, 0x8174a07a, +0xa97e147b, 0x75f886ed, 0x0d046ae3, 0x6c1c438d, +0xa20dec08, 0x232e3681, 0x22decacd, 0x1643f1d1, +0x0aba6b50, 0x21c31e59, 0x44135200, 0xadd76402, +0x1deb46d3, 0x3c7d240c, 0x5d10558b, 0x582edae6, +0x342414e8, 0xb020b646, 0x0e356b04, 0x05230837, +0xf729324e, 0x0e9f6d88, 0x8bf6c203, 0xb019b827, +0x5f036341, 0xfefd6446, 0x6da8e8ae, 0xc904f37a, +0xb016f5f5, 0x6bdbfef4, 0xbc800ac6, 0x06847303, +0xf47dd17c, 0xed7e05f6, 0x28740604, 0x681c3c11, +0xec1d13d9, 0xfdcd9301, 0x7b96b8bc, 0x24d2341f, +0x012566de, 0xaedefd06, 0x23c955ab, 0x04090406, +0xdbc4d610, 0xd8010436, 0x14253b68, 0xf672cc3f, +0x0403efc7, 0x26104068, 0x6160b6de, 0x3a8d8f89, +0xd6d9e316, 0xc701a245, 0x24045004, 0x082c7b1e, +0x03bbbfcd, 0x681c6a16, 0xe1a84664, 0x75649982, +0xb4b03f7a, 0x1fdff80e, 0x00139e91, 0x50383300, +0x3a386856, 0x8faeab05, 0x28340cbe, 0x430333c8, +0x0362d8dc, 0x0f14fbbc, 0xb5eb9f8f, 0x60a58c79, +0xb3d27a01, 0x1f495aec, 0xe9d073f6, 0x68ee0d31, +0x10e95c00, 0xc28c10ff, 0xe0b58b35, 0x577f68ae, +0x45408d70, 0x43c60388, 0xb90f5891, 0x98b712a2, +0x42bd8895, 0x9c43a1ed, 0xda310610, 0xa045b785, +0x10062a15, 0x22fb723f, 0x433d452e, 0x0506be04, +0x14c2ed03, 0xf5e3301a, 0x0526a6bb, 0x585b0c37, +0x516c4911, 0x09171573, 0x18a31136, 0x5bdc4329, +0x88bbf578, 0x704917b7, 0xbe147e8d, 0x6c35eb83, +0x8014b1bf, 0x024782df, 0x476d5f03, 0xca5c45cd, +0x0b23c05c, 0x68230b77, 0xc36689ef, 0xc33e1506, +0xd18deef8, 0x68a61c87, 0x6a565318, 0xbfc7bd3c, +0x0450dd06, 0xb028a366, 0x236bf1d5, 0x9341b08a, +0x3fc3e6e3, 0x14563839, 0xc40c6823, 0x28a9ea0e, +0x4610c037, 0x88bb63c6, 0x25744214, 0x3910404f, +0x1106a37b, 0x97c8ec29, 0x1a9c40ed, 0x13602ac0, +0x1ef54f8e, 0x892ec1b9, 0x715796e3, 0x453418e4, +0x1e059800, 0x85a21e00, 0x59393f11, 0xd586c989, +0xd603915d, 0xb457adc8, 0x39ff0997, 0xe0ba193f, +0xc1a868c3, 0x5e021bf1, 0x711e081f, 0x7132aec8, +0xf108c7d1, 0x1c93529f, 0xd42e2239, 0x0c18f708, +0x7eedae1c, 0x9d86e6f6, 0xd8500642, 0xc56832ff, +0x401e6849, 0x18ddda26, 0xdf1b8ce8, 0xf7ab1fc0, +0xca688975, 0x91b40d93, 0x03611b00, 0xb82305b9, +0x5241ae0a, 0xb759b75f, 0xc90c1758, 0x15108a51, +0xd82bddb6, 0xba5fe34e, 0xa8bc08b7, 0x0722d9ee, +0x7c5b02c0, 0xfa7d6b1d, 0x74ed30f7, 0x75171c0b, +0x19e28c0a, 0xeb5f0eb1, 0x361145c7, 0x3a1780d6, +0xc2504a48, 0xddbea267, 0x36b83dc0, 0xb72be80b, +0x39eb61f4, 0x24d57f23, 0x7a09a194, 0x428aea0d, +0x3c7a7444, 0x39b1b7ec, 0x29fa3f6d, 0x50770ca3, +0x2f64ba4b, 0xff66f834, 0xb844d005, 0x774833b3, +0xd1b4b607, 0x4837b63d, 0x82ae14e9, 0xaf638358, +0x09120cd8, 0x950b325d, 0xe1d63db4, 0x5840e9c2, +0x0e4b8dde, 0x9a11417c, 0x8d12ddc3, 0xaa08f670, +0xa584127d, 0x1c0b6c62, 0x1505de0d, 0x96d58d2d, +0x0512ca46, 0x84efb88f, 0x08db382d, 0xa8a1644a, +0x6c759b00, 0x1e926a2f, 0xe6369ba3, 0xf3c64218, +0xc5ad20c2, 0x1fc9d436, 0x8b66dee9, 0xaeb6ecee, +0x1e7cf211, 0x397d424c, 0xb18960d0, 0xc00d5f5d, +0x028dd616, 0x5c0b85c2, 0x6f8e7725, 0x8d73892e, +0xb76d2b47, 0x2fa3d9da, 0x427b0ec0, 0xf70805fe, +0x0bad40b1, 0xbc9c2003, 0xe1141685, 0xb10c5b04, +0x88b5925c, 0x190d0fad, 0x06f8114d, 0xb850445c, +0x43586dc3, 0x01d5562c, 0xf112c6d0, 0xbb92a5b6, +0x241ff677, 0xbd1a3428, 0x19428fed, 0xe1eeb09c, +0x5850ad52, 0x7672782b, 0x014352ae, 0x0efe505e, +0xbb78477e, 0x47148a35, 0x0f9c0641, 0xcb0eed8e, +0x682dec7e, 0xae2098dc, 0x1f1942f1, 0xa4171d6f, +0xaa18e1e8, 0x14479b21, 0xa5cc0842, 0x081b861b, +0x8ee91c58, 0x0eea3728, 0x3b4fa91e, 0x59e8f2e1, +0xba210975, 0x80e82e6f, 0x967e077a, 0x8901508d, +0xe115380e, 0xf22d36ae, 0xd272d0c6, 0x85412c53, +0xc51de560, 0xde8f0767, 0xb7a3ec12, 0xb7ef9b12, +0x67c9c3f0, 0x6a2e538d, 0xf2688352, 0x40fba05d, +0xcb9f57b8, 0xb8721be9, 0x7dc20474, 0x093be9a4, +0x5f3b8011, 0xd5b6f0a0, 0x743c0415, 0x8d4d6116, +0x93801804, 0x78d5c258, 0xeb1fa702, 0xb0c0563c, +0xe6096ac0, 0x6f5e417a, 0xe8b3123a, 0x0c061ae1, +0x01a3ce75, 0x2dabb40a, 0xe29b1cd6, 0xc9a0d0a3, +0x817feda6, 0x46efa65e, 0x8d21156d, 0x11762a5f, +0xb8add208, 0x874ad1d0, 0x0774ee3b, 0xddbdd04e, +0x7f804d15, 0xa1f3632a, 0xb8391b24, 0x922f0b85, +0x7b66e975, 0x2a990fab, 0xbb6c9a37, 0x756c961d, +0x723e473e, 0x0d46e06e, 0xc0c7ab46, 0x005746f3, +0x71cec30b, 0xd7d88b55, 0xdbb0fb85, 0x211443ef, +0xbf64a314, 0xa958044e, 0x068e6c88, 0x781a1a21, +0x5854cf21, 0x6b3a1053, 0xb40e28de, 0xa3b53333, +0xc5a38218, 0x0baacc07, 0x1858fbc1, 0x7f717fa8, +0x117e7aba, 0x00debf3d, 0xd3136e6f, 0x0706057e, +0x2705c068, 0xfa30039a, 0xaaf73fa1, 0xe8f8210b, +0x0000199c, 0xe2a4c3f7, 0x2f513108, 0x469e04e9, +0xa377dc88, 0x0462885e, 0x150fd0cc, 0x6888ec7e, +0x6c43a580, 0x47e801b2, 0x52c59ba2, 0x57f16b19, +0x9b66e8b3, 0x19849680, 0xe921f007, 0xd7dd590a, +0x1a87ee1f, 0x10328d01, 0xf733205a, 0xae9fc7b2, +0x3807e89a, 0xb3c5935d, 0xb99687d7, 0xd118f160, +0x07ebb018, 0x326ce9dc, 0x50ec81ad, 0x8d48a0e0, +0x03dbb7d7, 0xa00420a2, 0x3b210944, 0x7df60d1b, +0x0c4505df, 0x09461622, 0xd9471623, 0x0cf5e860, +0x59737724, 0xe9fe0240, 0x2c771176, 0x2e2d0401, +0xc3e0e806, 0xa3e27c3e, 0xc6934627, 0x6de8f568, +0xe048682f, 0x1beb7783, 0x167aba2c, 0xa3a83032, +0x4cdb9d0f, 0x41e012d1, 0xdb143e2b, 0x677dcfbe, +0x2df45984, 0x75db5413, 0x19bc0013, 0x8d193c19, +0xed942494, 0x6e7fddd3, 0x680d6a24, 0xe852311c, +0xc6ed0202, 0x14fe8425, 0x8b1889b9, 0xfffff8b0, +0x1f86c20f, 0x17dfc531, 0x65c44094, 0x6da0cf09, +0x06ca28c6, 0x1aff7f53, 0x17c0ec45, 0x6ae0418a, +0x8b446a43, 0x7546e29f, 0x20b633e8, 0xd41b6a55, +0xa86abfb7, 0xc2f9e833, 0x3c8d4511, 0x5fe24703, +0x05c6ef6f, 0x7e5a7a0c, 0xa4b6531f, 0xee6c4f41, +0x037f4676, 0xd2e8fb26, 0xdb46c329, 0xf7ae883b, +0x3d83e17f, 0xf5e19576, 0xc0ef303d, 0x02f4742e, +0xf1011ce3, 0xeef6dd20, 0x05c7de89, 0x8e31c71b, +0xe068616a, 0x37b64efb, 0x131d3072, 0x93411031, +0x13c660ed, 0x18160809, 0x91c221c2, 0x2616f22f, +0x50d2230d, 0x13de4dc2, 0x9da223da, 0x18745330, +0xf744eefc, 0x086c0712, 0x09af89e4, 0x3bada608, +0x2e9ee02c, 0x712c3c43, 0xb3e85fd0, 0x7405cb09, +0x7e13ef34, 0xc1dde8b1, 0x6c7f1ba1, 0xd1f112e9, +0xf7acf029, 0xc0b132f1, 0x83c8c04b, 0x6b6513fd, +0xc171e8c5, 0xc4817683, 0x0b72cb81, 0x5e3cbb09, +0x2e1269c4, 0x22255098, 0x40552bb4, 0x636a09a8, +0x5feeceae, 0xc1dbe874, 0x315f73ee, 0x33741cff, +0x20b3ffc7, 0xc08ef5bd, 0xbce2e7a6, 0x07e08383, +0x6be6e110, 0x47472ce0, 0x759eb60f, 0x82dfebdd, +0x3944c383, 0xa1cf7cc7, 0x03408e72, 0xa382433c, +0x81c33b19, 0x318f4be8, 0x3815b9c2, 0x6a0c5f28, +0x73766949, 0x3b0dbc4f, 0x685ea166, 0x1b7c0ec7, +0xe877068c, 0x71492692, 0x6b85686d, 0x49c28068, +0xa100ca91, 0x1ac8429a, 0x5eaa59eb, 0xc10673ab, +0x0d685c0a, 0x27083904, 0xe82fbfa9, 0x3b62f5c6, +0x0a817308, 0x012a4e43, 0xc846f723, 0x8c6e83fe, +0xfffedbe9, 0x0192beff, 0xe80f0de3, 0x45d314f3, +0x3d766068, 0xde19a1da, 0xf6b914df, 0x231c786e, +0xadf99d20, 0x0918921c, 0x59a35978, 0xab8f8120, +0x80e46707, 0x979265c5, 0x9f0f1000, 0xa6499068, +0x83346810, 0x6f8a31c3, 0xe9581844, 0x1403fe02, +0xecd48a94, 0xafab1010, 0xc2c0505c, 0x76bcf785, +0x00d4a009, 0x09b2c58a, 0xcf561366, 0x83c7a3b8, +0x0a3014e8, 0xdb31806a, 0x2ce87d51, 0x58c626ea, +0x62352d1f, 0x5022d97b, 0xb712cc54, 0x19c24ed4, +0xec94c684, 0x0e230e49, 0xc0230064, 0x066368d1, +0xbf0d0530, 0x157000fb, 0x3a34ac41, 0x2e27a50c, +0xf05f1984, 0xf8915f8f, 0xfb803a0f, 0x83cf0d66, +0xe0760df9, 0x341e3741, 0x423ae0ca, 0x92e1410c, +0x3bfc2cab, 0xf833c509, 0xb9b16edf, 0x737506fd, +0x6e762121, 0x8a0e5a8d, 0x8ddb0e52, 0xbb9c97e8, +0xb1770a3c, 0x290fe065, 0x9a2a5502, 0x7e52d572, +0xeadb7467, 0x5e590a77, 0xf7669875, 0x85a03f7e, +0xc78b6279, 0x66bcf55c, 0x808bdc3d, 0x6e25bf16, +0x14ea83fd, 0x8b66a148, 0xff70010c, 0x0174edd9, +0x8122784b, 0xf739d129, 0x3235830f, 0x0a5df8a9, +0x121529cd, 0xef1bf631, 0x4c7f80c1, 0x11097b80, +0x3de44675, 0x063d358b, 0x83ec1eed, 0x8b5922c6, +0x86f70456, 0xdc5f9fd6, 0xeb2bc5c2, 0xfd1587d1, +0xdb91b683, 0x74727e8d, 0xfe7d9610, 0xabca8d5a, +0xf70270ad, 0x8bc5281c, 0xec654628, 0xd1540338, +0xda9dbb61, 0xea4da31f, 0xd4290806, 0xf45c24d1, +0x860f6fd9, 0xfef9e5c7, 0x2f406f18, 0xc2562677, +0xe80e6f8d, 0xb683128d, 0x81e4a11d, 0x3401697d, +0x2299b798, 0x0ef357d2, 0x16da7790, 0x1a69a95b, +0x391c2602, 0xae8fc0b1, 0x776c5ded, 0xb6567216, +0xe52fc061, 0x4ee85720, 0x41a5a012, 0xc60416dd, +0x2bb1244b, 0xf0550f31, 0x81019b70, 0xdfeec12a, +0x8ac1c71c, 0x68122f43, 0x00366743, 0x67f2851f, +0x31743624, 0xdab617b1, 0xfd7f7c03, 0xbde9fc3c, +0x6c7c7dc0, 0x890cc4a7, 0xeea09506, 0xd6352d2d, +0x05c72ddb, 0xe5c65c16, 0xc2f40ae8, 0x292c3218, +0x831ee80f, 0x01f82f80, 0xfdd58648, 0x9c2a9567, +0x9228f136, 0x68560d8a, 0x37e37faf, 0xca38dfe1, +0xc2171473, 0x6644c06b, 0xb8149839, 0x74edf02d, +0x72134205, 0x06fa80ec, 0x1d74081e, 0x6ece9c6e, +0x50034623, 0xc6d70522, 0xaebd1165, 0xc37b204e, +0x134aa22d, 0x41832380, 0x8fcceb89, 0x6053359e, +0x1c363668, 0x5c00908d, 0xb97abeae, 0xa6bc649c, +0x8a6a3ffe, 0x3c3c0246, 0x3cb00276, 0x588b5050, +0xf90b8810, 0x81fc10e4, 0x4349c52e, 0x6f4833b3, +0x53448368, 0xf3490af4, 0x29715f64, 0xa2279318, +0x20607403, 0x0a74832e, 0x03220152, 0x75fb4360, +0x13048006, 0x1f76b882, 0xd0f81aea, 0x0dc468b2, +0xc618c805, 0xd045ad80, 0x487cc1dd, 0x4c6b66bf, +0x558e067a, 0xd80135a1, 0xbdc35fe8, 0xd39a06a3, +0x85c5892c, 0x636bb5ff, 0x01ceeb2c, 0xee397e3f, +0xdff16b76, 0x7358071e, 0x841e8a0b, 0x0f5c75db, +0xc286f572, 0x893bdaf4, 0x3505382d, 0xaa1d2e1a, +0xc73f0827, 0x1b5001bb, 0x979b6a8d, 0x0bfb02c0, +0xd6c0e858, 0x18f20ce9, 0x6e047310, 0x04a225ba, +0x22a17fd7, 0x454b8a68, 0x7b3fd093, 0xfffff0c9, +0x6eef51c3, 0xfbdddb60, 0x1038dcff, 0x60d0158a, +0x2875d284, 0x06c18dae, 0x0996d179, 0x0cb0f81b, +0x020fd8c8, 0xe2031215, 0x7ed99d20, 0x0812fbbe, +0x483e1ed0, 0x353146d9, 0x9d4a0121, 0xc45eca61, +0x4a017e84, 0xa015640c, 0x7ddb1efb, 0xdb6d3c10, +0x840d2200, 0x102b1dc0, 0x668db7ef, 0x6102fe9d, +0x4974810c, 0x54a33d80, 0x386d876d, 0x1605410e, +0x97e0fe96, 0x46b6afba, 0x023074ec, 0xff26c8e9, +0xc35405c6, 0x0125fbc0, 0x7b16c515, 0xecdd8282, +0x16fffe08, 0x0d14cecd, 0x8e82c7b7, 0xa3231abc, +0xa6ebcc68, 0xbbb50bb7, 0x809a7c49, 0x947605a2, +0xf524c3a9, 0x007560ec, 0x9a0eba39, 0xeeec2e79, +0x0969ae6e, 0x0500ff6f, 0x8337b02c, 0x0317c980, +0x0003902e, 0xeed17acb, 0x8d1e79dd, 0xfb2cd1fd, +0xe73b7408, 0xc236d1fb, 0x097a1885, 0x5ef90f08, +0xc436c202, 0x183c1f02, 0x2e15fb39, 0xb7d4e82f, +0x6200b95a, 0x185c50c4, 0xb7eca646, 0x72581503, +0x2916e9ed, 0x733b4204, 0xec834990, 0x8200e1fe, +0x20dd8917, 0xd6e90804, 0xc0589343, 0xd956a116, +0xbf70140d, 0xfebeef70, 0xe99c2e3f, 0xe1760db0, +0xe905a1bb, 0x01edfea7, 0x389d86eb, 0x5c3d837f, +0x0cc52a54, 0x89b8ff20, 0xc49237f5, 0x083589ef, +0xa3fd4b5f, 0x170d83d1, 0xe2520370, 0x04c3a1e9, +0x65ada883, 0xb955ebb7, 0x089d24fc, 0x10f0061d, +0x94b02c98, 0x1c18d8bc, 0xd6970986, 0xdc014c36, +0x8d9c1c9f, 0xbae9332c, 0xb410b20a, 0xae0ca0da, +0xfc54c807, 0x00807453, 0xe3d3c320, 0x8a5456e8, +0xbaf7bf42, 0x071c71c7, 0x295164a0, 0x8f9f6ab6, +0x41880f12, 0x51c363f0, 0x80c8b951, 0xf785aa51, +0x8128ce85, 0xc70de0f9, 0x6d775430, 0x02138c13, +0x13732c12, 0xdfd98501, 0x7401393e, 0x18c18365, +0x166c5c24, 0x7fcb725b, 0x26134020, 0x9901aa44, +0xed6e5812, 0xd21df442, 0x75cb3908, 0x39e2b0e6, +0xb82dc1a8, 0xdc742ce9, 0xeac1209f, 0xbe14410a, +0xbebe2d45, 0x4f89cd75, 0x0847092a, 0x81bdcdeb, +0x932bc19b, 0x21718b8f, 0x867df339, 0xa0d737fe, +0x94a3731c, 0x74d02c3b, 0xf239420a, 0x0bdcdf7c, +0x8d6ede16, 0xd06c14a4, 0x81317502, 0x7eeab776, +0xeb4704d0, 0x8a14cbb9, 0x236e757f, 0x428b3c07, +0x83f66a1c, 0xc0574b51, 0x800675bf, 0x0bbd1b7a, +0x39d51e8e, 0x70f61a10, 0xb6826ade, 0x09580319, +0x6af04923, 0x89b58e0e, 0xddf8e325, 0x4c471ece, +0xf753aac7, 0xc6353fd7, 0x19031a42, 0xf5177e39, +0xdd897247, 0xfe815773, 0x77f7896f, 0xd8c7f742, +0x781d2d7d, 0x7c127301, 0xb01e797a, 0xf020dd50, +0x5515561c, 0x6bc5c8f1, 0x9b914a72, 0x16a2dfea, +0x24759637, 0xfeff8147, 0x7b77e800, 0xbe765492, +0xfd81a345, 0x00a97258, 0xfd10500c, 0x4745cd09, +0x0684b5d1, 0x78ac4c72, 0x9208955d, 0x9bc24eb0, +0x4c770589, 0xdb4664ff, 0x232248e2, 0x50897771, +0x11560836, 0x371be85c, 0xdffb7728, 0x7883de7e, +0x899174bf, 0x195088fa, 0x1a04ea89, 0xce6d5566, +0x50de06c5, 0x58069b04, 0xee93bd30, 0x306a0f18, +0xf72856a8, 0xbbba0fdd, 0x0a890a78, 0x2e144289, +0x361f146a, 0x2735b517, 0x0c185c34, 0x516374b7, +0x53202e80, 0x2d00161f, 0x89209f7e, 0xfce2eac2, +0xf75aa68e, 0x0b74152e, 0x6d10c386, 0xe06f749b, +0x24fb014b, 0x0fabcd7e, 0x483d6a53, 0xbab75844, +0x5019a80d, 0x5a261a04, 0xf6c39a1d, 0xc4408602, +0x368a1075, 0x9219c10f, 0x4288fdcd, 0xd0e9e918, +0xd62a3c2f, 0xeb3c2215, 0x82b9bbd5, 0x70fb1217, +0x7ee97a3f, 0x18505389, 0x751c0cc6, 0x2941d7cd, +0x30433743, 0x128d6624, 0x1295d76e, 0x2e05caa8, +0x17665872, 0xc21f11b6, 0xb04bc126, 0x43e5d603, +0xb2180dc8, 0xa216a71c, 0x1f01f015, 0x9a2053e4, +0x1fc26c1a, 0x0be5974c, 0x86a83856, 0xaf043f87, +0xcd675a14, 0x65262ae7, 0x46e74626, 0x48d54d8b, +0x05a91f74, 0x68fc0018, 0x1c670c21, 0x5bbc4bca, +0x866e026a, 0x06e015d6, 0x6f6009e0, 0xe344a9ff, +0x89dcebf0, 0x0453dae0, 0xd00b4c52, 0x279a3208, +0x60fdd7a9, 0x9c3f51cb, 0x0629f860, 0x41822573, +0x008ff6a5, 0x58d53b6c, 0x8f685c8f, 0x0ac0b656, +0x425706cc, 0x136614c1, 0x89f8e4f6, 0x152c2ae0, +0xf6072608, 0x80cb1666, 0x49415c36, 0x6afc3a0d, +0xa9efb36b, 0x21daf7c2, 0xbf11cad0, 0x0f0ebaec, +0x069cf486, 0x211c7514, 0x6016c072, 0x1b8f4706, +0x828c69a3, 0x10e0f8db, 0x1913084a, 0xb74418ba, +0x0bed0537, 0x2f80c98e, 0xe0cd3121, 0xa1840ba0, +0x7e21087f, 0x0628b109, 0xdea5db35, 0xb01c87f0, +0x1af03034, 0xbe3f3c04, 0x4146d12f, 0x75044d17, +0x826b839d, 0x887bbf1a, 0x49db5c17, 0x50c06c06, +0x3c03bd32, 0xc88fd2f7, 0x391d77b5, 0x062e74f8, +0x59c6f52a, 0x2c40b01b, 0x832dc14e, 0xf6b5d886, +0x65a774ec, 0x1c5ea377, 0x8134e929, 0xc43d8f8f, +0x68e91492, 0x30bba7ff, 0xd681155b, 0xff0f3657, +0x836826e3, 0xcc611d73, 0x91e810c3, 0x51ccf815, +0x725a1af0, 0xed4f41e6, 0xe8a319a8, 0x4a105768, +0x7a9626f7, 0x1614fb1f, 0x78745a24, 0x50d12f09, +0x7b760153, 0x100a0a1f, 0xefc246c7, 0xa42a688e, +0x41fa8113, 0x7f9743c7, 0x733f816c, 0x10468b4c, +0x2dd23539, 0x2046ff03, 0x300872ff, 0x6a716df4, +0x06e2fb4e, 0xe754adea, 0x0c701534, 0xa5c06356, +0x75f300da, 0xdf5cd90a, 0x5d50b6a2, 0x7eed9e81, +0x410e3b54, 0x4c897ddb, 0xf8eb5c31, 0x50eed8b3, +0x24466085, 0xe6c87667, 0x6fa50220, 0x29bec8df, +0xe81843e4, 0x906f038a, 0x0616bd6a, 0xdf591feb, +0x728ace58, 0xe3620db6, 0xf07b17b5, 0x741c056a, +0xd5e8c6c9, 0xce586d20, 0x76e901c1, 0x042d02c0, +0x0904465f, 0x6ce8fe06, 0x0878061b, 0x43c914e6, +0xc80c531c, 0x7ae1c2f3, 0x9020a0de, 0x5397c2ec, +0x388d76ff, 0x30aedc1b, 0x826912d8, 0x03f2c679, +0xbbb2e2a4, 0x001c8819, 0xa754fd00, 0x106c75d5, +0x54c9408f, 0x355b58d8, 0x3e6003d4, 0x8a3f5c41, +0xf47c1682, 0x74253c06, 0xcee254cd, 0x86bbdd76, +0x89420288, 0x75214606, 0x150717e2, 0xcd27831c, +0x29548bc6, 0x8ba0c414, 0x2040b1a9, 0xa377edad, +0xddc59758, 0x4c46ccb4, 0x87b4d883, 0x0ab8046d, +0x46f67609, 0x6e8f656e, 0xd70d849f, 0x53297b1b, +0x1c73b6ec, 0x233cbeb5, 0xcceafbe9, 0xc2b90ef6, +0x6c228e18, 0x33db7d40, 0x07683cb0, 0xed161162, +0x1abea607, 0x783c20c8, 0x64fae912, 0xdbcb1208, +0x4000bccf, 0x21047e74, 0x5a634974, 0xf53a1e89, +0x8c471788, 0x83a3319e, 0xc8175e15, 0xe2ede017, +0xb9aadd43, 0xe7721c6f, 0xc41d13e9, 0x6f00e8b2, +0xc4de3440, 0x89eaeb58, 0x88041e0e, 0xadbb4407, +0x0abeebdb, 0x06e2188b, 0x88d3390d, 0x35bf7e1b, +0xeb4f0372, 0x82682aab, 0x3de857bf, 0x47ed1b70, +0xc7010c22, 0x371c1c3b, 0x02eb2fe1, 0x78ff2077, +0xc438104d, 0xc3fa5748, 0x3271ca73, 0x9b770a88, +0x31e322db, 0xc03b268d, 0xebe0721f, 0xb9ffadc1, +0x852c38a8, 0x893778d2, 0xb9995efb, 0x4c85ee45, +0xc2832d40, 0xada3c630, 0xa0a1a2de, 0x994f8dea, +0xf6fd03d9, 0xad286c6e, 0x8801c311, 0xd9c14913, +0x14e9f177, 0xdd6f556e, 0x2d07c613, 0xc1eb47de, +0x5620e2f0, 0x4ae562d0, 0xb53dbd9e, 0x74e15b0b, +0x301d2f0c, 0xd3475832, 0xbe8fc002, 0x880fc94c, +0xd3d85ae4, 0xb77d481a, 0x808a0ffb, 0xd009978c, +0x04e98319, 0xe0b9e979, 0xfa86e03e, 0xc60cb968, +0x40820e8f, 0x462003f7, 0xc70a84e9, 0xc33b0d54, +0x43640ddb, 0x3b806a1e, 0x0b72cdab, 0x63fd8439, +0x1d061d18, 0xe9761784, 0x9b64fdae, 0x053d54db, +0xe9ebedb8, 0x6311ed40, 0x12a878ff, 0xf90c6a27, +0x02a90ce4, 0x085a1ef5, 0x72535e15, 0x135828cc, +0x1c0dbc2f, 0x7e481d1b, 0xab3bbbf6, 0x7650be37, +0x5d8a3a74, 0x47451711, 0x7b7103b0, 0x842f747b, +0xd3382beb, 0x08d88823, 0xe0a17d9f, 0x4bb2d988, +0x0dd08820, 0x63d188cb, 0x0f776fe1, 0x0838204a, +0x4e0375ca, 0xc396c675, 0xc06a2dc1, 0x5fd2045b, +0x7ab72329, 0xd81e8ee1, 0x8ad389c3, 0x4241025a, +0xba201062, 0x5423f6f9, 0x231000dd, 0xd689b0a8, +0xdbefd049, 0x0a9de51a, 0xf02443e1, 0x0f66b65b, +0x3f5eb0b6, 0x42003a80, 0x801e421a, 0x750bed85, +0x14a34afa, 0xf46baddc, 0x1027634d, 0x2622744b, +0xc8fec9b1, 0x4b0d742c, 0xf3390f74, 0xc41ef75f, +0xeb41c6a5, 0x1c3eedf6, 0x76a836f0, 0x1d1a2ac3, +0xb78241d8, 0x5aad89df, 0x84c3c3ca, 0x809d1038, +0xad002e38, 0x09405575, 0x57c33677, 0xf5d86fd3, +0xffc95133, 0xaef20833, 0xc249d1f7, 0xeec16f6e, +0x092ac801, 0x73087f48, 0xc35f1ef5, 0xf88ae017, +0x7e634a3d, 0x7c15bbb5, 0x801174c8, 0x404a9739, +0xae05740d, 0x321ddee0, 0xc3c829f4, 0xdf1b85e1, +0xb1107d76, 0xf289271f, 0x38028a26, 0xdfdd8001, +0xd3f4c860, 0x22434107, 0x7889e175, 0x904e07b1, +0x9da632b9, 0x19a3b60c, 0x32da8913, 0x37004110, +0xe72cf053, 0xfaeb789c, 0x621df015, 0x3e6225cd, +0xb1db96ed, 0x01e3855f, 0x75f238c3, 0xb05c260f, +0x9e1f152a, 0x8846d75d, 0x7c9c1ee8, 0x22f9ce59, +0x04c0075e, 0x8521a3c8, 0x265ef006, 0x091d8bde, +0x7e882dcf, 0xebb6e04f, 0x1e8bdbd0, 0xb018740f, +0xbac6c767, 0x5a593d5e, 0xb3068938, 0xd1d76337, +0x8bfc4a2f, 0x05b1195c, 0x03697734, 0x4143774a, +0xcb6bb113, 0x5b18d605, 0xfe030125, 0x331ceb25, +0x3b43080e, 0x377dc973, 0x4b11c157, 0x1602165d, +0x0bf41729, 0xc5efc2a5, 0x75494346, 0x746b5fef, +0x854d3f78, 0xb731fcd2, 0x7c2c5621, 0xd839017b, +0x754a4197, 0x675b18f5, 0x37bb4e11, 0x894c6bca, +0x5ace02d1, 0x576d5b6b, 0x53dfc289, 0xb0550512, +0x3910c7f5, 0x7dce89e9, 0x9a5bf909, 0x9a880bad, +0x75e81cfd, 0x46b7ed4e, 0x3b07738a, 0xebe87dee, +0x811f2fdd, 0xdbebdf18, 0x20d6109c, 0x01428a4a, +0xe31bfc78, 0xc7443a42, 0xee751608, 0x9ebfdb31, +0xa722c608, 0x0977eab8, 0x30b704fe, 0x34fb403d, +0x6c7f3d80, 0xb1d88fd2, 0x3d623d74, 0xc095ff80, +0x03815fc5, 0xa3ff00f8, 0x55528d54, 0xa8cf0449, +0x14754cdb, 0x8cc152de, 0x3100027a, 0x80cc1bad, +0x8554d285, 0x162b9048, 0x06696135, 0xc05e0edc, +0x4569aedc, 0x430458e8, 0x8026bc1b, 0xf5dc7b0d, +0xe28440d4, 0x53603823, 0x42e24c75, 0x24ce551b, +0x72760102, 0xe65bae11, 0x0f21fd3d, 0xbf4282a4, +0x54e81797, 0xf3eb0eb7, 0xc45c8d27, 0xe8e6343b, +0xdaadb6c0, 0x8d55b0e8, 0x50812401, 0x3ec7b5a4, +0xffa4b617, 0x66840e75, 0x758603c7, 0x6c4a97b0, +0x02438a2a, 0xd8538aeb, 0x09a860bd, 0x1538298f, +0x4c740f7e, 0x2850487b, 0x82584e8e, 0x156208a0, +0x3064bf3c, 0x9343b641, 0x841cc004, 0xc2363d8b, +0x883f05c6, 0x827da23f, 0x00752e66, 0x95ebfdfe, +0x750e0538, 0x57edebac, 0x530cf603, 0x0c75e91b, +0x85c6c38f, 0xf52f61d9, 0xfeee2825, 0x896e4ad1, +0xc84b252c, 0xc80600fe, 0xc8a225b6, 0x2596cf61, +0xe874638a, 0x2db0e931, 0x7d707600, 0xb2574a3f, +0x3d25bec1, 0xffffd984, 0x58f75b2c, 0x1cec8901, +0x5adec953, 0xf3562edf, 0x255b28fd, 0x006a071c, +0x8a49e283, 0x47b70f18, 0xf828c780, 0x5706046d, +0x020c8d08, 0x63d92913, 0x66f0b05b, 0x5f067983, +0x1c040643, 0xf6f74951, 0x348d02ff, 0x80de2902, +0x8901037f, 0x74090ef5, 0x25063771, 0x63a96d82, +0xf2da1a14, 0x0aa5d4f5, 0x5174dafa, 0x5d7435df, +0x29c04740, 0x6c6e07e1, 0x6f151d40, 0x35b88fba, +0x047a519b, 0x8001bbea, 0x5107c7d8, 0xb577e910, +0x6f099070, 0x8515275a, 0xd105351a, 0xd897a110, +0xf2196d00, 0x7c0e6ede, 0xfd0aeb0e, 0x1da9041a, +0xaa23bac3, 0x06e88bdb, 0x003f3d98, 0x421e4103, +0x1237db90, 0xb30b01fd, 0x37e00408, 0x4f447a06, +0x35ff4c37, 0x418e6c9c, 0xa996c229, 0x23c00163, +0xdd8538e7, 0xeb07065c, 0xfcbc55d1, 0x403c407e, +0x0ca8a15f, 0x37230243, 0xac95006b, 0x0acb3e0b, +0xdc602dda, 0x2a0843ab, 0xe0bb3689, 0x066a40ee, +0x6dcf8379, 0xe87ecb96, 0xfffffaea, 0xa1d91c10, +0xbeeb1c98, 0x2c3f6407, 0x30392e33, 0x8826b201, +0x90f7e961, 0x51b0e49b, 0x00bb0f96, 0x46578c0d, +0x49d73aa1, 0x847b0069, 0xf9fbc23d, 0xe152b9a1, +0x31e6c3c3, 0x01c60de1, 0xc960a394, 0xbd0ce24d, +0x366bb543, 0x0392c413, 0x84d00908, 0x0be1ae0b, +0x2e1ed869, 0xea2c68a1, 0x03ed93d7, 0xa1056a09, +0x54e8c103, 0x6056df68, 0x880aa033, 0xfd0a5437, +0x5cf38874, 0x08e2c1e7, 0xdb7c418a, 0x4e0b2aeb, +0x0d520a03, 0x38add40c, 0x7ce99d54, 0x5d22db45, +0x0db41724, 0x10b40df2, 0x4d01502c, 0xa1beae9d, +0xf6a15583, 0x801243ad, 0xc6119896, 0x16bfeba4, +0x8d585faa, 0x10821a7b, 0x08f06216, 0x5690cb7c, +0xc085534a, 0xf021c673, 0x0974e6a1, 0x28620d79, +0x5e034cb8, 0xba0df441, 0xed830b87, 0x030e0508, +0xbddb140f, 0x1e6b38db, 0x74483b7f, 0x96024337, +0xd5db3bc2, 0x628fc012, 0x180faed5, 0xe999f4f5, +0x1aaaeb4e, 0xeb5e2e95, 0x2fb9d6e7, 0x80032517, +0x362b1b14, 0x36d9eeb8, 0x2108375e, 0x64fac6eb, +0x758add14, 0x25eef00b, 0xce811e0c, 0xf045d68b, +0xfa81b947, 0x7c1074ea, 0x4b415e16, 0xa482c2a0, +0x30ed7d8b, 0x1db489b9, 0x03b4b803, 0xfb58ec71, +0x05f5ff52, 0x62008390, 0xf82ce0c1, 0x0f0a0f5d, +0xc2b29388, 0x20b49034, 0xb2b4934c, 0x72711036, +0x2ace6415, 0x2aa25b1e, 0x7f0a40f3, 0x1a9e3d2c, +0x1f4e7875, 0x56c85610, 0x369044a1, 0x158df89d, +0x3b41ba23, 0xac01e975, 0x3ddf641e, 0xfddddc60, +0x0cd47529, 0x05d2eb03, 0x93cceb02, 0xb7190d60, +0x93f92ef8, 0x8025ed04, 0x6f577113, 0x60c258dd, +0x29040d0d, 0xcd55aa10, 0xcc2e8990, 0x00e128e6, +0x053b5a36, 0xde36d812, 0x02bf2323, 0x0a2c18a3, +0x226c0700, 0xd4838bae, 0x11b83da8, 0xfe0d040a, +0x55353e66, 0x75871eb8, 0xc40283da, 0x98488011, +0x87d87425, 0x158df858, 0x3b031b5a, 0x8e268797, +0x6e1048b5, 0x82c73e34, 0x1f82a646, 0x78546640, +0xb622ea59, 0x9482e831, 0x98091415, 0x9110de28, +0x810cb9b1, 0x289a9cc2, 0xb5509f49, 0x390baaf6, +0x28749e0c, 0xf8229f9d, 0x002376a5, 0x2818e889, +0x3ecff7f9, 0x0f0a1390, 0x96c35b10, 0x3436ba81, +0x748f61e2, 0xaf644954, 0xd87588d7, 0xcdc4f684, +0x18f1c821, 0x2e08f3a1, 0x0757e2f0, 0xfe532036, +0x61d0018f, 0x6b394483, 0x0eb103f3, 0xaa225de0, +0x6cc9828d, 0x6281d880, 0x31eadaea, 0x11e00821, +0x91151438, 0x92e463b3, 0x70839753, 0x750fb3ec, +0x013b2f74, 0x72393bd8, 0x20991e05, 0x3323f54a, +0xc6c5b8c4, 0x7c3f0319, 0xf153f586, 0xa863bd44, +0xdd199801, 0xcd466114, 0xe3c7f201, 0x69a92c11, +0x8ff6e7b2, 0x0523c706, 0x5eb9148f, 0x3ab65302, +0x7711092c, 0x86868b4b, 0x36f69691, 0x69896c55, +0xc4828626, 0x2821f590, 0x8284c736, 0x183e668a, +0x02c61d89, 0xfe5a6cd6, 0x51786806, 0x9ceb5edc, +0x28989750, 0xbd43c180, 0x92adf664, 0xbe41086d, +0xd698090b, 0x605848e6, 0x3b9eeb9d, 0x69718c66, +0xa5c711e6, 0x1b110500, 0xb16deb1b, 0x89338b47, +0x024e401b, 0xdd9c1687, 0xb3fbf5e4, 0x0d1b149c, +0x40a30540, 0x91183ac4, 0x39e12ec3, 0x914077aa, +0x77bf460a, 0xa31aa440, 0x741c8cd2, 0x630b520e, +0x57061e5b, 0x3208ca47, 0x2ab404ab, 0xd8332bfd, +0xd6602140, 0x418b15d2, 0x09404a22, 0xdb11dc3c, +0xe2afdea5, 0x465f478b, 0xb5011202, 0xc05ceac7, +0x8d580419, 0x7518f858, 0x2d2b5eeb, 0x0c192b47, +0x050e4613, 0x2003060a, 0xdf305958, 0x0e75b8e8, +0x10560312, 0x8d8f5392, 0xc3520851, 0x7321e2ae, +0x0e5e6ff3, 0x1c24e4b2, 0x80ebfe23, 0xadf4e003, +0x0ef64ec5, 0xd089c9ba, 0xa00a0fcb, 0x49056f1d, +0x08684868, 0x9ecfdf37, 0x89fd1c44, 0xd2ebdc74, +0xe02c62eb, 0x555dd3a1, 0xc8f1743f, 0x53170916, +0x10755f8c, 0x80a031fb, 0x5e8b2f5a, 0xefdf860a, +0x41035017, 0xb8d91574, 0x4eedfab5, 0x0c7e130e, +0x8a1c698d, 0x05fd81e3, 0xa41fb064, 0xd17ec789, +0x088f8bc5, 0xcd51d0b6, 0x8b3bc061, 0x9db055fa, +0x550c86f2, 0x43a2b739, 0xe80c4940, 0x938c1910, +0x75d0d3aa, 0xc1118076, 0x79e90770, 0x16e0fd2d, +0x11351a19, 0xd3b802ab, 0x0283a249, 0x05062a58, +0x3882c104, 0xadf4a88c, 0x6c4563bf, 0xb2548bd3, +0x9e8dd9f3, 0x1f524c30, 0x07f75a9d, 0xf406c4fd, +0x86c6cd6d, 0x01230216, 0xd685159a, 0x220306e7, +0x0583c876, 0x10071a03, 0x44864aa1, 0xa114f231, +0x71441854, 0xd6258830, 0xac862480, 0x52307c44, +0x2c13f1f7, 0x8a45b233, 0xfc199452, 0xbb3e799e, +0x15049a05, 0x017cbf2c, 0x168a5888, 0x24834084, +0x1e8df46c, 0xecd8c7a4, 0xca317504, 0x1860f07f, +0xd8892adc, 0xe951a4b4, 0x57b77d76, 0x260647cc, +0x0abc1e04, 0xc70f9082, 0x8c42d1e1, 0xded042d8, +0x2dd7807b, 0x6fec4531, 0x997c04b9, 0xd12f25ed, +0x186f5351, 0x094ac2e3, 0x8e5164e4, 0x776da0f2, +0x2d46bc04, 0x21a0a0e8, 0x578da92d, 0x3f9809e9, +0x50992364, 0x54419815, 0x1f1d4270, 0xd07500bf, +0xb0aa5ce8, 0xe9c46003, 0x11be8033, 0x03a3c3aa, +0xc6b68dd1, 0x035d4035, 0x40687435, 0xa8f4e037, +0xfbb13908, 0xb43775dd, 0x20e8c73f, 0x50e50fc9, +0xee9e48e8, 0x04d9afbe, 0x1396b60f, 0x28100905, +0x77cac7e8, 0xe6b914fa, 0x54d6297d, 0xc70b5cfa, +0xdbd0296d, 0x4931a602, 0xcf1973cf, 0xe8b7313a, +0x6a2cc085, 0x8a0c0c55, 0xc2382247, 0x8dc1a76f, +0x5b601354, 0x63b71046, 0xc116fc11, 0x164619e9, +0x76124e03, 0x47145b18, 0xcbc15f14, 0x20985ad8, +0xc718db56, 0xbb8899be, 0x90840ffc, 0x8f0f0d93, +0xf57d0131, 0x0808fb6c, 0x7f081d11, 0x896e4a7b, +0x04da3eaf, 0x287c357f, 0x751d0b63, 0x256e0c15, +0x5d0b359e, 0x076ddb0c, 0xeb2744c1, 0xb2521aec, +0x7507e3eb, 0xdc67a017, 0x277474db, 0xad857c04, +0x068c50b5, 0x68070470, 0x6e6b6796, 0xbff2b81b, +0x22b78207, 0x796796fb, 0xeca74caf, 0xcd2c9f3b, +0x0d6dcfdb, 0x0d008988, 0x0a04407f, 0x9b7c3074, +0x209797b6, 0x0c10740b, 0xce298675, 0x1972e91b, +0xdc5436f9, 0x670ab3e8, 0x67a01f52, 0x51575ce4, +0xb6740f3d, 0x34b92b40, 0x0d045904, 0xd6330414, +0x0f11fb1c, 0x74224285, 0x3b0a2ef4, 0xc8cf233c, +0x15181023, 0xf639b70d, 0x024eea8d, 0xf7f2190a, +0xbcfd59fe, 0xa730db9d, 0x8f080142, 0x7420008d, +0x66cd2e7d, 0x707f04d7, 0x7c147414, 0xd8fed115, +0x39fcd637, 0x0abdf6a7, 0x0ab25abc, 0xe6b1be79, +0x4fa7f503, 0x2322a922, 0xedb1cd63, 0x22983825, +0x0a84f938, 0x462ed8a9, 0x6479f89a, 0x0a6ee966, +0xcf237d8d, 0x6468637f, 0xdf714e58, 0xec558bb6, +0x04447f08, 0xe6325c32, 0x333cf2d8, 0x55303b70, +0xcd66fbfb, 0x9c0a27b1, 0x72511cfa, 0x7bae0a11, +0x153e1bec, 0x74755106, 0x3e7f043f, 0x977e6cff, +0x1dfdfc73, 0xfde8fc72, 0x3d167476, 0x36467b4d, +0xe11ad653, 0x910acdcb, 0xb419e467, 0x1cb799c2, +0x0abec6fb, 0xd50aac7a, 0xec0aa1d7, 0x030105f2, +0x11c396d4, 0x052f5137, 0xb62c35f9, 0x97cce803, +0x6ff725a0, 0xd6ff0e16, 0xf1e8fcfa, 0x8dc85e09, +0x9a17d56a, 0x80c1832e, 0xd82ba1b1, 0xb857ad54, +0xc2ea43e5, 0x8149b679, 0x2fc013f4, 0x914da5e2, +0x37ebeb83, 0xa8e6eb1a, 0x858b3e23, 0xba08e3c1, +0x7003bb0b, 0x30350d1b, 0x08b86662, 0xbf4030b1, +0x6962ac9b, 0x02720987, 0x0a88e430, 0xdec899e4, +0xc35fc4a6, 0x24093d90, 0x99052b0d, 0xf93e8b49, +0x3d85b362, 0x0a3d4339, 0xf21c8361, 0x890b96e6, +0xd65ef97b, 0x334c8a0e, 0x3d0bb87f, 0x26c0b9a8, +0x3b96cd27, 0x9e49908b, 0x916c0c0b, 0x839e4992, +0xad55300d, 0x5b1444be, 0x49435024, 0xdef513d3, +0x85c6ac44, 0x1134a3f6, 0x5f90e411, 0x95f83701, +0x20054a1d, 0x8b128017, 0x837b92c1, 0xfa810853, +0x7c15573a, 0x7eb76886, 0xe8672c80, 0x54003f1f, +0xe949e04f, 0x534c90c3, 0xd56e05b8, 0xbb00fb6e, +0xd329f108, 0x5b07ff50, 0x2cc7398a, 0x811a7725, +0x32335f3b, 0x9823745f, 0x2362ab41, 0xc6a26149, +0xe69a205e, 0x75253d83, 0xf51cab60, 0x09b3a479, +0x6c013ff6, 0x4ad47492, 0x02087dc2, 0x07421a0c, +0xffdb61d5, 0xc984f87c, 0x7b80c075, 0x33272a08, +0xc2a36fb1, 0x313d552d, 0x5511a3c1, 0xebf7ea19, +0xa34068a0, 0xccc0e7c3, 0xc3c258d7, 0x12925069, +0x044f0fb0, 0xc00a4faf, 0x87608311, 0xc43db140, +0xa9102786, 0x35ab554d, 0x217aa72c, 0xd2bae99d, +0x218936e8, 0x032c0e89, 0x9354b5e0, 0xfc2390e8, +0xe4702d4b, 0x96fdf761, 0xb061e601, 0x1243e6b0, +0x5600d81c, 0xd8e142e6, 0xb6d83514, 0xc01dc308, +0xa06d5372, 0xe95fa338, 0x5fa17dcf, 0xba1d3fe2, +0x3b9aca00, 0xdcc0694c, 0x48521234, 0xf7b00dd5, +0x8ae967f1, 0xe4b85f02, 0x8cbad6ef, 0xa91d0000, +0x706c0004, 0xf00e8247, 0x40bff1ae, 0xb901d0a3, +0x28c4bd05, 0x7fb60a41, 0x68e94fbb, 0x05c71558, +0x1fb0071b, 0x1144090e, 0x2267a236, 0x16844847, +0x0874c151, 0xd76c3d4a, 0x07b9470a, 0x3c099e56, +0x0448cd05, 0xe9d90554, 0x22c11508, 0xc6475727, +0xe9a09b76, 0xa3217468, 0xbf686664, 0x40c9926e, +0x0609706c, 0x20e8f540, 0x68207d40, 0xd92cb690, +0x89f6324d, 0x843d801d, 0x028c0988, 0xec5d35e1, +0xb73d9a8c, 0x1cc81368, 0xba6ebb05, 0xe8179c04, +0x82b02aa3, 0x344ec1df, 0xb9282eb9, 0x3bafb1a5, +0x304cb9ec, 0x74420209, 0x35f23280, 0x31c5cc14, +0x33af404c, 0xb9444ecc, 0x030918a8, 0xbe464931, +0x076042bf, 0x602ecb68, 0x466bef54, 0x070958ba, +0x132e015c, 0x485632a3, 0x3118a042, 0xd09c8368, +0x80096c4d, 0x25e1b913, 0xe7b3d003, 0x6e680192, +0x0f64d847, 0x31f4b645, 0x613d59f8, 0xb9222289, +0x5aafe84f, 0x31d0f0e8, 0xd368c068, 0xf0f8bd43, +0xe3f62bd0, 0x0975cfa3, 0x41175e99, 0x21b8f7d8, +0x1e201be3, 0x91363e52, 0xc0e9c311, 0xd1c7096f, +0x99547398, 0xe0977705, 0xfb1e28cf, 0xf339db53, +0x5a060372, 0x6eff187c, 0x5aea0d43, 0xe8e22de0, +0xf3f1be2b, 0xe69f7258, 0xabeee2bf, 0x5a144949, +0x746285e8, 0xbb510807, 0xeb1e1742, 0x52ed33f0, +0x51da1bc5, 0x9f037851, 0x548a37b0, 0x00755002, +0x7445e400, 0x9026a568, 0x3500ff91, 0xec0e2338, +0x050239ff, 0x001161dc, 0xefbeadde, 0xff025d03, +0x9195a85f, 0x50203c21, 0x6c434558, 0x746e6569, +0xff75bf3a, 0x637241fd, 0x00303a68, 0x444e553a, +0x02320a49, 0x010d3731, 0xec2fbe03, 0x3c2b0cff, +0x83828180, 0x87868584, 0x0436035f, 0x033d3208, +0x6b05c580, 0x09b2110e, 0xdf6c812c, 0x5f627303, +0x2b5fab64, 0xffdb4706, 0x63ca2c27, 0x544146a4, +0x203a4c41, 0x4b756f4e, 0x7220ffff, 0x2d6c6165, +0x65646f6d, 0x61747320, 0x215e6b63, 0xdcd90041, +0x4e03dc6f, 0x612d2b56, 0x746f6e6e, 0xbf762023, +0x145ccedd, 0x50252124, 0x636f1772, 0xfe736c6f, +0x446ffb5b, 0x50434844, 0x54465420, 0x696e1604, +0x69640063, 0x1bdb6b73, 0x6c81b7d4, 0x3170706f, +0x0b202d20, 0xb6b6e675, 0xda6c6cc6, 0x30ca6666, +0x6b7f0302, 0x7872fdbd, 0x40726520, 0xca252072, +0x6c747233, 0xb7323138, 0x39b3edfa, 0x62393307, +0x35656640, 0x6d863833, 0xb0dbb563, 0x3131166f, +0x1809312d, 0x5d7e6c65, 0x23e17b6c, 0x74646403, +0x2e0b6e40, 0x6ec6b436, 0x743039fb, 0x65686478, +0xa27630e1, 0x8ff6b16b, 0x1d640235, 0x33776e66, +0x1e333036, 0xb7b07d09, 0x303038e6, 0x656e9c63, +0x52006f2d, 0xb6f14c54, 0x55078fb5, 0xb375736e, +0x20397495, 0xbdd65041, 0x22032f6d, 0x22016325, +0x62613c9f, 0xfb083e14, 0x57ddedb7, 0x69206771, +0x0c78866e, 0x70746674, 0x886f4c00, 0x6efb7b2d, +0x40251369, 0xe873253a, 0x122f2f3a, 0xd60217b6, +0x3f0c0a0f, 0x3f697372, 0x8285c23a, 0x693c0be6, +0xc2406f42, 0xbab5d6ff, 0x69980a87, 0x7a73656c, +0x6d203e20, 0xb0d84567, 0x280f07b5, 0x21002968, +0xa1ed6dbe, 0x3d617f2e, 0x699569d1, 0x5b67616d, +0x2fef6dc2, 0x49424e28, 0x7b44281f, 0x0ad0002e, +0x8c2061ff, 0x6d617267, 0x9bcb6820, 0xa142f75b, +0x62d69855, 0x73b96769, 0xd08b6558, 0xb970b9bd, +0x5f746983, 0x08f2701d, 0xfdb6bad7, 0x756f6620, +0x0f1a2ec8, 0x089d3353, 0x11336f77, 0x654d0a10, +0x2c0040a4, 0xeeb83bd8, 0x28200ab1, 0x12290626, +0x60e11de6, 0x8c520617, 0x470b7961, 0x50ad3461, +0x0d776d78, 0x752e450c, 0x76ebd9bd, 0xfc6c2083, +0x0965db20, 0xb735b62d, 0x25bf6d1b, 0x97d873c9, +0x6b76de38, 0x726135f3, 0x5735748e, 0x62176237, +0x6e771647, 0x706d603d, 0x6b5b52ba, 0x62615b16, +0x6c73380b, 0x90146b6d, 0x06740e74, 0x2f4b6b2d, +0x7a4e2e18, 0x52f6a265, 0x38ae4346, 0x8cec1663, +0x19005332, 0xf4926649, 0x284905b6, 0x000a293b, +0xbdb18c1c, 0x63d3e5d1, 0x64f66965, 0xe87662d5, +0x7d8c306e, 0x643a756e, 0x61a3ae64, 0xb4b1b473, +0x2b6a4249, 0x6b76b473, 0x4455b6a5, 0x5e36510c, +0xdc586d75, 0x06691876, 0x61cfe062, 0xb6d93c35, +0x5b128c19, 0x70175d07, 0x6dda6963, 0xeceb8634, +0x002e5d3a, 0x5fb7f0a0, 0x34333284, 0x39b23635, +0x44434241, 0xe870c545, 0x4f3b66be, 0x5f2f0083, +0xbdb0ceac, 0xe520f7f0, 0xd633534f, 0xb2f40064, +0x9a0df6de, 0x2e342e35, 0x18435b33, 0x4d8b7c1f, +0x24204216, 0x4c5047ef, 0x68eb0e29, 0xa474e92c, +0x2e1c6594, 0xd1bba998, 0x724416b3, 0x3fb872f7, +0x1da3dc3a, 0x155cea20, 0xdd3e205c, 0x175a3822, +0x11784500, 0x53873a73, 0x9f0ec158, 0x6d276f69, +0xeb6da178, 0x69ace423, 0x2c737172, 0x370de120, +0x0121129c, 0x5370624d, 0x75642d73, 0x57188fcf, +0x3f0a78b6, 0x35133543, 0xe10ab58c, 0xb920ef73, +0x42c6c66f, 0x1249b9e3, 0x40613f6b, 0xc2d817d6, +0x7f0a8975, 0x9b4d4f52, 0xe1afb5b6, 0x74c36765, +0x09337884, 0xdbb63c67, 0x350bb368, 0x780a634d, +0x7468bf0a, 0x770314a5, 0x6db78964, 0x708dda41, +0x6e74344c, 0x8849866e, 0x36c935d0, 0x7bff1e0a, +0xf71cec63, 0xa13d2157, 0x1819ac75, 0x67096576, +0x051b9c0a, 0x6c1ed857, 0xe59c0321, 0xa5488165, +0x09190549, 0xbae6d76b, 0x6f017c5a, 0x2b677b83, +0x30361362, 0x3f203e45, 0x06a5d26c, 0x70827292, +0x0c18cf73, 0xe4b604b2, 0xb2047e3f, 0x11441e64, +0xd0bb6162, 0x0e45d486, 0x6e679407, 0x82946c52, +0x2900cb14, 0xb2b65277, 0x666fac37, 0x3f823220, +0xc618230c, 0xf8d37632, 0x04bdeb66, 0x7bb59dd6, +0xb83fbf64, 0xde60ad1b, 0x64698fa6, 0xad83e133, +0x4373666d, 0x52b56f3d, 0xa78586e2, 0x5f7385d6, +0xd654788e, 0xc60a19d0, 0x6d78d08b, 0x0085ed78, +0x6f74ecb6, 0x40ff610c, 0xfb0a15ec, 0x088a3ec2, +0x119c0e07, 0xbf620128, 0xb6c42214, 0x295f63a6, +0x92c08bb2, 0xea50a92b, 0xb11f8120, 0x405b0229, +0x78f9ea6e, 0xdee72d79, 0x71e61222, 0x79a16575, +0xc8112c4d, 0x8d004462, 0xd845b045, 0x67af871a, +0x2861bb48, 0xad88e898, 0x9f6e7056, 0x9a3db4d8, +0xf2a07245, 0x79200267, 0x561b0ee1, 0x4fcaa302, +0x7dce1b0b, 0x48777334, 0xcdc48a76, 0x176a5874, +0x66374a68, 0x41821966, 0x3dcb1600, 0x008a9fc3, +0x830f8161, 0x4f4f42a9, 0x20402d36, 0x439a0f02, +0x6051b5ae, 0x00b3cd91, 0x6ee3bbf6, 0x6c75e02b, +0x623436b1, 0x524142cf, 0xee6e0335, 0x7838307d, +0x133c043a, 0x6113736f, 0xb45e2d81, 0x648d6522, +0x01ee6491, 0x23623a69, 0x64003f58, 0x0b0247c7, +0x4d70433f, 0x06651855, 0xb15d9f2a, 0x21b810c0, +0xad523a52, 0x39e0c479, 0x0fe781a0, 0xc360185c, +0x8a106f0e, 0x19e04172, 0x709c8298, 0x60c37482, +0x67316aa5, 0xeb58b468, 0xb346d4b0, 0x8ce24276, +0x02c0dd16, 0x6b75b93f, 0x02d68441, 0x826b36c0, +0x79d5e9a9, 0x6d82bd61, 0x342ec018, 0x7719b743, +0x9b266340, 0xa6aa2e6f, 0x7529db06, 0x9c831b57, +0x9704ccfd, 0x7e81608c, 0xe0003700, 0x47672080, +0x9f7f07ea, 0xc89307cf, 0x9bd83656, 0x001f9317, +0x26ceaeba, 0xde670610, 0xf770036b, 0xec6fb1f3, +0x9b812910, 0x13813907, 0xa3813878, 0xbbbe690f, +0x13ac8651, 0x111307ac, 0x12b31211, 0xa6f9b2d8, +0x601500bd, 0x4033c513, 0xdf3627cf, 0x1340f77c, +0x13d107db, 0x59e5ab06, 0xeea11712, 0x7b7014ea, +0xf90fdb1f, 0x03ab0707, 0x0d5fbf78, 0x82ba8078, +0xd0614108, 0xb6803766, 0x6a933c8c, 0xecaf9339, +0x0517fd95, 0x7777b204, 0x51826313, 0x53dfeff6, +0x0b960763, 0x003705af, 0xfa0302b1, 0xd80ab0ad, +0xe8ed0b01, 0x00857b2d, 0x000338cc, 0x819176ca, +0xb042135b, 0x2a40002b, 0x4507d0fb, 0x0000014f, +0x00000000, 0xffffff20, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, +0xffffffff, 0x72ffffff, 0x31386c74, 0x7a2e3933, +0x206d6f72, 0x2e342e35, 0x47282033, 0x20294c50, +0x65687465, 0x6f6f6272, 0x726f2e74, 0xffff0067, +0100000, +}; diff --git a/tools/firmware/hvmloader/Makefile b/tools/firmware/hvmloader/Makefile index 00cfdcad3f..35313e4f01 100644 --- a/tools/firmware/hvmloader/Makefile +++ b/tools/firmware/hvmloader/Makefile @@ -51,12 +51,12 @@ hvmloader: roms.h acpi/acpi.a $(SRCS) acpi/acpi.a: $(MAKE) -C acpi -roms.h: ../rombios/BIOS-bochs-latest ../vgabios/VGABIOS-lgpl-latest.bin ../vgabios/VGABIOS-lgpl-latest.cirrus.bin ../vmxassist/vmxassist.bin ../etherboot/eb-rtl8139.zrom +roms.h: ../rombios/BIOS-bochs-latest ../vgabios/VGABIOS-lgpl-latest.bin ../vgabios/VGABIOS-lgpl-latest.cirrus.bin ../vmxassist/vmxassist.bin ../etherboot/eb-rtl8139.zrom.h sh ./mkhex rombios ../rombios/BIOS-bochs-latest > roms.h sh ./mkhex vgabios_stdvga ../vgabios/VGABIOS-lgpl-latest.bin >> roms.h sh ./mkhex vgabios_cirrusvga ../vgabios/VGABIOS-lgpl-latest.cirrus.bin >> roms.h sh ./mkhex vmxassist ../vmxassist/vmxassist.bin >> roms.h - sh ./mkhex etherboot ../etherboot/eb-rtl8139.zrom >> roms.h + cat ../etherboot/eb-rtl8139.zrom.h >> roms.h .PHONY: clean clean: From 7b448e13e0f816fab36a5a9f46a12fce3d585de8 Mon Sep 17 00:00:00 2001 From: "kfraser@localhost.localdomain" Date: Tue, 7 Aug 2007 09:04:44 +0100 Subject: [PATCH 22/24] [ACM] Explicitly cast byte arrays when used in copy_from_guest Explicitly cast the target array type to an array of 'u8' since the number of bytes copied is calculated from the type of element in the target array times the number of elements (3rd parameter). Signed-off-by: Stefan Berger --- xen/acm/acm_policy.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/xen/acm/acm_policy.c b/xen/acm/acm_policy.c index 5fd57e872b..23c5bbc79c 100644 --- a/xen/acm/acm_policy.c +++ b/xen/acm/acm_policy.c @@ -710,10 +710,10 @@ acm_change_policy(struct acm_change_policy *chgpolicy) goto acm_chg_policy_exit; } - if ( copy_from_guest(dels.array, + if ( copy_from_guest((u8 *)dels.array, chgpolicy->del_array, chgpolicy->delarray_size) || - copy_from_guest(ssidmap.array, + copy_from_guest((u8 *)ssidmap.array, chgpolicy->chg_array, chgpolicy->chgarray_size) || copy_from_guest(binpolicy, @@ -844,7 +844,7 @@ acm_relabel_domains(struct acm_relabel_doms *relabel) memset(errors.array, 0x0, sizeof(uint32_t) * errors.num_items); } - if ( copy_from_guest(relabels.array, + if ( copy_from_guest((u8 *)relabels.array, relabel->relabel_map, relabel->relabel_map_size) ) { From d1b295913fee1b6c7aaaf7ac8a26b085e0c854f0 Mon Sep 17 00:00:00 2001 From: "kfraser@localhost.localdomain" Date: Tue, 7 Aug 2007 09:06:38 +0100 Subject: [PATCH 23/24] xentop: fix abnormal value cpu(%) when domain shutdown. If we test multiple domain create/shutdown many times. sometimes abnormal values of cpu(%) are appeared. This is because shutdown domain remove failure. (in other words, memory corruption of struct ) This corruption makes abnormal cpu(%) values are shown xentop sometimes. Signed-off-by: Atsushi SAKAI --- tools/xenstat/libxenstat/src/xenstat.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/xenstat/libxenstat/src/xenstat.c b/tools/xenstat/libxenstat/src/xenstat.c index a109960c41..461806ec7d 100644 --- a/tools/xenstat/libxenstat/src/xenstat.c +++ b/tools/xenstat/libxenstat/src/xenstat.c @@ -677,7 +677,7 @@ static void xenstat_prune_domain(xenstat_node *node, unsigned int entry) /* shift entries following specified entry up by one */ if (entry < node->num_domains) { xenstat_domain *domain = &node->domains[entry]; - memmove(domain,domain+1,node->num_domains-entry); + memmove(domain,domain+1,(node->num_domains - entry) * sizeof(xenstat_domain) ); } /* zero out original last entry from node -- not From c0efd4c9393885bfa80d1511d152aaed4202c3be Mon Sep 17 00:00:00 2001 From: "kfraser@localhost.localdomain" Date: Tue, 7 Aug 2007 09:07:29 +0100 Subject: [PATCH 24/24] xen: Clean up some paging files: no tab and trailing spaces. Signed-off-by: Xin Li --- xen/arch/x86/mm/hap/guest_walk.c | 2 +- xen/arch/x86/mm/hap/hap.c | 56 +++++----- xen/arch/x86/mm/p2m.c | 174 +++++++++++++++---------------- xen/arch/x86/mm/paging.c | 76 +++++++------- xen/include/asm-x86/domain.h | 17 +-- xen/include/asm-x86/hap.h | 2 +- 6 files changed, 164 insertions(+), 163 deletions(-) diff --git a/xen/arch/x86/mm/hap/guest_walk.c b/xen/arch/x86/mm/hap/guest_walk.c index 6b226fd9c2..77d9af2eeb 100644 --- a/xen/arch/x86/mm/hap/guest_walk.c +++ b/xen/arch/x86/mm/hap/guest_walk.c @@ -84,7 +84,7 @@ unsigned long hap_gva_to_gfn(GUEST_PAGING_LEVELS)( mfn = get_mfn_from_gpfn(gpfn); if ( mfn == INVALID_MFN ) { - HAP_PRINTK("bad pfn=0x%lx from gva=0x%lx at lev%d\n", gpfn, gva, + HAP_PRINTK("bad pfn=0x%lx from gva=0x%lx at lev%d\n", gpfn, gva, lev); success = 0; break; diff --git a/xen/arch/x86/mm/hap/hap.c b/xen/arch/x86/mm/hap/hap.c index 2bfb184227..cfb979ab21 100644 --- a/xen/arch/x86/mm/hap/hap.c +++ b/xen/arch/x86/mm/hap/hap.c @@ -73,7 +73,7 @@ int hap_disable_log_dirty(struct domain *d) hap_unlock(d); /* set l1e entries of P2M table with normal mode */ - p2m_set_flags_global(d, __PAGE_HYPERVISOR|_PAGE_USER); + p2m_set_flags_global(d, __PAGE_HYPERVISOR|_PAGE_USER); return 0; } @@ -111,7 +111,7 @@ static struct page_info *hap_alloc(struct domain *d) static void hap_free(struct domain *d, mfn_t mfn) { - struct page_info *pg = mfn_to_page(mfn); + struct page_info *pg = mfn_to_page(mfn); ASSERT(hap_locked_by_me(d)); @@ -128,7 +128,7 @@ static struct page_info *hap_alloc_p2m_page(struct domain *d) #if CONFIG_PAGING_LEVELS == 3 /* Under PAE mode, top-level P2M table should be allocated below 4GB space - * because the size of h_cr3 is only 32-bit. We use alloc_domheap_pages to + * because the size of h_cr3 is only 32-bit. We use alloc_domheap_pages to * force this requirement, and exchange the guaranteed 32-bit-clean * page for the one we just hap_alloc()ed. */ if ( d->arch.paging.hap.p2m_pages == 0 @@ -166,9 +166,9 @@ void hap_free_p2m_page(struct domain *d, struct page_info *pg) HAP_ERROR("Odd p2m page count c=%#x t=%"PRtype_info"\n", pg->count_info, pg->u.inuse.type_info); pg->count_info = 0; - /* Free should not decrement domain's total allocation, since + /* Free should not decrement domain's total allocation, since * these pages were allocated without an owner. */ - page_set_owner(pg, NULL); + page_set_owner(pg, NULL); free_domheap_page(pg); d->arch.paging.hap.p2m_pages--; ASSERT(d->arch.paging.hap.p2m_pages >= 0); @@ -221,7 +221,7 @@ hap_set_allocation(struct domain *d, unsigned int pages, int *preempted) pg->count_info = 0; free_domheap_page(pg); } - + /* Check to see if we need to yield and try again */ if ( preempted && hypercall_preempt_check() ) { @@ -275,7 +275,7 @@ static void hap_install_xen_entries_in_l2h(struct vcpu *v, mfn_t l2hmfn) l2e = hap_map_domain_page(l2hmfn); ASSERT(l2e != NULL); - + /* Copy the common Xen mappings from the idle domain */ memcpy(&l2e[L2_PAGETABLE_FIRST_XEN_SLOT & (L2_PAGETABLE_ENTRIES-1)], &idle_pg_table_l2[L2_PAGETABLE_FIRST_XEN_SLOT], @@ -318,7 +318,7 @@ static void hap_install_xen_entries_in_l2(struct vcpu *v, mfn_t l2mfn) l2e = hap_map_domain_page(l2mfn); ASSERT(l2e != NULL); - + /* Copy the common Xen mappings from the idle domain */ memcpy(&l2e[L2_PAGETABLE_FIRST_XEN_SLOT], &idle_pg_table[L2_PAGETABLE_FIRST_XEN_SLOT], @@ -362,7 +362,7 @@ static mfn_t hap_make_monitor_table(struct vcpu *v) } #elif CONFIG_PAGING_LEVELS == 3 { - mfn_t m3mfn, m2mfn; + mfn_t m3mfn, m2mfn; l3_pgentry_t *l3e; l2_pgentry_t *l2e; int i; @@ -384,8 +384,8 @@ static mfn_t hap_make_monitor_table(struct vcpu *v) l2e = hap_map_domain_page(m2mfn); for ( i = 0; i < L3_PAGETABLE_ENTRIES; i++ ) l2e[l2_table_offset(LINEAR_PT_VIRT_START) + i] = - (l3e_get_flags(l3e[i]) & _PAGE_PRESENT) - ? l2e_from_pfn(l3e_get_pfn(l3e[i]), __PAGE_HYPERVISOR) + (l3e_get_flags(l3e[i]) & _PAGE_PRESENT) + ? l2e_from_pfn(l3e_get_pfn(l3e[i]), __PAGE_HYPERVISOR) : l2e_empty(); hap_unmap_domain_page(l2e); hap_unmap_domain_page(l3e); @@ -536,7 +536,7 @@ void hap_teardown(struct domain *d) d->arch.paging.hap.p2m_pages); ASSERT(d->arch.paging.hap.total_pages == 0); } - + d->arch.paging.mode &= ~PG_log_dirty; hap_unlock(d); @@ -555,7 +555,7 @@ int hap_domctl(struct domain *d, xen_domctl_shadow_op_t *sc, hap_unlock(d); if ( preempted ) /* Not finished. Set up to re-run the call. */ - rc = hypercall_create_continuation(__HYPERVISOR_domctl, "h", + rc = hypercall_create_continuation(__HYPERVISOR_domctl, "h", u_domctl); else /* Finished. Return the new allocation */ @@ -578,11 +578,11 @@ void hap_vcpu_init(struct vcpu *v) /************************************************/ /* HAP PAGING MODE FUNCTIONS */ /************************************************/ -/* +/* * HAP guests can handle page faults (in the guest page tables) without * needing any action from Xen, so we should not be intercepting them. */ -static int hap_page_fault(struct vcpu *v, unsigned long va, +static int hap_page_fault(struct vcpu *v, unsigned long va, struct cpu_user_regs *regs) { HAP_ERROR("Intercepted a guest #PF (%u:%u) with HAP enabled.\n", @@ -591,9 +591,9 @@ static int hap_page_fault(struct vcpu *v, unsigned long va, return 0; } -/* +/* * HAP guests can handle invlpg without needing any action from Xen, so - * should not be intercepting it. + * should not be intercepting it. */ static int hap_invlpg(struct vcpu *v, unsigned long va) { @@ -649,7 +649,7 @@ static void hap_update_paging_modes(struct vcpu *v) } #if CONFIG_PAGING_LEVELS == 3 -static void p2m_install_entry_in_monitors(struct domain *d, l3_pgentry_t *l3e) +static void p2m_install_entry_in_monitors(struct domain *d, l3_pgentry_t *l3e) /* Special case, only used for PAE hosts: update the mapping of the p2m * table. This is trivial in other paging modes (one top-level entry * points to the top-level p2m, no maintenance needed), but PAE makes @@ -660,13 +660,13 @@ static void p2m_install_entry_in_monitors(struct domain *d, l3_pgentry_t *l3e) l2_pgentry_t *ml2e; struct vcpu *v; unsigned int index; - + index = ((unsigned long)l3e & ~PAGE_MASK) / sizeof(l3_pgentry_t); ASSERT(index < MACHPHYS_MBYTES>>1); - + for_each_vcpu ( d, v ) { - if ( pagetable_get_pfn(v->arch.monitor_table) == 0 ) + if ( pagetable_get_pfn(v->arch.monitor_table) == 0 ) continue; ASSERT(paging_mode_external(v->domain)); @@ -689,7 +689,7 @@ static void p2m_install_entry_in_monitors(struct domain *d, l3_pgentry_t *l3e) } #endif -static void +static void hap_write_p2m_entry(struct vcpu *v, unsigned long gfn, l1_pgentry_t *p, mfn_t table_mfn, l1_pgentry_t new, unsigned int level) { @@ -698,12 +698,12 @@ hap_write_p2m_entry(struct vcpu *v, unsigned long gfn, l1_pgentry_t *p, safe_write_pte(p, new); #if CONFIG_PAGING_LEVELS == 3 /* install P2M in monitor table for PAE Xen */ - if ( level == 3 ) + if ( level == 3 ) /* We have written to the p2m l3: need to sync the per-vcpu * copies of it in the monitor tables */ p2m_install_entry_in_monitors(v->domain, (l3_pgentry_t *)p); #endif - + hap_unlock(v->domain); } @@ -715,7 +715,7 @@ static unsigned long hap_gva_to_gfn_real_mode( /* Entry points into this mode of the hap code. */ struct paging_mode hap_paging_real_mode = { - .page_fault = hap_page_fault, + .page_fault = hap_page_fault, .invlpg = hap_invlpg, .gva_to_gfn = hap_gva_to_gfn_real_mode, .update_cr3 = hap_update_cr3, @@ -725,7 +725,7 @@ struct paging_mode hap_paging_real_mode = { }; struct paging_mode hap_paging_protected_mode = { - .page_fault = hap_page_fault, + .page_fault = hap_page_fault, .invlpg = hap_invlpg, .gva_to_gfn = hap_gva_to_gfn_2level, .update_cr3 = hap_update_cr3, @@ -735,7 +735,7 @@ struct paging_mode hap_paging_protected_mode = { }; struct paging_mode hap_paging_pae_mode = { - .page_fault = hap_page_fault, + .page_fault = hap_page_fault, .invlpg = hap_invlpg, .gva_to_gfn = hap_gva_to_gfn_3level, .update_cr3 = hap_update_cr3, @@ -745,7 +745,7 @@ struct paging_mode hap_paging_pae_mode = { }; struct paging_mode hap_paging_long_mode = { - .page_fault = hap_page_fault, + .page_fault = hap_page_fault, .invlpg = hap_invlpg, .gva_to_gfn = hap_gva_to_gfn_4level, .update_cr3 = hap_update_cr3, diff --git a/xen/arch/x86/mm/p2m.c b/xen/arch/x86/mm/p2m.c index 9efb571cb3..721d148fcc 100644 --- a/xen/arch/x86/mm/p2m.c +++ b/xen/arch/x86/mm/p2m.c @@ -2,12 +2,12 @@ * arch/x86/mm/p2m.c * * physical-to-machine mappings for automatically-translated domains. - * + * * Parts of this code are Copyright (c) 2007 by Advanced Micro Devices. * Parts of this code are Copyright (c) 2006 by XenSource Inc. * Parts of this code are Copyright (c) 2006 by Michael A Fetterman * Parts based on earlier work by Michael A Fetterman, Ian Pratt et al. - * + * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or @@ -34,7 +34,7 @@ /* * The P2M lock. This protects all updates to the p2m table. - * Updates are expected to be safe against concurrent reads, + * Updates are expected to be safe against concurrent reads, * which do *not* require the lock. * * Locking discipline: always acquire this lock before the shadow or HAP one @@ -80,7 +80,7 @@ #define P2M_DEBUG(_f, _a...) \ debugtrace_printk("p2mdebug: %s(): " _f, __func__, ##_a) #else -#define P2M_DEBUG(_f, _a...) do { (void)(_f); } while(0) +#define P2M_DEBUG(_f, _a...) do { (void)(_f); } while(0) #endif @@ -119,8 +119,8 @@ p2m_find_entry(void *table, unsigned long *gfn_remainder, // Returns 0 on error. // static int -p2m_next_level(struct domain *d, mfn_t *table_mfn, void **table, - unsigned long *gfn_remainder, unsigned long gfn, u32 shift, +p2m_next_level(struct domain *d, mfn_t *table_mfn, void **table, + unsigned long *gfn_remainder, unsigned long gfn, u32 shift, u32 max, unsigned long type) { l1_pgentry_t *p2m_entry; @@ -146,7 +146,7 @@ p2m_next_level(struct domain *d, mfn_t *table_mfn, void **table, switch ( type ) { case PGT_l3_page_table: - paging_write_p2m_entry(d, gfn, + paging_write_p2m_entry(d, gfn, p2m_entry, *table_mfn, new_entry, 4); break; case PGT_l2_page_table: @@ -154,11 +154,11 @@ p2m_next_level(struct domain *d, mfn_t *table_mfn, void **table, /* for PAE mode, PDPE only has PCD/PWT/P bits available */ new_entry = l1e_from_pfn(mfn_x(page_to_mfn(pg)), _PAGE_PRESENT); #endif - paging_write_p2m_entry(d, gfn, + paging_write_p2m_entry(d, gfn, p2m_entry, *table_mfn, new_entry, 3); break; case PGT_l1_page_table: - paging_write_p2m_entry(d, gfn, + paging_write_p2m_entry(d, gfn, p2m_entry, *table_mfn, new_entry, 2); break; default: @@ -216,7 +216,7 @@ set_p2m_entry(struct domain *d, unsigned long gfn, mfn_t mfn, u32 l1e_flags) ASSERT(p2m_entry); /* Track the highest gfn for which we have ever had a valid mapping */ - if ( mfn_valid(mfn) && (gfn > d->arch.p2m.max_mapped_pfn) ) + if ( mfn_valid(mfn) && (gfn > d->arch.p2m.max_mapped_pfn) ) d->arch.p2m.max_mapped_pfn = gfn; if ( mfn_valid(mfn) ) @@ -229,7 +229,7 @@ set_p2m_entry(struct domain *d, unsigned long gfn, mfn_t mfn, u32 l1e_flags) /* Success */ rv = 1; - + out: unmap_domain_page(table); return rv; @@ -250,7 +250,7 @@ void p2m_init(struct domain *d) // controlled by CONFIG_PAGING_LEVELS). // // The alloc_page and free_page functions will be used to get memory to -// build the p2m, and to release it again at the end of day. +// build the p2m, and to release it again at the end of day. // // Returns 0 for success or -errno. // @@ -264,7 +264,7 @@ int p2m_alloc_table(struct domain *d, struct page_info *page, *p2m_top; unsigned int page_count = 0; unsigned long gfn; - + p2m_lock(d); if ( pagetable_get_pfn(d->arch.phys_table) != 0 ) @@ -288,7 +288,7 @@ int p2m_alloc_table(struct domain *d, list_add_tail(&p2m_top->list, &d->arch.p2m.pages); p2m_top->count_info = 1; - p2m_top->u.inuse.type_info = + p2m_top->u.inuse.type_info = #if CONFIG_PAGING_LEVELS == 4 PGT_l4_page_table #elif CONFIG_PAGING_LEVELS == 3 @@ -301,7 +301,7 @@ int p2m_alloc_table(struct domain *d, d->arch.phys_table = pagetable_from_mfn(page_to_mfn(p2m_top)); P2M_PRINTK("populating p2m table\n"); - + /* Initialise physmap tables for slot zero. Other code assumes this. */ gfn = 0; mfn = _mfn(INVALID_MFN); @@ -365,17 +365,17 @@ gfn_to_mfn_foreign(struct domain *d, unsigned long gpfn) paddr_t addr = ((paddr_t)gpfn) << PAGE_SHIFT; l2_pgentry_t *l2e; l1_pgentry_t *l1e; - + ASSERT(paging_mode_translate(d)); mfn = pagetable_get_mfn(d->arch.phys_table); - if ( gpfn > d->arch.p2m.max_mapped_pfn ) + if ( gpfn > d->arch.p2m.max_mapped_pfn ) /* This pfn is higher than the highest the p2m map currently holds */ return _mfn(INVALID_MFN); #if CONFIG_PAGING_LEVELS >= 4 - { + { l4_pgentry_t *l4e = map_domain_page(mfn_x(mfn)); l4e += l4_table_offset(addr); if ( (l4e_get_flags(*l4e) & _PAGE_PRESENT) == 0 ) @@ -398,7 +398,7 @@ gfn_to_mfn_foreign(struct domain *d, unsigned long gpfn) * the bounds of the p2m. */ l3e += (addr >> L3_PAGETABLE_SHIFT); #else - l3e += l3_table_offset(addr); + l3e += l3_table_offset(addr); #endif if ( (l3e_get_flags(*l3e) & _PAGE_PRESENT) == 0 ) { @@ -443,18 +443,18 @@ static void audit_p2m(struct domain *d) mfn_t p2mfn; unsigned long orphans_d = 0, orphans_i = 0, mpbad = 0, pmbad = 0; int test_linear; - + if ( !paging_mode_translate(d) ) return; //P2M_PRINTK("p2m audit starts\n"); - test_linear = ( (d == current->domain) + test_linear = ( (d == current->domain) && !pagetable_is_null(current->arch.monitor_table) ); if ( test_linear ) - local_flush_tlb(); + local_flush_tlb(); - /* Audit part one: walk the domain's page allocation list, checking + /* Audit part one: walk the domain's page allocation list, checking * the m2p entries. */ for ( entry = d->page_list.next; entry != &d->page_list; @@ -463,11 +463,11 @@ static void audit_p2m(struct domain *d) page = list_entry(entry, struct page_info, list); mfn = mfn_x(page_to_mfn(page)); - // P2M_PRINTK("auditing guest page, mfn=%#lx\n", mfn); + // P2M_PRINTK("auditing guest page, mfn=%#lx\n", mfn); od = page_get_owner(page); - if ( od != d ) + if ( od != d ) { P2M_PRINTK("wrong owner %#lx -> %p(%u) != %p(%u)\n", mfn, od, (od?od->domain_id:-1), d, d->domain_id); @@ -475,19 +475,19 @@ static void audit_p2m(struct domain *d) } gfn = get_gpfn_from_mfn(mfn); - if ( gfn == INVALID_M2P_ENTRY ) + if ( gfn == INVALID_M2P_ENTRY ) { orphans_i++; //P2M_PRINTK("orphaned guest page: mfn=%#lx has invalid gfn\n", - // mfn); + // mfn); continue; } - if ( gfn == 0x55555555 ) + if ( gfn == 0x55555555 ) { orphans_d++; - //P2M_PRINTK("orphaned guest page: mfn=%#lx has debug gfn\n", - // mfn); + //P2M_PRINTK("orphaned guest page: mfn=%#lx has debug gfn\n", + // mfn); continue; } @@ -503,7 +503,7 @@ static void audit_p2m(struct domain *d) : -1u)); /* This m2p entry is stale: the domain has another frame in * this physical slot. No great disaster, but for neatness, - * blow away the m2p entry. */ + * blow away the m2p entry. */ set_gpfn_from_mfn(mfn, INVALID_M2P_ENTRY, __PAGE_HYPERVISOR|_PAGE_USER); } @@ -517,9 +517,9 @@ static void audit_p2m(struct domain *d) } } - // P2M_PRINTK("OK: mfn=%#lx, gfn=%#lx, p2mfn=%#lx, lp2mfn=%#lx\n", - // mfn, gfn, p2mfn, lp2mfn); - } + // P2M_PRINTK("OK: mfn=%#lx, gfn=%#lx, p2mfn=%#lx, lp2mfn=%#lx\n", + // mfn, gfn, p2mfn, lp2mfn); + } /* Audit part two: walk the domain's p2m table, checking the entries. */ if ( pagetable_get_pfn(d->arch.phys_table) != 0 ) @@ -527,7 +527,7 @@ static void audit_p2m(struct domain *d) l2_pgentry_t *l2e; l1_pgentry_t *l1e; int i1, i2; - + #if CONFIG_PAGING_LEVELS == 4 l4_pgentry_t *l4e; l3_pgentry_t *l3e; @@ -553,8 +553,8 @@ static void audit_p2m(struct domain *d) } l3e = map_domain_page(mfn_x(_mfn(l4e_get_pfn(l4e[i4])))); #endif /* now at levels 3 or 4... */ - for ( i3 = 0; - i3 < ((CONFIG_PAGING_LEVELS==4) ? L3_PAGETABLE_ENTRIES : 8); + for ( i3 = 0; + i3 < ((CONFIG_PAGING_LEVELS==4) ? L3_PAGETABLE_ENTRIES : 8); i3++ ) { if ( !(l3e_get_flags(l3e[i3]) & _PAGE_PRESENT) ) @@ -572,7 +572,7 @@ static void audit_p2m(struct domain *d) continue; } l1e = map_domain_page(mfn_x(_mfn(l2e_get_pfn(l2e[i2])))); - + for ( i1 = 0; i1 < L1_PAGETABLE_ENTRIES; i1++, gfn++ ) { if ( !(l1e_get_flags(l1e[i1]) & _PAGE_PRESENT) ) @@ -610,14 +610,14 @@ static void audit_p2m(struct domain *d) } //P2M_PRINTK("p2m audit complete\n"); - //if ( orphans_i | orphans_d | mpbad | pmbad ) + //if ( orphans_i | orphans_d | mpbad | pmbad ) // P2M_PRINTK("p2m audit found %lu orphans (%lu inval %lu debug)\n", // orphans_i + orphans_d, orphans_i, orphans_d, - if ( mpbad | pmbad ) + if ( mpbad | pmbad ) P2M_PRINTK("p2m audit found %lu odd p2m, %lu bad m2p entries\n", pmbad, mpbad); } -#else +#else #define audit_p2m(_d) do { (void)(_d); } while(0) #endif /* P2M_AUDIT */ @@ -645,7 +645,7 @@ guest_physmap_remove_page(struct domain *d, unsigned long gfn, audit_p2m(d); p2m_remove_page(d, gfn, mfn); audit_p2m(d); - p2m_unlock(d); + p2m_unlock(d); } void @@ -683,11 +683,11 @@ guest_physmap_add_page(struct domain *d, unsigned long gfn, /* This machine frame is already mapped at another physical address */ P2M_DEBUG("aliased! mfn=%#lx, old gfn=%#lx, new gfn=%#lx\n", mfn, ogfn, gfn); - if ( mfn_valid(omfn = gfn_to_mfn(d, ogfn)) ) + if ( mfn_valid(omfn = gfn_to_mfn(d, ogfn)) ) { - P2M_DEBUG("old gfn=%#lx -> mfn %#lx\n", + P2M_DEBUG("old gfn=%#lx -> mfn %#lx\n", ogfn , mfn_x(omfn)); - if ( mfn_x(omfn) == mfn ) + if ( mfn_x(omfn) == mfn ) p2m_remove_page(d, ogfn, mfn); } } @@ -720,15 +720,15 @@ void p2m_set_flags_global(struct domain *d, u32 l1e_flags) int i4; #endif /* CONFIG_PAGING_LEVELS == 4 */ #endif /* CONFIG_PAGING_LEVELS >= 3 */ - + if ( !paging_mode_translate(d) ) return; - + if ( pagetable_get_pfn(d->arch.phys_table) == 0 ) return; p2m_lock(d); - + #if CONFIG_PAGING_LEVELS == 4 l4e = map_domain_page(mfn_x(pagetable_get_mfn(d->arch.phys_table))); #elif CONFIG_PAGING_LEVELS == 3 @@ -739,52 +739,52 @@ void p2m_set_flags_global(struct domain *d, u32 l1e_flags) #if CONFIG_PAGING_LEVELS >= 3 #if CONFIG_PAGING_LEVELS >= 4 - for ( i4 = 0; i4 < L4_PAGETABLE_ENTRIES; i4++ ) + for ( i4 = 0; i4 < L4_PAGETABLE_ENTRIES; i4++ ) { - if ( !(l4e_get_flags(l4e[i4]) & _PAGE_PRESENT) ) - { - continue; - } - l3e = map_domain_page(l4e_get_pfn(l4e[i4])); + if ( !(l4e_get_flags(l4e[i4]) & _PAGE_PRESENT) ) + { + continue; + } + l3e = map_domain_page(l4e_get_pfn(l4e[i4])); #endif /* now at levels 3 or 4... */ - for ( i3 = 0; - i3 < ((CONFIG_PAGING_LEVELS==4) ? L3_PAGETABLE_ENTRIES : 8); - i3++ ) - { - if ( !(l3e_get_flags(l3e[i3]) & _PAGE_PRESENT) ) - { - continue; - } - l2e = map_domain_page(l3e_get_pfn(l3e[i3])); + for ( i3 = 0; + i3 < ((CONFIG_PAGING_LEVELS==4) ? L3_PAGETABLE_ENTRIES : 8); + i3++ ) + { + if ( !(l3e_get_flags(l3e[i3]) & _PAGE_PRESENT) ) + { + continue; + } + l2e = map_domain_page(l3e_get_pfn(l3e[i3])); #endif /* all levels... */ - for ( i2 = 0; i2 < L2_PAGETABLE_ENTRIES; i2++ ) - { - if ( !(l2e_get_flags(l2e[i2]) & _PAGE_PRESENT) ) - { - continue; - } + for ( i2 = 0; i2 < L2_PAGETABLE_ENTRIES; i2++ ) + { + if ( !(l2e_get_flags(l2e[i2]) & _PAGE_PRESENT) ) + { + continue; + } l1mfn = _mfn(l2e_get_pfn(l2e[i2])); - l1e = map_domain_page(mfn_x(l1mfn)); - - for ( i1 = 0; i1 < L1_PAGETABLE_ENTRIES; i1++, gfn++ ) - { - if ( !(l1e_get_flags(l1e[i1]) & _PAGE_PRESENT) ) - continue; - mfn = l1e_get_pfn(l1e[i1]); - gfn = get_gpfn_from_mfn(mfn); - /* create a new 1le entry using l1e_flags */ - l1e_content = l1e_from_pfn(mfn, l1e_flags); - paging_write_p2m_entry(d, gfn, &l1e[i1], + l1e = map_domain_page(mfn_x(l1mfn)); + + for ( i1 = 0; i1 < L1_PAGETABLE_ENTRIES; i1++, gfn++ ) + { + if ( !(l1e_get_flags(l1e[i1]) & _PAGE_PRESENT) ) + continue; + mfn = l1e_get_pfn(l1e[i1]); + gfn = get_gpfn_from_mfn(mfn); + /* create a new 1le entry using l1e_flags */ + l1e_content = l1e_from_pfn(mfn, l1e_flags); + paging_write_p2m_entry(d, gfn, &l1e[i1], l1mfn, l1e_content, 1); - } - unmap_domain_page(l1e); - } + } + unmap_domain_page(l1e); + } #if CONFIG_PAGING_LEVELS >= 3 - unmap_domain_page(l2e); - } + unmap_domain_page(l2e); + } #if CONFIG_PAGING_LEVELS >= 4 - unmap_domain_page(l3e); + unmap_domain_page(l3e); } #endif #endif @@ -814,7 +814,7 @@ int p2m_set_flags(struct domain *d, paddr_t gpa, u32 l1e_flags) mfn = gfn_to_mfn(d, gfn); if ( mfn_valid(mfn) ) set_p2m_entry(d, gfn, mfn, l1e_flags); - + p2m_unlock(d); return 1; diff --git a/xen/arch/x86/mm/paging.c b/xen/arch/x86/mm/paging.c index 4cf1c06bbc..a78f40921a 100644 --- a/xen/arch/x86/mm/paging.c +++ b/xen/arch/x86/mm/paging.c @@ -54,10 +54,10 @@ boolean_param("hap", opt_hap_enabled); #define page_to_mfn(_pg) (_mfn((_pg) - frame_table)) /* The log-dirty lock. This protects the log-dirty bitmap from - * concurrent accesses (and teardowns, etc). - * + * concurrent accesses (and teardowns, etc). + * * Locking discipline: always acquire shadow or HAP lock before this one. - * + * * Because mark_dirty is called from a lot of places, the log-dirty lock * may be acquired with the shadow or HAP locks already held. When the * log-dirty code makes callbacks into HAP or shadow code to reset @@ -105,7 +105,7 @@ int paging_alloc_log_dirty_bitmap(struct domain *d) d->arch.paging.log_dirty.bitmap_size = (domain_get_maximum_gpfn(d) + BITS_PER_LONG) & ~(BITS_PER_LONG - 1); - d->arch.paging.log_dirty.bitmap = + d->arch.paging.log_dirty.bitmap = xmalloc_array(unsigned long, d->arch.paging.log_dirty.bitmap_size / BITS_PER_LONG); if ( d->arch.paging.log_dirty.bitmap == NULL ) @@ -152,8 +152,8 @@ int paging_log_dirty_enable(struct domain *d) log_dirty_unlock(d); - /* Safe because the domain is paused. */ - ret = d->arch.paging.log_dirty.enable_log_dirty(d); + /* Safe because the domain is paused. */ + ret = d->arch.paging.log_dirty.enable_log_dirty(d); /* Possibility of leaving the bitmap allocated here but it'll be * tidied on domain teardown. */ @@ -202,7 +202,7 @@ void paging_mark_dirty(struct domain *d, unsigned long guest_mfn) pfn = get_gpfn_from_mfn(mfn_x(gmfn)); /* - * Values with the MSB set denote MFNs that aren't really part of the + * Values with the MSB set denote MFNs that aren't really part of the * domain's pseudo-physical memory map (e.g., the shared info frame). * Nothing to do here... */ @@ -212,11 +212,11 @@ void paging_mark_dirty(struct domain *d, unsigned long guest_mfn) return; } - if ( likely(pfn < d->arch.paging.log_dirty.bitmap_size) ) - { + if ( likely(pfn < d->arch.paging.log_dirty.bitmap_size) ) + { if ( !__test_and_set_bit(pfn, d->arch.paging.log_dirty.bitmap) ) { - PAGING_DEBUG(LOGDIRTY, + PAGING_DEBUG(LOGDIRTY, "marked mfn %" PRI_mfn " (pfn=%lx), dom %d\n", mfn_x(gmfn), pfn, d->domain_id); d->arch.paging.log_dirty.dirty_count++; @@ -227,21 +227,21 @@ void paging_mark_dirty(struct domain *d, unsigned long guest_mfn) PAGING_PRINTK("mark_dirty OOR! " "mfn=%" PRI_mfn " pfn=%lx max=%x (dom %d)\n" "owner=%d c=%08x t=%" PRtype_info "\n", - mfn_x(gmfn), - pfn, + mfn_x(gmfn), + pfn, d->arch.paging.log_dirty.bitmap_size, d->domain_id, (page_get_owner(mfn_to_page(gmfn)) ? page_get_owner(mfn_to_page(gmfn))->domain_id : -1), - mfn_to_page(gmfn)->count_info, + mfn_to_page(gmfn)->count_info, mfn_to_page(gmfn)->u.inuse.type_info); } - + log_dirty_unlock(d); } -/* Read a domain's log-dirty bitmap and stats. If the operation is a CLEAN, +/* Read a domain's log-dirty bitmap and stats. If the operation is a CLEAN, * clear the bitmap and stats as well. */ int paging_log_dirty_op(struct domain *d, struct xen_domctl_shadow_op *sc) { @@ -252,15 +252,15 @@ int paging_log_dirty_op(struct domain *d, struct xen_domctl_shadow_op *sc) clean = (sc->op == XEN_DOMCTL_SHADOW_OP_CLEAN); - PAGING_DEBUG(LOGDIRTY, "log-dirty %s: dom %u faults=%u dirty=%u\n", + PAGING_DEBUG(LOGDIRTY, "log-dirty %s: dom %u faults=%u dirty=%u\n", (clean) ? "clean" : "peek", d->domain_id, - d->arch.paging.log_dirty.fault_count, + d->arch.paging.log_dirty.fault_count, d->arch.paging.log_dirty.dirty_count); sc->stats.fault_count = d->arch.paging.log_dirty.fault_count; sc->stats.dirty_count = d->arch.paging.log_dirty.dirty_count; - + if ( clean ) { d->arch.paging.log_dirty.fault_count = 0; @@ -276,7 +276,7 @@ int paging_log_dirty_op(struct domain *d, struct xen_domctl_shadow_op *sc) rv = -EINVAL; /* perhaps should be ENOMEM? */ goto out; } - + if ( sc->pages > d->arch.paging.log_dirty.bitmap_size ) sc->pages = d->arch.paging.log_dirty.bitmap_size; @@ -322,11 +322,11 @@ int paging_log_dirty_op(struct domain *d, struct xen_domctl_shadow_op *sc) /* Note that this function takes three function pointers. Callers must supply - * these functions for log dirty code to call. This function usually is - * invoked when paging is enabled. Check shadow_enable() and hap_enable() for + * these functions for log dirty code to call. This function usually is + * invoked when paging is enabled. Check shadow_enable() and hap_enable() for * reference. * - * These function pointers must not be followed with the log-dirty lock held. + * These function pointers must not be followed with the log-dirty lock held. */ void paging_log_dirty_init(struct domain *d, int (*enable_log_dirty)(struct domain *d), @@ -335,7 +335,7 @@ void paging_log_dirty_init(struct domain *d, { /* We initialize log dirty lock first */ log_dirty_lock_init(d); - + d->arch.paging.log_dirty.enable_log_dirty = enable_log_dirty; d->arch.paging.log_dirty.disable_log_dirty = disable_log_dirty; d->arch.paging.log_dirty.clean_dirty_bitmap = clean_dirty_bitmap; @@ -387,7 +387,7 @@ int paging_domctl(struct domain *d, xen_domctl_shadow_op_t *sc, d->domain_id); return -EINVAL; } - + if ( unlikely(d->is_dying) ) { gdprintk(XENLOG_INFO, "Ignoring paging op on dying domain %u\n", @@ -401,38 +401,38 @@ int paging_domctl(struct domain *d, xen_domctl_shadow_op_t *sc, d->domain_id); return -EINVAL; } - + /* Code to handle log-dirty. Note that some log dirty operations - * piggy-back on shadow operations. For example, when + * piggy-back on shadow operations. For example, when * XEN_DOMCTL_SHADOW_OP_OFF is called, it first checks whether log dirty - * mode is enabled. If does, we disables log dirty and continues with - * shadow code. For this reason, we need to further dispatch domctl + * mode is enabled. If does, we disables log dirty and continues with + * shadow code. For this reason, we need to further dispatch domctl * to next-level paging code (shadow or hap). */ switch ( sc->op ) { case XEN_DOMCTL_SHADOW_OP_ENABLE_LOGDIRTY: - return paging_log_dirty_enable(d); - - case XEN_DOMCTL_SHADOW_OP_ENABLE: + return paging_log_dirty_enable(d); + + case XEN_DOMCTL_SHADOW_OP_ENABLE: if ( sc->mode & XEN_DOMCTL_SHADOW_ENABLE_LOG_DIRTY ) return paging_log_dirty_enable(d); case XEN_DOMCTL_SHADOW_OP_OFF: if ( paging_mode_log_dirty(d) ) - if ( (rc = paging_log_dirty_disable(d)) != 0 ) + if ( (rc = paging_log_dirty_disable(d)) != 0 ) return rc; case XEN_DOMCTL_SHADOW_OP_CLEAN: case XEN_DOMCTL_SHADOW_OP_PEEK: - return paging_log_dirty_op(d, sc); + return paging_log_dirty_op(d, sc); } - + /* Here, dispatch domctl to the appropriate paging code */ if ( opt_hap_enabled && is_hvm_domain(d) ) - return hap_domctl(d, sc, u_domctl); + return hap_domctl(d, sc, u_domctl); else - return shadow_domctl(d, sc, u_domctl); + return shadow_domctl(d, sc, u_domctl); } /* Call when destroying a domain */ @@ -492,7 +492,7 @@ void paging_dump_vcpu_info(struct vcpu *v) { if ( paging_mode_enabled(v->domain) ) { - printk(" paging assistance: "); + printk(" paging assistance: "); if ( paging_mode_shadow(v->domain) ) { if ( v->arch.paging.mode ) @@ -504,7 +504,7 @@ void paging_dump_vcpu_info(struct vcpu *v) printk("not shadowed\n"); } else if ( paging_mode_hap(v->domain) && v->arch.paging.mode ) - printk("hap, %u levels\n", + printk("hap, %u levels\n", v->arch.paging.mode->guest_levels); else printk("none\n"); diff --git a/xen/include/asm-x86/domain.h b/xen/include/asm-x86/domain.h index 22de4c60e9..f8d311a91d 100644 --- a/xen/include/asm-x86/domain.h +++ b/xen/include/asm-x86/domain.h @@ -77,10 +77,10 @@ struct shadow_domain { int locker; /* processor which holds the lock */ const char *locker_function; /* Func that took it */ unsigned int opt_flags; /* runtime tunable optimizations on/off */ - struct list_head pinned_shadows; + struct list_head pinned_shadows; /* Memory allocation */ - struct list_head freelists[SHADOW_MAX_ORDER + 1]; + struct list_head freelists[SHADOW_MAX_ORDER + 1]; struct list_head p2m_freelist; unsigned int total_pages; /* number of pages allocated */ unsigned int free_pages; /* number of pages on freelists */ @@ -116,7 +116,7 @@ struct hap_domain { spinlock_t lock; int locker; const char *locker_function; - + struct list_head freelist; unsigned int total_pages; /* number of pages allocated */ unsigned int free_pages; /* number of pages on freelists */ @@ -131,13 +131,13 @@ struct p2m_domain { spinlock_t lock; int locker; /* processor which holds the lock */ const char *locker_function; /* Func that took it */ - + /* Pages used to construct the p2m */ struct list_head pages; /* Functions to call to get or free pages for the p2m */ struct page_info * (*alloc_page )(struct domain *d); - void (*free_page )(struct domain *d, + void (*free_page )(struct domain *d, struct page_info *pg); /* Highest guest frame that's ever been mapped in the p2m */ @@ -177,6 +177,7 @@ struct paging_domain { /* log dirty support */ struct log_dirty_domain log_dirty; }; + struct paging_vcpu { /* Pointers to mode-specific entry points. */ struct paging_mode *mode; @@ -184,9 +185,9 @@ struct paging_vcpu { unsigned int translate_enabled:1; /* HVM guest: last emulate was to a pagetable */ unsigned int last_write_was_pt:1; - /* Translated guest: virtual TLB */ + /* Translated guest: virtual TLB */ struct shadow_vtlb *vtlb; - spinlock_t vtlb_lock; + spinlock_t vtlb_lock; /* paging support extension */ struct shadow_vcpu shadow; @@ -303,7 +304,7 @@ struct arch_vcpu * shadow refcounts are in use */ pagetable_t shadow_table[4]; /* (MFN) shadow(s) of guest */ pagetable_t monitor_table; /* (MFN) hypervisor PT (for HVM) */ - unsigned long cr3; /* (MA) value to install in HW CR3 */ + unsigned long cr3; /* (MA) value to install in HW CR3 */ /* Current LDT details. */ unsigned long shadow_ldt_mapcnt; diff --git a/xen/include/asm-x86/hap.h b/xen/include/asm-x86/hap.h index afc6e08143..60a2ad4ed0 100644 --- a/xen/include/asm-x86/hap.h +++ b/xen/include/asm-x86/hap.h @@ -3,7 +3,7 @@ * * hardware-assisted paging * Copyright (c) 2007 Advanced Micro Devices (Wei Huang) - * + * * Parts of this code are Copyright (c) 2006 by XenSource Inc. * Parts of this code are Copyright (c) 2006 by Michael A Fetterman * Parts based on earlier work by Michael A Fetterman, Ian Pratt et al.