From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1JvDLc-0001Fa-2f for qemu-devel@nongnu.org; Sun, 11 May 2008 11:20:24 -0400 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1JvDLb-0001FG-4V for qemu-devel@nongnu.org; Sun, 11 May 2008 11:20:23 -0400 Received: from [199.232.76.173] (port=34900 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1JvDLa-0001FD-UL for qemu-devel@nongnu.org; Sun, 11 May 2008 11:20:23 -0400 Received: from ug-out-1314.google.com ([66.249.92.173]:32853) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1JvDLZ-0002yV-QD for qemu-devel@nongnu.org; Sun, 11 May 2008 11:20:22 -0400 Received: by ug-out-1314.google.com with SMTP id j40so562491ugd.4 for ; Sun, 11 May 2008 08:20:16 -0700 (PDT) Message-ID: Date: Sun, 11 May 2008 17:20:16 +0200 From: "andrzej zaborowski" In-Reply-To: MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----=_Part_1035_14516935.1210519216292" References: Subject: [Qemu-devel] Re: IO_MEM_NB_ENTRIES limit Reply-To: qemu-devel@nongnu.org List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Qemu mailing list ------=_Part_1035_14516935.1210519216292 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit Content-Disposition: inline On 15/04/2008, andrzej zaborowski wrote: > the maximum number of memory-mapped IO regions in qemu is > IO_MEM_NB_ENTRIES which is defined using TARGET_PAGE_BITS. Due to > tiny pages available on ARM, IO_MEM_NB_ENTRIES is only 64 there. > OMAP2 cpu has many more logical IO regions than 64 and it makes sense > to register them as separate. > > To be able to set IO_MEM_NB_ENTRIES higher, the io region index and > the address bits would have to be stored in separate fields in > PhysPageDesc and in CPUTLBEntry structs, instead of io index being > stored in the lower bits of addresses. This would double the size of > both structs. I'd like to hear if there are any other ideas for > removing the upper limit for IO_MEM_NB_ENTRIES. Here's a less hacky patch to store the IO region number in a separate field from the page start address, in PhysPageDesc and CPUTLBEntry, thus simplifying a couple of things. It's intrusive but will ease any further extension and I'd like to commit it some time if there are no better ideas. It works in my tests but there may be corner cases that I broke. The maximum number of IO_MEM_ROMD regions is still dependent on page size because the API to register these uses the same value to store the address and the io_index, so removing this would require api change that affects hw/. diff --git a/cpu-all.h b/cpu-all.h index 387030e..10258c3 100644 --- a/cpu-all.h +++ b/cpu-all.h @@ -829,8 +829,9 @@ extern ram_addr_t ram_size; /* physical memory access */ #define TLB_INVALID_MASK (1 << 3) +#define TLB_IO_MASK (1 << 4) #define IO_MEM_SHIFT 4 -#define IO_MEM_NB_ENTRIES (1 << (TARGET_PAGE_BITS - IO_MEM_SHIFT)) +#define IO_MEM_NB_ENTRIES 1024 #define IO_MEM_RAM (0 << IO_MEM_SHIFT) /* hardcoded offset */ #define IO_MEM_ROM (1 << IO_MEM_SHIFT) /* hardcoded offset */ @@ -840,8 +841,8 @@ extern ram_addr_t ram_size; exception, the write memory callback gets the ram offset instead of the physical address */ #define IO_MEM_ROMD (1) -#define IO_MEM_SUBPAGE (2) -#define IO_MEM_SUBWIDTH (4) +#define IO_MEM_SUBPAGE (2) /* used internally */ +#define IO_MEM_SUBWIDTH (4) /* used internally */ typedef void CPUWriteMemoryFunc(void *opaque, target_phys_addr_t addr, uint32_t value); typedef uint32_t CPUReadMemoryFunc(void *opaque, target_phys_addr_t addr); diff --git a/cpu-defs.h b/cpu-defs.h index c4389ed..5f3def8 100644 --- a/cpu-defs.h +++ b/cpu-defs.h @@ -99,16 +99,16 @@ typedef uint64_t target_phys_addr_t; #define CPU_TLB_BITS 8 #define CPU_TLB_SIZE (1 << CPU_TLB_BITS) -#if TARGET_PHYS_ADDR_BITS == 32 && TARGET_LONG_BITS == 32 -#define CPU_TLB_ENTRY_BITS 4 -#else +#if TARGET_LONG_BITS == 32 #define CPU_TLB_ENTRY_BITS 5 +#else +#define CPU_TLB_ENTRY_BITS 6 #endif typedef struct CPUTLBEntry { /* bit 31 to TARGET_PAGE_BITS : virtual address - bit TARGET_PAGE_BITS-1..IO_MEM_SHIFT : if non zero, memory io - zone number + bit TARGET_PAGE_BITS-1..IO_MEM_SHIFT+1 : zero + bit IO_MEM_SHIFT : indicates an io region bit 3 : indicates that the entry is invalid bit 2..0 : zero */ @@ -122,11 +122,14 @@ typedef struct CPUTLBEntry { #else target_phys_addr_t addend; #endif + /* if non-zero, memory io zone number */ + int io_index; /* padding to get a power of two size */ uint8_t dummy[(1 << CPU_TLB_ENTRY_BITS) - (sizeof(target_ulong) * 3 + ((-sizeof(target_ulong) * 3) & (sizeof(target_phys_addr_t) - 1)) + - sizeof(target_phys_addr_t))]; + sizeof(target_phys_addr_t) + + sizeof(int))]; } CPUTLBEntry; #define CPU_TEMP_BUF_NLONGS 128 diff --git a/exec.c b/exec.c index 2fd0078..935c4ba 100644 --- a/exec.c +++ b/exec.c @@ -117,8 +117,10 @@ typedef struct PageDesc { } PageDesc; typedef struct PhysPageDesc { - /* offset in host memory of the page + io_index in the low 12 bits */ + /* offset in host memory of the page */ ram_addr_t phys_offset; + /* memory io region id */ + int io_index; } PhysPageDesc; #define L2_BITS 10 @@ -310,8 +312,10 @@ static PhysPageDesc *phys_page_find_alloc(target_phys_addr_t index, int alloc) return NULL; pd = qemu_vmalloc(sizeof(PhysPageDesc) * L2_SIZE); *lp = pd; - for (i = 0; i < L2_SIZE; i++) - pd[i].phys_offset = IO_MEM_UNASSIGNED; + for (i = 0; i < L2_SIZE; i++) { + pd[i].phys_offset = 0; + pd[i].io_index = IO_MEM_UNASSIGNED >> IO_MEM_SHIFT; + } } return ((PhysPageDesc *)pd) + (index & (L2_SIZE - 1)); } @@ -1092,7 +1096,7 @@ static void breakpoint_invalidate(CPUState *env, target_ulong pc) addr = cpu_get_phys_page_debug(env, pc); p = phys_page_find(addr >> TARGET_PAGE_BITS); if (!p) { - pd = IO_MEM_UNASSIGNED; + pd = 0; } else { pd = p->phys_offset; } @@ -1508,10 +1512,11 @@ static inline void tlb_reset_dirty_range(CPUTLBEntry *tlb_entry, unsigned long start, unsigned long length) { unsigned long addr; - if ((tlb_entry->addr_write & ~TARGET_PAGE_MASK) == IO_MEM_RAM) { + if (!(tlb_entry->addr_write & ~TARGET_PAGE_MASK)) { addr = (tlb_entry->addr_write & TARGET_PAGE_MASK) + tlb_entry->addend; if ((addr - start) < length) { - tlb_entry->addr_write = (tlb_entry->addr_write & TARGET_PAGE_MASK) | IO_MEM_NOTDIRTY; + tlb_entry->addr_write = (tlb_entry->addr_write & TARGET_PAGE_MASK) | TLB_IO_MASK; + tlb_entry->io_index = IO_MEM_NOTDIRTY >> IO_MEM_SHIFT; } } } @@ -1599,11 +1604,12 @@ static inline void tlb_update_dirty(CPUTLBEntry *tlb_ent ry) { ram_addr_t ram_addr; - if ((tlb_entry->addr_write & ~TARGET_PAGE_MASK) == IO_MEM_RAM) { + if (!(tlb_entry->addr_write & ~TARGET_PAGE_MASK)) { ram_addr = (tlb_entry->addr_write & TARGET_PAGE_MASK) + tlb_entry->addend - (unsigned long)phys_ram_base; if (!cpu_physical_memory_is_dirty(ram_addr)) { - tlb_entry->addr_write |= IO_MEM_NOTDIRTY; + tlb_entry->addr_write |= TLB_IO_MASK; + tlb_entry->io_index = IO_MEM_NOTDIRTY >> IO_MEM_SHIFT; } } } @@ -1630,10 +1636,11 @@ static inline void tlb_set_dirty1(CPUTLBEntry *tlb_entry, unsigned long start) { unsigned long addr; - if ((tlb_entry->addr_write & ~TARGET_PAGE_MASK) == IO_MEM_NOTDIRTY) { + if (tlb_entry->io_index == IO_MEM_NOTDIRTY >> IO_MEM_SHIFT) { addr = (tlb_entry->addr_write & TARGET_PAGE_MASK) + tlb_entry->addend; if (addr == start) { - tlb_entry->addr_write = (tlb_entry->addr_write & TARGET_PAGE_MASK) | IO_MEM_RAM; + tlb_entry->addr_write = tlb_entry->addr_write & TARGET_PAGE_MASK; + tlb_entry->io_index = IO_MEM_RAM >> IO_MEM_SHIFT; } } } @@ -1673,12 +1680,15 @@ int tlb_set_page_exec(CPUState *env, target_ulong vaddr, int ret; CPUTLBEntry *te; int i; + int io_index; p = phys_page_find(paddr >> TARGET_PAGE_BITS); if (!p) { - pd = IO_MEM_UNASSIGNED; + pd = 0; + io_index = IO_MEM_UNASSIGNED >> IO_MEM_SHIFT; } else { pd = p->phys_offset; + io_index = p->io_index; } #if defined(DEBUG_TLB) printf("tlb_set_page: vaddr=" TARGET_FMT_lx " paddr=0x%08x prot=%x idx=%d s mmu=%d pd=0x%08lx\n", @@ -1690,9 +1700,9 @@ int tlb_set_page_exec(CPUState *env, target_ulong vaddr, if (is_softmmu) #endif { - if ((pd & ~TARGET_PAGE_MASK) > IO_MEM_ROM && !(pd & IO_MEM_ROMD)) { + if (p->io_index > (IO_MEM_ROM >> IO_MEM_SHIFT) && !(pd & IO_MEM_ROMD)) { /* IO memory case */ - address = vaddr | pd; + address = vaddr | TLB_IO_MASK; addend = paddr; } else { /* standard memory */ @@ -1704,16 +1714,16 @@ int tlb_set_page_exec(CPUState *env, target_ulong vaddr, watchpoint trap routines. */ for (i = 0; i < env->nb_watchpoints; i++) { if (vaddr == (env->watchpoint[i].vaddr & TARGET_PAGE_MASK)) { - if (address & ~TARGET_PAGE_MASK) { + if (io_index) { env->watchpoint[i].addend = 0; - address = vaddr | io_mem_watch; } else { env->watchpoint[i].addend = pd - paddr + (unsigned long) phys_ram_base; /* TODO: Figure out how to make read watchpoints coexist with code. */ - pd = (pd & TARGET_PAGE_MASK) | io_mem_watch | IO_MEM_ROMD; + pd = (pd & TARGET_PAGE_MASK) | IO_MEM_ROMD; } + io_index = io_mem_watch; } } @@ -1721,6 +1731,7 @@ int tlb_set_page_exec(CPUState *env, target_ulong vaddr, addend -= vaddr; te = &env->tlb_table[mmu_idx][index]; te->addend = addend; + te->io_index = io_index; if (prot & PAGE_READ) { te->addr_read = address; } else { @@ -1736,14 +1747,14 @@ int tlb_set_page_exec(CPUState *env, target_ulong vaddr, te->addr_code = -1; } if (prot & PAGE_WRITE) { - if ((pd & ~TARGET_PAGE_MASK) == IO_MEM_ROM || + if (io_index == (IO_MEM_ROM >> IO_MEM_SHIFT) || (pd & IO_MEM_ROMD)) { /* write access calls the I/O callback */ - te->addr_write = vaddr | - (pd & ~(TARGET_PAGE_MASK | IO_MEM_ROMD)); - } else if ((pd & ~TARGET_PAGE_MASK) == IO_MEM_RAM && + te->addr_write = vaddr | TLB_IO_MASK; + } else if (io_index == (IO_MEM_RAM >> IO_MEM_SHIFT) && !cpu_physical_memory_is_dirty(pd)) { - te->addr_write = vaddr | IO_MEM_NOTDIRTY; + te->addr_write = vaddr | TLB_IO_MASK; + te->io_index = IO_MEM_NOTDIRTY >> IO_MEM_SHIFT; } else { te->addr_write = address; } @@ -1753,7 +1764,7 @@ int tlb_set_page_exec(CPUState *env, target_ulong vaddr, } #if !defined(CONFIG_SOFTMMU) else { - if ((pd & ~TARGET_PAGE_MASK) > IO_MEM_ROM) { + if (io_index > (IO_MEM_ROM >> IO_MEM_SHIFT)) { /* IO access: no mapping is done as it will be handled by the soft MMU */ if (!(env->hflags & HF_SOFTMMU_MASK)) @@ -1765,11 +1776,11 @@ int tlb_set_page_exec(CPUState *env, target_ulong vaddr, ret = 2; } else { if (prot & PROT_WRITE) { - if ((pd & ~TARGET_PAGE_MASK) == IO_MEM_ROM || + if (io_index == (IO_MEM_ROM >> IO_MEM_SHIFT) || #if defined(TARGET_HAS_SMC) || 1 first_tb || #endif - ((pd & ~TARGET_PAGE_MASK) == IO_MEM_RAM && + (io_index == (IO_MEM_ROM >> IO_MEM_SHIFT) && !cpu_physical_memory_is_dirty(pd))) { /* ROM: we do as if code was inside */ /* if code is present, we only map as read only and sav e the @@ -2017,9 +2028,9 @@ static inline void tlb_set_dirty(CPUState *env, #endif /* defined(CONFIG_USER_ONLY) */ static int subpage_register (subpage_t *mmio, uint32_t start, uint32_t end, - ram_addr_t memory); -static void *subpage_init (target_phys_addr_t base, ram_addr_t *phys, - ram_addr_t orig_memory); + int memory); +static void *subpage_init (target_phys_addr_t base, PhysPageDesc *p, + int orig_memory); #define CHECK_SUBPAGE(addr, start_addr, start_addr2, end_addr, end_addr2, \ need_subpage) \ do { \ @@ -2057,31 +2068,49 @@ void cpu_register_physical_memory(target_phys_addr_t sta rt_addr, end_addr = start_addr + (target_phys_addr_t)size; for(addr = start_addr; addr != end_addr; addr += TARGET_PAGE_SIZE) { p = phys_page_find(addr >> TARGET_PAGE_BITS); - if (p && p->phys_offset != IO_MEM_UNASSIGNED) { + if (p && p->io_index != (IO_MEM_UNASSIGNED >> IO_MEM_SHIFT)) { ram_addr_t orig_memory = p->phys_offset; target_phys_addr_t start_addr2, end_addr2; int need_subpage = 0; CHECK_SUBPAGE(addr, start_addr, start_addr2, end_addr, end_addr2, need_subpage); - if (need_subpage || phys_offset & IO_MEM_SUBWIDTH) { + if (need_subpage || (phys_offset & IO_MEM_SUBWIDTH)) { if (!(orig_memory & IO_MEM_SUBPAGE)) { subpage = subpage_init((addr & TARGET_PAGE_MASK), - &p->phys_offset, orig_memory); + p, p->io_index); } else { - subpage = io_mem_opaque[(orig_memory & ~TARGET_PAGE_MASK) - >> IO_MEM_SHIFT]; + subpage = io_mem_opaque[p->io_index]; } - subpage_register(subpage, start_addr2, end_addr2, phys_offset); + subpage_register(subpage, start_addr2, end_addr2, + phys_offset >> IO_MEM_SHIFT); } else { - p->phys_offset = phys_offset; + if ((phys_offset & IO_MEM_ROMD) || + (phys_offset & ~TARGET_PAGE_MASK) <= IO_MEM_UNASSIGNED) { + p->phys_offset = phys_offset & + (TARGET_PAGE_MASK | ((1 << IO_MEM_SHIFT) - 1)); + p->io_index = (phys_offset & ~TARGET_PAGE_MASK) >> + IO_MEM_SHIFT; + } else { + p->phys_offset = phys_offset & ((1 << IO_MEM_SHIFT) - 1); + p->io_index = phys_offset >> IO_MEM_SHIFT; + } if ((phys_offset & ~TARGET_PAGE_MASK) <= IO_MEM_ROM || (phys_offset & IO_MEM_ROMD)) phys_offset += TARGET_PAGE_SIZE; } } else { p = phys_page_find_alloc(addr >> TARGET_PAGE_BITS, 1); - p->phys_offset = phys_offset; + if ((phys_offset & IO_MEM_ROMD) || + (phys_offset & ~TARGET_PAGE_MASK) <= IO_MEM_UNASSIGNED) { + p->phys_offset = phys_offset & + (TARGET_PAGE_MASK | ((1 << IO_MEM_SHIFT) - 1)); + p->io_index = (phys_offset & ~TARGET_PAGE_MASK) >> + IO_MEM_SHIFT; + } else { + p->phys_offset = phys_offset & ((1 << IO_MEM_SHIFT) - 1); + p->io_index = phys_offset >> IO_MEM_SHIFT; + } if ((phys_offset & ~TARGET_PAGE_MASK) <= IO_MEM_ROM || (phys_offset & IO_MEM_ROMD)) phys_offset += TARGET_PAGE_SIZE; @@ -2093,10 +2122,10 @@ void cpu_register_physical_memory(target_phys_addr_t sta rt_addr, end_addr2, need_subpage); if (need_subpage || phys_offset & IO_MEM_SUBWIDTH) { - subpage = subpage_init((addr & TARGET_PAGE_MASK), - &p->phys_offset, IO_MEM_UNASSIGNED); + subpage = subpage_init((addr & TARGET_PAGE_MASK), p, + IO_MEM_UNASSIGNED >> IO_MEM_SHIFT); subpage_register(subpage, start_addr2, end_addr2, - phys_offset); + phys_offset >> IO_MEM_SHIFT); } } } @@ -2118,7 +2147,7 @@ ram_addr_t cpu_get_physical_page_desc(target_phys_addr_t a ddr) p = phys_page_find(addr >> TARGET_PAGE_BITS); if (!p) return IO_MEM_UNASSIGNED; - return p->phys_offset; + return p->phys_offset | (p->io_index << IO_MEM_SHIFT); } /* XXX: better than nothing */ @@ -2440,7 +2469,7 @@ static CPUWriteMemoryFunc *subpage_write[] = { }; static int subpage_register (subpage_t *mmio, uint32_t start, uint32_t end, - ram_addr_t memory) + int memory) { int idx, eidx; unsigned int i; @@ -2453,7 +2482,6 @@ static int subpage_register (subpage_t *mmio, uint32_t sta rt, uint32_t end, printf("%s: %p start %08x end %08x idx %08x eidx %08x mem %d\n", __func__, mmio, start, end, idx, eidx, memory); #endif - memory >>= IO_MEM_SHIFT; for (; idx <= eidx; idx++) { for (i = 0; i < 4; i++) { if (io_mem_read[memory][i]) { @@ -2470,8 +2498,8 @@ static int subpage_register (subpage_t *mmio, uint32_t sta rt, uint32_t end, return 0; } -static void *subpage_init (target_phys_addr_t base, ram_addr_t *phys, - ram_addr_t orig_memory) +static void *subpage_init (target_phys_addr_t base, PhysPageDesc *p, + int orig_memory) { subpage_t *mmio; int subpage_memory; @@ -2484,7 +2512,8 @@ static void *subpage_init (target_phys_addr_t base, ram_ad dr_t *phys, printf("%s: %p base " TARGET_FMT_plx " len %08x %d\n", __func__, mmio, base, TARGET_PAGE_SIZE, subpage_memory); #endif - *phys = subpage_memory | IO_MEM_SUBPAGE; + p->phys_offset = IO_MEM_SUBPAGE; + p->io_index = subpage_memory >> IO_MEM_SHIFT; subpage_register(mmio, 0, TARGET_PAGE_SIZE - 1, orig_memory); } @@ -2525,7 +2554,10 @@ int cpu_register_io_memory(int io_index, if (io_index <= 0) { if (io_mem_nb >= IO_MEM_NB_ENTRIES) return -1; - io_index = io_mem_nb++; + do + io_index = io_mem_nb++; + while (((io_index << IO_MEM_SHIFT) & ~TARGET_PAGE_MASK) <= + IO_MEM_UNASSIGNED); } else { if (io_index >= IO_MEM_NB_ENTRIES) return -1; @@ -2611,14 +2643,15 @@ void cpu_physical_memory_rw(target_phys_addr_t addr, uin t8_t *buf, l = len; p = phys_page_find(page >> TARGET_PAGE_BITS); if (!p) { - pd = IO_MEM_UNASSIGNED; + pd = 0; + io_index = IO_MEM_UNASSIGNED >> IO_MEM_SHIFT; } else { pd = p->phys_offset; + io_index = p->io_index; } if (is_write) { - if ((pd & ~TARGET_PAGE_MASK) != IO_MEM_RAM) { - io_index = (pd >> IO_MEM_SHIFT) & (IO_MEM_NB_ENTRIES - 1); + if (io_index != (IO_MEM_RAM >> IO_MEM_SHIFT)) { /* XXX: could force cpu_single_env to NULL to avoid potential bugs */ if (l >= 4 && ((addr & 3) == 0)) { @@ -2652,10 +2685,9 @@ void cpu_physical_memory_rw(target_phys_addr_t addr, uint 8_t *buf, } } } else { - if ((pd & ~TARGET_PAGE_MASK) > IO_MEM_ROM && + if (io_index != (IO_MEM_RAM >> IO_MEM_SHIFT) && !(pd & IO_MEM_ROMD)) { /* I/O case */ - io_index = (pd >> IO_MEM_SHIFT) & (IO_MEM_NB_ENTRIES - 1); if (l >= 4 && ((addr & 3) == 0)) { /* 32 bit read access */ val = io_mem_read[io_index][2](io_mem_opaque[io_index], add r); @@ -2689,7 +2721,7 @@ void cpu_physical_memory_rw(target_phys_addr_t addr, uint8 _t *buf, void cpu_physical_memory_write_rom(target_phys_addr_t addr, const uint8_t *buf, int len) { - int l; + int l, io_index; uint8_t *ptr; target_phys_addr_t page; unsigned long pd; @@ -2702,13 +2734,15 @@ void cpu_physical_memory_write_rom(target_phys_addr_t addr, l = len; p = phys_page_find(page >> TARGET_PAGE_BITS); if (!p) { - pd = IO_MEM_UNASSIGNED; + pd = 0; + io_index = IO_MEM_UNASSIGNED >> IO_MEM_SHIFT; } else { pd = p->phys_offset; + io_index = p->io_index; } - if ((pd & ~TARGET_PAGE_MASK) != IO_MEM_RAM && - (pd & ~TARGET_PAGE_MASK) != IO_MEM_ROM && + if (io_index != (IO_MEM_RAM >> IO_MEM_SHIFT) && + io_index != (IO_MEM_ROM >> IO_MEM_SHIFT) && !(pd & IO_MEM_ROMD)) { /* do nothing */ } else { @@ -2736,15 +2770,16 @@ uint32_t ldl_phys(target_phys_addr_t addr) p = phys_page_find(addr >> TARGET_PAGE_BITS); if (!p) { - pd = IO_MEM_UNASSIGNED; + pd = 0; + io_index = IO_MEM_UNASSIGNED >> IO_MEM_SHIFT; } else { pd = p->phys_offset; + io_index = p->io_index; } - if ((pd & ~TARGET_PAGE_MASK) > IO_MEM_ROM && + if (io_index > (IO_MEM_ROM >> IO_MEM_SHIFT) && !(pd & IO_MEM_ROMD)) { /* I/O case */ - io_index = (pd >> IO_MEM_SHIFT) & (IO_MEM_NB_ENTRIES - 1); val = io_mem_read[io_index][2](io_mem_opaque[io_index], addr); } else { /* RAM case */ @@ -2766,15 +2801,16 @@ uint64_t ldq_phys(target_phys_addr_t addr) p = phys_page_find(addr >> TARGET_PAGE_BITS); if (!p) { - pd = IO_MEM_UNASSIGNED; + pd = 0; + io_index = IO_MEM_UNASSIGNED >> IO_MEM_SHIFT; } else { pd = p->phys_offset; + io_index = p->io_index; } - if ((pd & ~TARGET_PAGE_MASK) > IO_MEM_ROM && + if (io_index > (IO_MEM_ROM >> IO_MEM_SHIFT) && !(pd & IO_MEM_ROMD)) { /* I/O case */ - io_index = (pd >> IO_MEM_SHIFT) & (IO_MEM_NB_ENTRIES - 1); #ifdef TARGET_WORDS_BIGENDIAN val = (uint64_t)io_mem_read[io_index][2](io_mem_opaque[io_index], addr) << 32; val |= io_mem_read[io_index][2](io_mem_opaque[io_index], addr + 4); @@ -2819,13 +2855,14 @@ void stl_phys_notdirty(target_phys_addr_t addr, uint32_t val) p = phys_page_find(addr >> TARGET_PAGE_BITS); if (!p) { - pd = IO_MEM_UNASSIGNED; + pd = 0; + io_index = IO_MEM_UNASSIGNED >> IO_MEM_SHIFT; } else { pd = p->phys_offset; + io_index = p->io_index; } - if ((pd & ~TARGET_PAGE_MASK) != IO_MEM_RAM) { - io_index = (pd >> IO_MEM_SHIFT) & (IO_MEM_NB_ENTRIES - 1); + if (io_index != (IO_MEM_RAM >> IO_MEM_SHIFT)) { io_mem_write[io_index][2](io_mem_opaque[io_index], addr, val); } else { ptr = phys_ram_base + (pd & TARGET_PAGE_MASK) + @@ -2843,13 +2880,14 @@ void stq_phys_notdirty(target_phys_addr_t addr, uint64_t val) p = phys_page_find(addr >> TARGET_PAGE_BITS); if (!p) { - pd = IO_MEM_UNASSIGNED; + pd = 0; + io_index = IO_MEM_UNASSIGNED >> IO_MEM_SHIFT; } else { pd = p->phys_offset; + io_index = p->io_index; } - if ((pd & ~TARGET_PAGE_MASK) != IO_MEM_RAM) { - io_index = (pd >> IO_MEM_SHIFT) & (IO_MEM_NB_ENTRIES - 1); + if (io_index != (IO_MEM_RAM >> IO_MEM_SHIFT)) { #ifdef TARGET_WORDS_BIGENDIAN io_mem_write[io_index][2](io_mem_opaque[io_index], addr, val >> 32); io_mem_write[io_index][2](io_mem_opaque[io_index], addr + 4, val); @@ -2874,13 +2912,14 @@ void stl_phys(target_phys_addr_t addr, uint32_t val) p = phys_page_find(addr >> TARGET_PAGE_BITS); if (!p) { - pd = IO_MEM_UNASSIGNED; + pd = 0; + io_index = IO_MEM_UNASSIGNED >> IO_MEM_SHIFT; } else { pd = p->phys_offset; + io_index = p->io_index; } - if ((pd & ~TARGET_PAGE_MASK) != IO_MEM_RAM) { - io_index = (pd >> IO_MEM_SHIFT) & (IO_MEM_NB_ENTRIES - 1); + if (io_index != (IO_MEM_RAM >> IO_MEM_SHIFT)) { io_mem_write[io_index][2](io_mem_opaque[io_index], addr, val); } else { unsigned long addr1; diff --git a/softmmu_template.h b/softmmu_template.h index 0a4bc7e..b108d73 100644 --- a/softmmu_template.h +++ b/softmmu_template.h @@ -51,12 +51,10 @@ static DATA_TYPE glue(glue(slow_ld, SUFFIX), MMUSUFFIX)(target_ulong addr, int mmu_idx, void *retaddr); static inline DATA_TYPE glue(io_read, SUFFIX)(target_phys_addr_t physaddr, - target_ulong tlb_addr) + int index) { DATA_TYPE res; - int index; - index = (tlb_addr >> IO_MEM_SHIFT) & (IO_MEM_NB_ENTRIES - 1); #if SHIFT <= 2 res = io_mem_read[index][SHIFT](io_mem_opaque[index], physaddr); #else @@ -95,7 +93,8 @@ DATA_TYPE REGPARM glue(glue(__ld, SUFFIX), MMUSUFFIX)(target_ulong addr, /* IO access */ if ((addr & (DATA_SIZE - 1)) != 0) goto do_unaligned_access; - res = glue(io_read, SUFFIX)(physaddr, tlb_addr); + res = glue(io_read, SUFFIX)(physaddr, + env->tlb_table[mmu_idx][index].io_index ); } else if (((addr & ~TARGET_PAGE_MASK) + DATA_SIZE - 1) >= TARGET_PAGE_SIZE) { /* slow unaligned access (it spans two pages or IO) */ do_unaligned_access: @@ -147,7 +146,8 @@ static DATA_TYPE glue(glue(slow_ld, SUFFIX), MMUSUFFIX)(target_ulong addr, /* IO access */ if ((addr & (DATA_SIZE - 1)) != 0) goto do_unaligned_access; - res = glue(io_read, SUFFIX)(physaddr, tlb_addr); + res = glue(io_read, SUFFIX)(physaddr, + env->tlb_table[mmu_idx][index].io_index); } else if (((addr & ~TARGET_PAGE_MASK) + DATA_SIZE - 1) >= TARGET_PAGE_SIZE) { do_unaligned_access: /* slow unaligned access (it spans two pages) */ @@ -186,11 +186,9 @@ static void glue(glue(slow_st, SUFFIX), MUSUFFIX)(target_ulong addr, static inline void glue(io_write, SUFFIX)(target_phys_addr_t physaddr, DATA_TYPE val, target_ulong tlb_addr, + int index, void *retaddr) { - int index; - - index = (tlb_addr >> IO_MEM_SHIFT) & (IO_MEM_NB_ENTRIES - 1); env->mem_write_vaddr = tlb_addr; env->mem_write_pc = (unsigned long)retaddr; #if SHIFT <= 2 @@ -228,7 +226,9 @@ void REGPARM glue(glue(__st, SUFFIX), MUSUFFIX)(target_ulong addr, if ((addr & (DATA_SIZE - 1)) != 0) goto do_unaligned_access; retaddr = GETPC(); - glue(io_write, SUFFIX)(physaddr, val, tlb_addr, retaddr); + glue(io_write, SUFFIX)(physaddr, val, tlb_addr, + env->tlb_table[mmu_idx][index].io_index, + retaddr); } else if (((addr & ~TARGET_PAGE_MASK) + DATA_SIZE - 1) >= TARGET_PAGE_SIZE) { do_unaligned_access: retaddr = GETPC(); @@ -278,7 +278,9 @@ static void glue(glue(slow_st, SUFFIX), MMUSUFFIX)(target_ulong addr, /* IO access */ if ((addr & (DATA_SIZE - 1)) != 0) goto do_unaligned_access; - glue(io_write, SUFFIX)(physaddr, val, tlb_addr, retaddr); + glue(io_write, SUFFIX)(physaddr, val, tlb_addr, + env->tlb_table[mmu_idx][index].io_index, + retaddr); } else if (((addr & ~TARGET_PAGE_MASK) + DATA_SIZE - 1) >= TARGET_PAGE_SIZE) { do_unaligned_access: /* XXX: not efficient, but simple */ Regards ------=_Part_1035_14516935.1210519216292 Content-Type: text/x-patch; name=iomem-nb-max.patch Content-Transfer-Encoding: base64 X-Attachment-Id: f_fg3ridl5 Content-Disposition: attachment; filename=iomem-nb-max.patch ZGlmZiAtLWdpdCBhL2NwdS1hbGwuaCBiL2NwdS1hbGwuaAppbmRleCAzODcwMzBlLi4xMDI1OGMz IDEwMDY0NAotLS0gYS9jcHUtYWxsLmgKKysrIGIvY3B1LWFsbC5oCkBAIC04MjksOCArODI5LDkg QEAgZXh0ZXJuIHJhbV9hZGRyX3QgcmFtX3NpemU7CiAKIC8qIHBoeXNpY2FsIG1lbW9yeSBhY2Nl c3MgKi8KICNkZWZpbmUgVExCX0lOVkFMSURfTUFTSyAgICgxIDw8IDMpCisjZGVmaW5lIFRMQl9J T19NQVNLICAgICAgICAoMSA8PCA0KQogI2RlZmluZSBJT19NRU1fU0hJRlQgICAgICAgNAotI2Rl ZmluZSBJT19NRU1fTkJfRU5UUklFUyAgKDEgPDwgKFRBUkdFVF9QQUdFX0JJVFMgIC0gSU9fTUVN X1NISUZUKSkKKyNkZWZpbmUgSU9fTUVNX05CX0VOVFJJRVMgIDEwMjQKIAogI2RlZmluZSBJT19N RU1fUkFNICAgICAgICAgKDAgPDwgSU9fTUVNX1NISUZUKSAvKiBoYXJkY29kZWQgb2Zmc2V0ICov CiAjZGVmaW5lIElPX01FTV9ST00gICAgICAgICAoMSA8PCBJT19NRU1fU0hJRlQpIC8qIGhhcmRj b2RlZCBvZmZzZXQgKi8KQEAgLTg0MCw4ICs4NDEsOCBAQCBleHRlcm4gcmFtX2FkZHJfdCByYW1f c2l6ZTsKICAgIGV4Y2VwdGlvbiwgdGhlIHdyaXRlIG1lbW9yeSBjYWxsYmFjayBnZXRzIHRoZSBy YW0gb2Zmc2V0IGluc3RlYWQgb2YKICAgIHRoZSBwaHlzaWNhbCBhZGRyZXNzICovCiAjZGVmaW5l IElPX01FTV9ST01EICAgICAgICAoMSkKLSNkZWZpbmUgSU9fTUVNX1NVQlBBR0UgICAgICgyKQot I2RlZmluZSBJT19NRU1fU1VCV0lEVEggICAgKDQpCisjZGVmaW5lIElPX01FTV9TVUJQQUdFICAg ICAoMikgLyogdXNlZCBpbnRlcm5hbGx5ICovCisjZGVmaW5lIElPX01FTV9TVUJXSURUSCAgICAo NCkgLyogdXNlZCBpbnRlcm5hbGx5ICovCiAKIHR5cGVkZWYgdm9pZCBDUFVXcml0ZU1lbW9yeUZ1 bmModm9pZCAqb3BhcXVlLCB0YXJnZXRfcGh5c19hZGRyX3QgYWRkciwgdWludDMyX3QgdmFsdWUp OwogdHlwZWRlZiB1aW50MzJfdCBDUFVSZWFkTWVtb3J5RnVuYyh2b2lkICpvcGFxdWUsIHRhcmdl dF9waHlzX2FkZHJfdCBhZGRyKTsKZGlmZiAtLWdpdCBhL2NwdS1kZWZzLmggYi9jcHUtZGVmcy5o CmluZGV4IGM0Mzg5ZWQuLjVmM2RlZjggMTAwNjQ0Ci0tLSBhL2NwdS1kZWZzLmgKKysrIGIvY3B1 LWRlZnMuaApAQCAtOTksMTYgKzk5LDE2IEBAIHR5cGVkZWYgdWludDY0X3QgdGFyZ2V0X3BoeXNf YWRkcl90OwogI2RlZmluZSBDUFVfVExCX0JJVFMgOAogI2RlZmluZSBDUFVfVExCX1NJWkUgKDEg PDwgQ1BVX1RMQl9CSVRTKQogCi0jaWYgVEFSR0VUX1BIWVNfQUREUl9CSVRTID09IDMyICYmIFRB UkdFVF9MT05HX0JJVFMgPT0gMzIKLSNkZWZpbmUgQ1BVX1RMQl9FTlRSWV9CSVRTIDQKLSNlbHNl CisjaWYgVEFSR0VUX0xPTkdfQklUUyA9PSAzMgogI2RlZmluZSBDUFVfVExCX0VOVFJZX0JJVFMg NQorI2Vsc2UKKyNkZWZpbmUgQ1BVX1RMQl9FTlRSWV9CSVRTIDYKICNlbmRpZgogCiB0eXBlZGVm IHN0cnVjdCBDUFVUTEJFbnRyeSB7CiAgICAgLyogYml0IDMxIHRvIFRBUkdFVF9QQUdFX0JJVFMg OiB2aXJ0dWFsIGFkZHJlc3MKLSAgICAgICBiaXQgVEFSR0VUX1BBR0VfQklUUy0xLi5JT19NRU1f U0hJRlQgOiBpZiBub24gemVybywgbWVtb3J5IGlvCi0gICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgem9uZSBudW1iZXIKKyAgICAgICBiaXQgVEFSR0VUX1BBR0Vf QklUUy0xLi5JT19NRU1fU0hJRlQrMSA6IHplcm8KKyAgICAgICBiaXQgSU9fTUVNX1NISUZUICAg ICAgICAgICA6IGluZGljYXRlcyBhbiBpbyByZWdpb24KICAgICAgICBiaXQgMyAgICAgICAgICAg ICAgICAgICAgICA6IGluZGljYXRlcyB0aGF0IHRoZSBlbnRyeSBpcyBpbnZhbGlkCiAgICAgICAg Yml0IDIuLjAgICAgICAgICAgICAgICAgICAgOiB6ZXJvCiAgICAgKi8KQEAgLTEyMiwxMSArMTIy LDE0IEBAIHR5cGVkZWYgc3RydWN0IENQVVRMQkVudHJ5IHsKICNlbHNlCiAgICAgdGFyZ2V0X3Bo eXNfYWRkcl90IGFkZGVuZDsKICNlbmRpZgorICAgIC8qIGlmIG5vbi16ZXJvLCBtZW1vcnkgaW8g em9uZSBudW1iZXIgKi8KKyAgICBpbnQgaW9faW5kZXg7CiAgICAgLyogcGFkZGluZyB0byBnZXQg YSBwb3dlciBvZiB0d28gc2l6ZSAqLwogICAgIHVpbnQ4X3QgZHVtbXlbKDEgPDwgQ1BVX1RMQl9F TlRSWV9CSVRTKSAtIAogICAgICAgICAgICAgICAgICAgKHNpemVvZih0YXJnZXRfdWxvbmcpICog MyArIAogICAgICAgICAgICAgICAgICAgICgoLXNpemVvZih0YXJnZXRfdWxvbmcpICogMykgJiAo c2l6ZW9mKHRhcmdldF9waHlzX2FkZHJfdCkgLSAxKSkgKyAKLSAgICAgICAgICAgICAgICAgICBz aXplb2YodGFyZ2V0X3BoeXNfYWRkcl90KSldOworICAgICAgICAgICAgICAgICAgIHNpemVvZih0 YXJnZXRfcGh5c19hZGRyX3QpICsKKyAgICAgICAgICAgICAgICAgICBzaXplb2YoaW50KSldOwog fSBDUFVUTEJFbnRyeTsKIAogI2RlZmluZSBDUFVfVEVNUF9CVUZfTkxPTkdTIDEyOApkaWZmIC0t Z2l0IGEvZXhlYy5jIGIvZXhlYy5jCmluZGV4IDJmZDAwNzguLjkzNWM0YmEgMTAwNjQ0Ci0tLSBh L2V4ZWMuYworKysgYi9leGVjLmMKQEAgLTExNyw4ICsxMTcsMTAgQEAgdHlwZWRlZiBzdHJ1Y3Qg UGFnZURlc2MgewogfSBQYWdlRGVzYzsKIAogdHlwZWRlZiBzdHJ1Y3QgUGh5c1BhZ2VEZXNjIHsK LSAgICAvKiBvZmZzZXQgaW4gaG9zdCBtZW1vcnkgb2YgdGhlIHBhZ2UgKyBpb19pbmRleCBpbiB0 aGUgbG93IDEyIGJpdHMgKi8KKyAgICAvKiBvZmZzZXQgaW4gaG9zdCBtZW1vcnkgb2YgdGhlIHBh Z2UgKi8KICAgICByYW1fYWRkcl90IHBoeXNfb2Zmc2V0OworICAgIC8qIG1lbW9yeSBpbyByZWdp b24gaWQgKi8KKyAgICBpbnQgaW9faW5kZXg7CiB9IFBoeXNQYWdlRGVzYzsKIAogI2RlZmluZSBM Ml9CSVRTIDEwCkBAIC0zMTAsOCArMzEyLDEwIEBAIHN0YXRpYyBQaHlzUGFnZURlc2MgKnBoeXNf cGFnZV9maW5kX2FsbG9jKHRhcmdldF9waHlzX2FkZHJfdCBpbmRleCwgaW50IGFsbG9jKQogICAg ICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgIHBkID0gcWVtdV92bWFsbG9jKHNpemVvZihQ aHlzUGFnZURlc2MpICogTDJfU0laRSk7CiAgICAgICAgICpscCA9IHBkOwotICAgICAgICBmb3Ig KGkgPSAwOyBpIDwgTDJfU0laRTsgaSsrKQotICAgICAgICAgIHBkW2ldLnBoeXNfb2Zmc2V0ID0g SU9fTUVNX1VOQVNTSUdORUQ7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBMMl9TSVpFOyBpKysp IHsKKyAgICAgICAgICAgIHBkW2ldLnBoeXNfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgIHBkW2ld LmlvX2luZGV4ID0gSU9fTUVNX1VOQVNTSUdORUQgPj4gSU9fTUVNX1NISUZUOworICAgICAgICB9 CiAgICAgfQogICAgIHJldHVybiAoKFBoeXNQYWdlRGVzYyAqKXBkKSArIChpbmRleCAmIChMMl9T SVpFIC0gMSkpOwogfQpAQCAtMTA5Miw3ICsxMDk2LDcgQEAgc3RhdGljIHZvaWQgYnJlYWtwb2lu dF9pbnZhbGlkYXRlKENQVVN0YXRlICplbnYsIHRhcmdldF91bG9uZyBwYykKICAgICBhZGRyID0g Y3B1X2dldF9waHlzX3BhZ2VfZGVidWcoZW52LCBwYyk7CiAgICAgcCA9IHBoeXNfcGFnZV9maW5k KGFkZHIgPj4gVEFSR0VUX1BBR0VfQklUUyk7CiAgICAgaWYgKCFwKSB7Ci0gICAgICAgIHBkID0g SU9fTUVNX1VOQVNTSUdORUQ7CisgICAgICAgIHBkID0gMDsKICAgICB9IGVsc2UgewogICAgICAg ICBwZCA9IHAtPnBoeXNfb2Zmc2V0OwogICAgIH0KQEAgLTE1MDgsMTAgKzE1MTIsMTEgQEAgc3Rh dGljIGlubGluZSB2b2lkIHRsYl9yZXNldF9kaXJ0eV9yYW5nZShDUFVUTEJFbnRyeSAqdGxiX2Vu dHJ5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBs b25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGxlbmd0aCkKIHsKICAgICB1bnNpZ25lZCBsb25nIGFk ZHI7Ci0gICAgaWYgKCh0bGJfZW50cnktPmFkZHJfd3JpdGUgJiB+VEFSR0VUX1BBR0VfTUFTSykg PT0gSU9fTUVNX1JBTSkgeworICAgIGlmICghKHRsYl9lbnRyeS0+YWRkcl93cml0ZSAmIH5UQVJH RVRfUEFHRV9NQVNLKSkgewogICAgICAgICBhZGRyID0gKHRsYl9lbnRyeS0+YWRkcl93cml0ZSAm IFRBUkdFVF9QQUdFX01BU0spICsgdGxiX2VudHJ5LT5hZGRlbmQ7CiAgICAgICAgIGlmICgoYWRk ciAtIHN0YXJ0KSA8IGxlbmd0aCkgewotICAgICAgICAgICAgdGxiX2VudHJ5LT5hZGRyX3dyaXRl ID0gKHRsYl9lbnRyeS0+YWRkcl93cml0ZSAmIFRBUkdFVF9QQUdFX01BU0spIHwgSU9fTUVNX05P VERJUlRZOworICAgICAgICAgICAgdGxiX2VudHJ5LT5hZGRyX3dyaXRlID0gKHRsYl9lbnRyeS0+ YWRkcl93cml0ZSAmIFRBUkdFVF9QQUdFX01BU0spIHwgVExCX0lPX01BU0s7CisgICAgICAgICAg ICB0bGJfZW50cnktPmlvX2luZGV4ID0gSU9fTUVNX05PVERJUlRZID4+IElPX01FTV9TSElGVDsK ICAgICAgICAgfQogICAgIH0KIH0KQEAgLTE1OTksMTEgKzE2MDQsMTIgQEAgc3RhdGljIGlubGlu ZSB2b2lkIHRsYl91cGRhdGVfZGlydHkoQ1BVVExCRW50cnkgKnRsYl9lbnRyeSkKIHsKICAgICBy YW1fYWRkcl90IHJhbV9hZGRyOwogCi0gICAgaWYgKCh0bGJfZW50cnktPmFkZHJfd3JpdGUgJiB+ VEFSR0VUX1BBR0VfTUFTSykgPT0gSU9fTUVNX1JBTSkgeworICAgIGlmICghKHRsYl9lbnRyeS0+ YWRkcl93cml0ZSAmIH5UQVJHRVRfUEFHRV9NQVNLKSkgewogICAgICAgICByYW1fYWRkciA9ICh0 bGJfZW50cnktPmFkZHJfd3JpdGUgJiBUQVJHRVRfUEFHRV9NQVNLKSArCiAgICAgICAgICAgICB0 bGJfZW50cnktPmFkZGVuZCAtICh1bnNpZ25lZCBsb25nKXBoeXNfcmFtX2Jhc2U7CiAgICAgICAg IGlmICghY3B1X3BoeXNpY2FsX21lbW9yeV9pc19kaXJ0eShyYW1fYWRkcikpIHsKLSAgICAgICAg ICAgIHRsYl9lbnRyeS0+YWRkcl93cml0ZSB8PSBJT19NRU1fTk9URElSVFk7CisgICAgICAgICAg ICB0bGJfZW50cnktPmFkZHJfd3JpdGUgfD0gVExCX0lPX01BU0s7CisgICAgICAgICAgICB0bGJf ZW50cnktPmlvX2luZGV4ID0gSU9fTUVNX05PVERJUlRZID4+IElPX01FTV9TSElGVDsKICAgICAg ICAgfQogICAgIH0KIH0KQEAgLTE2MzAsMTAgKzE2MzYsMTEgQEAgc3RhdGljIGlubGluZSB2b2lk IHRsYl9zZXRfZGlydHkxKENQVVRMQkVudHJ5ICp0bGJfZW50cnksCiAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBzdGFydCkKIHsKICAgICB1bnNpZ25lZCBs b25nIGFkZHI7Ci0gICAgaWYgKCh0bGJfZW50cnktPmFkZHJfd3JpdGUgJiB+VEFSR0VUX1BBR0Vf TUFTSykgPT0gSU9fTUVNX05PVERJUlRZKSB7CisgICAgaWYgKHRsYl9lbnRyeS0+aW9faW5kZXgg PT0gSU9fTUVNX05PVERJUlRZID4+IElPX01FTV9TSElGVCkgewogICAgICAgICBhZGRyID0gKHRs Yl9lbnRyeS0+YWRkcl93cml0ZSAmIFRBUkdFVF9QQUdFX01BU0spICsgdGxiX2VudHJ5LT5hZGRl bmQ7CiAgICAgICAgIGlmIChhZGRyID09IHN0YXJ0KSB7Ci0gICAgICAgICAgICB0bGJfZW50cnkt PmFkZHJfd3JpdGUgPSAodGxiX2VudHJ5LT5hZGRyX3dyaXRlICYgVEFSR0VUX1BBR0VfTUFTSykg fCBJT19NRU1fUkFNOworICAgICAgICAgICAgdGxiX2VudHJ5LT5hZGRyX3dyaXRlID0gdGxiX2Vu dHJ5LT5hZGRyX3dyaXRlICYgVEFSR0VUX1BBR0VfTUFTSzsKKyAgICAgICAgICAgIHRsYl9lbnRy eS0+aW9faW5kZXggPSBJT19NRU1fUkFNID4+IElPX01FTV9TSElGVDsKICAgICAgICAgfQogICAg IH0KIH0KQEAgLTE2NzMsMTIgKzE2ODAsMTUgQEAgaW50IHRsYl9zZXRfcGFnZV9leGVjKENQVVN0 YXRlICplbnYsIHRhcmdldF91bG9uZyB2YWRkciwKICAgICBpbnQgcmV0OwogICAgIENQVVRMQkVu dHJ5ICp0ZTsKICAgICBpbnQgaTsKKyAgICBpbnQgaW9faW5kZXg7CiAKICAgICBwID0gcGh5c19w YWdlX2ZpbmQocGFkZHIgPj4gVEFSR0VUX1BBR0VfQklUUyk7CiAgICAgaWYgKCFwKSB7Ci0gICAg ICAgIHBkID0gSU9fTUVNX1VOQVNTSUdORUQ7CisgICAgICAgIHBkID0gMDsKKyAgICAgICAgaW9f aW5kZXggPSBJT19NRU1fVU5BU1NJR05FRCA+PiBJT19NRU1fU0hJRlQ7CiAgICAgfSBlbHNlIHsK ICAgICAgICAgcGQgPSBwLT5waHlzX29mZnNldDsKKyAgICAgICAgaW9faW5kZXggPSBwLT5pb19p bmRleDsKICAgICB9CiAjaWYgZGVmaW5lZChERUJVR19UTEIpCiAgICAgcHJpbnRmKCJ0bGJfc2V0 X3BhZ2U6IHZhZGRyPSIgVEFSR0VUX0ZNVF9seCAiIHBhZGRyPTB4JTA4eCBwcm90PSV4IGlkeD0l ZCBzbW11PSVkIHBkPTB4JTA4bHhcbiIsCkBAIC0xNjkwLDkgKzE3MDAsOSBAQCBpbnQgdGxiX3Nl dF9wYWdlX2V4ZWMoQ1BVU3RhdGUgKmVudiwgdGFyZ2V0X3Vsb25nIHZhZGRyLAogICAgIGlmIChp c19zb2Z0bW11KQogI2VuZGlmCiAgICAgewotICAgICAgICBpZiAoKHBkICYgflRBUkdFVF9QQUdF X01BU0spID4gSU9fTUVNX1JPTSAmJiAhKHBkICYgSU9fTUVNX1JPTUQpKSB7CisgICAgICAgIGlm IChwLT5pb19pbmRleCA+IChJT19NRU1fUk9NID4+IElPX01FTV9TSElGVCkgJiYgIShwZCAmIElP X01FTV9ST01EKSkgewogICAgICAgICAgICAgLyogSU8gbWVtb3J5IGNhc2UgKi8KLSAgICAgICAg ICAgIGFkZHJlc3MgPSB2YWRkciB8IHBkOworICAgICAgICAgICAgYWRkcmVzcyA9IHZhZGRyIHwg VExCX0lPX01BU0s7CiAgICAgICAgICAgICBhZGRlbmQgPSBwYWRkcjsKICAgICAgICAgfSBlbHNl IHsKICAgICAgICAgICAgIC8qIHN0YW5kYXJkIG1lbW9yeSAqLwpAQCAtMTcwNCwxNiArMTcxNCwx NiBAQCBpbnQgdGxiX3NldF9wYWdlX2V4ZWMoQ1BVU3RhdGUgKmVudiwgdGFyZ2V0X3Vsb25nIHZh ZGRyLAogICAgICAgICAgICB3YXRjaHBvaW50IHRyYXAgcm91dGluZXMuICAqLwogICAgICAgICBm b3IgKGkgPSAwOyBpIDwgZW52LT5uYl93YXRjaHBvaW50czsgaSsrKSB7CiAgICAgICAgICAgICBp ZiAodmFkZHIgPT0gKGVudi0+d2F0Y2hwb2ludFtpXS52YWRkciAmIFRBUkdFVF9QQUdFX01BU0sp KSB7Ci0gICAgICAgICAgICAgICAgaWYgKGFkZHJlc3MgJiB+VEFSR0VUX1BBR0VfTUFTSykgewor ICAgICAgICAgICAgICAgIGlmIChpb19pbmRleCkgewogICAgICAgICAgICAgICAgICAgICBlbnYt PndhdGNocG9pbnRbaV0uYWRkZW5kID0gMDsKLSAgICAgICAgICAgICAgICAgICAgYWRkcmVzcyA9 IHZhZGRyIHwgaW9fbWVtX3dhdGNoOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAg ICAgICAgICAgICAgIGVudi0+d2F0Y2hwb2ludFtpXS5hZGRlbmQgPSBwZCAtIHBhZGRyICsKICAg ICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKSBwaHlzX3JhbV9iYXNlOwogICAg ICAgICAgICAgICAgICAgICAvKiBUT0RPOiBGaWd1cmUgb3V0IGhvdyB0byBtYWtlIHJlYWQgd2F0 Y2hwb2ludHMgY29leGlzdAogICAgICAgICAgICAgICAgICAgICAgICB3aXRoIGNvZGUuICAqLwot ICAgICAgICAgICAgICAgICAgICBwZCA9IChwZCAmIFRBUkdFVF9QQUdFX01BU0spIHwgaW9fbWVt X3dhdGNoIHwgSU9fTUVNX1JPTUQ7CisgICAgICAgICAgICAgICAgICAgIHBkID0gKHBkICYgVEFS R0VUX1BBR0VfTUFTSykgfCBJT19NRU1fUk9NRDsKICAgICAgICAgICAgICAgICB9CisgICAgICAg ICAgICAgICAgaW9faW5kZXggPSBpb19tZW1fd2F0Y2g7CiAgICAgICAgICAgICB9CiAgICAgICAg IH0KIApAQCAtMTcyMSw2ICsxNzMxLDcgQEAgaW50IHRsYl9zZXRfcGFnZV9leGVjKENQVVN0YXRl ICplbnYsIHRhcmdldF91bG9uZyB2YWRkciwKICAgICAgICAgYWRkZW5kIC09IHZhZGRyOwogICAg ICAgICB0ZSA9ICZlbnYtPnRsYl90YWJsZVttbXVfaWR4XVtpbmRleF07CiAgICAgICAgIHRlLT5h ZGRlbmQgPSBhZGRlbmQ7CisgICAgICAgIHRlLT5pb19pbmRleCA9IGlvX2luZGV4OwogICAgICAg ICBpZiAocHJvdCAmIFBBR0VfUkVBRCkgewogICAgICAgICAgICAgdGUtPmFkZHJfcmVhZCA9IGFk ZHJlc3M7CiAgICAgICAgIH0gZWxzZSB7CkBAIC0xNzM2LDE0ICsxNzQ3LDE0IEBAIGludCB0bGJf c2V0X3BhZ2VfZXhlYyhDUFVTdGF0ZSAqZW52LCB0YXJnZXRfdWxvbmcgdmFkZHIsCiAgICAgICAg ICAgICB0ZS0+YWRkcl9jb2RlID0gLTE7CiAgICAgICAgIH0KICAgICAgICAgaWYgKHByb3QgJiBQ QUdFX1dSSVRFKSB7Ci0gICAgICAgICAgICBpZiAoKHBkICYgflRBUkdFVF9QQUdFX01BU0spID09 IElPX01FTV9ST00gfHwKKyAgICAgICAgICAgIGlmIChpb19pbmRleCA9PSAoSU9fTUVNX1JPTSA+ PiBJT19NRU1fU0hJRlQpIHx8CiAgICAgICAgICAgICAgICAgKHBkICYgSU9fTUVNX1JPTUQpKSB7 CiAgICAgICAgICAgICAgICAgLyogd3JpdGUgYWNjZXNzIGNhbGxzIHRoZSBJL08gY2FsbGJhY2sg Ki8KLSAgICAgICAgICAgICAgICB0ZS0+YWRkcl93cml0ZSA9IHZhZGRyIHwKLSAgICAgICAgICAg ICAgICAgICAgKHBkICYgfihUQVJHRVRfUEFHRV9NQVNLIHwgSU9fTUVNX1JPTUQpKTsKLSAgICAg ICAgICAgIH0gZWxzZSBpZiAoKHBkICYgflRBUkdFVF9QQUdFX01BU0spID09IElPX01FTV9SQU0g JiYKKyAgICAgICAgICAgICAgICB0ZS0+YWRkcl93cml0ZSA9IHZhZGRyIHwgVExCX0lPX01BU0s7 CisgICAgICAgICAgICB9IGVsc2UgaWYgKGlvX2luZGV4ID09IChJT19NRU1fUkFNID4+IElPX01F TV9TSElGVCkgJiYKICAgICAgICAgICAgICAgICAgICAgICAgIWNwdV9waHlzaWNhbF9tZW1vcnlf aXNfZGlydHkocGQpKSB7Ci0gICAgICAgICAgICAgICAgdGUtPmFkZHJfd3JpdGUgPSB2YWRkciB8 IElPX01FTV9OT1RESVJUWTsKKyAgICAgICAgICAgICAgICB0ZS0+YWRkcl93cml0ZSA9IHZhZGRy IHwgVExCX0lPX01BU0s7CisgICAgICAgICAgICAgICAgdGUtPmlvX2luZGV4ID0gSU9fTUVNX05P VERJUlRZID4+IElPX01FTV9TSElGVDsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAg ICAgICAgdGUtPmFkZHJfd3JpdGUgPSBhZGRyZXNzOwogICAgICAgICAgICAgfQpAQCAtMTc1Myw3 ICsxNzY0LDcgQEAgaW50IHRsYl9zZXRfcGFnZV9leGVjKENQVVN0YXRlICplbnYsIHRhcmdldF91 bG9uZyB2YWRkciwKICAgICB9CiAjaWYgIWRlZmluZWQoQ09ORklHX1NPRlRNTVUpCiAgICAgZWxz ZSB7Ci0gICAgICAgIGlmICgocGQgJiB+VEFSR0VUX1BBR0VfTUFTSykgPiBJT19NRU1fUk9NKSB7 CisgICAgICAgIGlmIChpb19pbmRleCA+IChJT19NRU1fUk9NID4+IElPX01FTV9TSElGVCkpIHsK ICAgICAgICAgICAgIC8qIElPIGFjY2Vzczogbm8gbWFwcGluZyBpcyBkb25lIGFzIGl0IHdpbGwg YmUgaGFuZGxlZCBieSB0aGUKICAgICAgICAgICAgICAgIHNvZnQgTU1VICovCiAgICAgICAgICAg ICBpZiAoIShlbnYtPmhmbGFncyAmIEhGX1NPRlRNTVVfTUFTSykpCkBAIC0xNzY1LDExICsxNzc2 LDExIEBAIGludCB0bGJfc2V0X3BhZ2VfZXhlYyhDUFVTdGF0ZSAqZW52LCB0YXJnZXRfdWxvbmcg dmFkZHIsCiAgICAgICAgICAgICAgICAgcmV0ID0gMjsKICAgICAgICAgICAgIH0gZWxzZSB7CiAg ICAgICAgICAgICAgICAgaWYgKHByb3QgJiBQUk9UX1dSSVRFKSB7Ci0gICAgICAgICAgICAgICAg ICAgIGlmICgocGQgJiB+VEFSR0VUX1BBR0VfTUFTSykgPT0gSU9fTUVNX1JPTSB8fAorICAgICAg ICAgICAgICAgICAgICBpZiAoaW9faW5kZXggPT0gKElPX01FTV9ST00gPj4gSU9fTUVNX1NISUZU KSB8fAogI2lmIGRlZmluZWQoVEFSR0VUX0hBU19TTUMpIHx8IDEKICAgICAgICAgICAgICAgICAg ICAgICAgIGZpcnN0X3RiIHx8CiAjZW5kaWYKLSAgICAgICAgICAgICAgICAgICAgICAgICgocGQg JiB+VEFSR0VUX1BBR0VfTUFTSykgPT0gSU9fTUVNX1JBTSAmJgorICAgICAgICAgICAgICAgICAg ICAgICAgKGlvX2luZGV4ID09IChJT19NRU1fUk9NID4+IElPX01FTV9TSElGVCkgJiYKICAgICAg ICAgICAgICAgICAgICAgICAgICAhY3B1X3BoeXNpY2FsX21lbW9yeV9pc19kaXJ0eShwZCkpKSB7 CiAgICAgICAgICAgICAgICAgICAgICAgICAvKiBST006IHdlIGRvIGFzIGlmIGNvZGUgd2FzIGlu c2lkZSAqLwogICAgICAgICAgICAgICAgICAgICAgICAgLyogaWYgY29kZSBpcyBwcmVzZW50LCB3 ZSBvbmx5IG1hcCBhcyByZWFkIG9ubHkgYW5kIHNhdmUgdGhlCkBAIC0yMDE3LDkgKzIwMjgsOSBA QCBzdGF0aWMgaW5saW5lIHZvaWQgdGxiX3NldF9kaXJ0eShDUFVTdGF0ZSAqZW52LAogI2VuZGlm IC8qIGRlZmluZWQoQ09ORklHX1VTRVJfT05MWSkgKi8KIAogc3RhdGljIGludCBzdWJwYWdlX3Jl Z2lzdGVyIChzdWJwYWdlX3QgKm1taW8sIHVpbnQzMl90IHN0YXJ0LCB1aW50MzJfdCBlbmQsCi0g ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbV9hZGRyX3QgbWVtb3J5KTsKLXN0YXRpYyB2 b2lkICpzdWJwYWdlX2luaXQgKHRhcmdldF9waHlzX2FkZHJfdCBiYXNlLCByYW1fYWRkcl90ICpw aHlzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFtX2FkZHJfdCBvcmlnX21lbW9yeSk7 CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtZW1vcnkpOworc3RhdGljIHZvaWQg KnN1YnBhZ2VfaW5pdCAodGFyZ2V0X3BoeXNfYWRkcl90IGJhc2UsIFBoeXNQYWdlRGVzYyAqcCwK KyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvcmlnX21lbW9yeSk7CiAjZGVmaW5lIENI RUNLX1NVQlBBR0UoYWRkciwgc3RhcnRfYWRkciwgc3RhcnRfYWRkcjIsIGVuZF9hZGRyLCBlbmRf YWRkcjIsIFwKICAgICAgICAgICAgICAgICAgICAgICBuZWVkX3N1YnBhZ2UpICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKQEAgLTIwNTcsMzEg KzIwNjgsNDkgQEAgdm9pZCBjcHVfcmVnaXN0ZXJfcGh5c2ljYWxfbWVtb3J5KHRhcmdldF9waHlz X2FkZHJfdCBzdGFydF9hZGRyLAogICAgIGVuZF9hZGRyID0gc3RhcnRfYWRkciArICh0YXJnZXRf cGh5c19hZGRyX3Qpc2l6ZTsKICAgICBmb3IoYWRkciA9IHN0YXJ0X2FkZHI7IGFkZHIgIT0gZW5k X2FkZHI7IGFkZHIgKz0gVEFSR0VUX1BBR0VfU0laRSkgewogICAgICAgICBwID0gcGh5c19wYWdl X2ZpbmQoYWRkciA+PiBUQVJHRVRfUEFHRV9CSVRTKTsKLSAgICAgICAgaWYgKHAgJiYgcC0+cGh5 c19vZmZzZXQgIT0gSU9fTUVNX1VOQVNTSUdORUQpIHsKKyAgICAgICAgaWYgKHAgJiYgcC0+aW9f aW5kZXggIT0gKElPX01FTV9VTkFTU0lHTkVEID4+IElPX01FTV9TSElGVCkpIHsKICAgICAgICAg ICAgIHJhbV9hZGRyX3Qgb3JpZ19tZW1vcnkgPSBwLT5waHlzX29mZnNldDsKICAgICAgICAgICAg IHRhcmdldF9waHlzX2FkZHJfdCBzdGFydF9hZGRyMiwgZW5kX2FkZHIyOwogICAgICAgICAgICAg aW50IG5lZWRfc3VicGFnZSA9IDA7CiAKICAgICAgICAgICAgIENIRUNLX1NVQlBBR0UoYWRkciwg c3RhcnRfYWRkciwgc3RhcnRfYWRkcjIsIGVuZF9hZGRyLCBlbmRfYWRkcjIsCiAgICAgICAgICAg ICAgICAgICAgICAgICAgIG5lZWRfc3VicGFnZSk7Ci0gICAgICAgICAgICBpZiAobmVlZF9zdWJw YWdlIHx8IHBoeXNfb2Zmc2V0ICYgSU9fTUVNX1NVQldJRFRIKSB7CisgICAgICAgICAgICBpZiAo bmVlZF9zdWJwYWdlIHx8IChwaHlzX29mZnNldCAmIElPX01FTV9TVUJXSURUSCkpIHsKICAgICAg ICAgICAgICAgICBpZiAoIShvcmlnX21lbW9yeSAmIElPX01FTV9TVUJQQUdFKSkgewogICAgICAg ICAgICAgICAgICAgICBzdWJwYWdlID0gc3VicGFnZV9pbml0KChhZGRyICYgVEFSR0VUX1BBR0Vf TUFTSyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnAtPnBo eXNfb2Zmc2V0LCBvcmlnX21lbW9yeSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgcCwgcC0+aW9faW5kZXgpOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0g ICAgICAgICAgICAgICAgICAgIHN1YnBhZ2UgPSBpb19tZW1fb3BhcXVlWyhvcmlnX21lbW9yeSAm IH5UQVJHRVRfUEFHRV9NQVNLKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICA+PiBJT19NRU1fU0hJRlRdOworICAgICAgICAgICAgICAgICAgICBzdWJwYWdlID0g aW9fbWVtX29wYXF1ZVtwLT5pb19pbmRleF07CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAg ICAgICAgIHN1YnBhZ2VfcmVnaXN0ZXIoc3VicGFnZSwgc3RhcnRfYWRkcjIsIGVuZF9hZGRyMiwg cGh5c19vZmZzZXQpOworICAgICAgICAgICAgICAgIHN1YnBhZ2VfcmVnaXN0ZXIoc3VicGFnZSwg c3RhcnRfYWRkcjIsIGVuZF9hZGRyMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IHBoeXNfb2Zmc2V0ID4+IElPX01FTV9TSElGVCk7CiAgICAgICAgICAgICB9IGVsc2UgewotICAg ICAgICAgICAgICAgIHAtPnBoeXNfb2Zmc2V0ID0gcGh5c19vZmZzZXQ7CisgICAgICAgICAgICAg ICAgaWYgKChwaHlzX29mZnNldCAmIElPX01FTV9ST01EKSB8fAorICAgICAgICAgICAgICAgICAg ICAocGh5c19vZmZzZXQgJiB+VEFSR0VUX1BBR0VfTUFTSykgPD0gSU9fTUVNX1VOQVNTSUdORUQp IHsKKyAgICAgICAgICAgICAgICAgICAgcC0+cGh5c19vZmZzZXQgPSBwaHlzX29mZnNldCAmCisg ICAgICAgICAgICAgICAgICAgICAgICAoVEFSR0VUX1BBR0VfTUFTSyB8ICgoMSA8PCBJT19NRU1f U0hJRlQpIC0gMSkpOworICAgICAgICAgICAgICAgICAgICBwLT5pb19pbmRleCA9IChwaHlzX29m ZnNldCAmIH5UQVJHRVRfUEFHRV9NQVNLKSA+PgorICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIElPX01FTV9TSElGVDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAg ICAgICAgICAgICBwLT5waHlzX29mZnNldCA9IHBoeXNfb2Zmc2V0ICYgKCgxIDw8IElPX01FTV9T SElGVCkgLSAxKTsKKyAgICAgICAgICAgICAgICAgICAgcC0+aW9faW5kZXggPSBwaHlzX29mZnNl dCA+PiBJT19NRU1fU0hJRlQ7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGlm ICgocGh5c19vZmZzZXQgJiB+VEFSR0VUX1BBR0VfTUFTSykgPD0gSU9fTUVNX1JPTSB8fAogICAg ICAgICAgICAgICAgICAgICAocGh5c19vZmZzZXQgJiBJT19NRU1fUk9NRCkpCiAgICAgICAgICAg ICAgICAgICAgIHBoeXNfb2Zmc2V0ICs9IFRBUkdFVF9QQUdFX1NJWkU7CiAgICAgICAgICAgICB9 CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBwID0gcGh5c19wYWdlX2ZpbmRfYWxsb2Mo YWRkciA+PiBUQVJHRVRfUEFHRV9CSVRTLCAxKTsKLSAgICAgICAgICAgIHAtPnBoeXNfb2Zmc2V0 ID0gcGh5c19vZmZzZXQ7CisgICAgICAgICAgICBpZiAoKHBoeXNfb2Zmc2V0ICYgSU9fTUVNX1JP TUQpIHx8CisgICAgICAgICAgICAgICAgKHBoeXNfb2Zmc2V0ICYgflRBUkdFVF9QQUdFX01BU0sp IDw9IElPX01FTV9VTkFTU0lHTkVEKSB7CisgICAgICAgICAgICAgICAgcC0+cGh5c19vZmZzZXQg PSBwaHlzX29mZnNldCAmCisgICAgICAgICAgICAgICAgICAgIChUQVJHRVRfUEFHRV9NQVNLIHwg KCgxIDw8IElPX01FTV9TSElGVCkgLSAxKSk7CisgICAgICAgICAgICAgICAgcC0+aW9faW5kZXgg PSAocGh5c19vZmZzZXQgJiB+VEFSR0VUX1BBR0VfTUFTSykgPj4KKyAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIElPX01FTV9TSElGVDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAg ICAgICAgICAgcC0+cGh5c19vZmZzZXQgPSBwaHlzX29mZnNldCAmICgoMSA8PCBJT19NRU1fU0hJ RlQpIC0gMSk7CisgICAgICAgICAgICAgICAgcC0+aW9faW5kZXggPSBwaHlzX29mZnNldCA+PiBJ T19NRU1fU0hJRlQ7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoKHBoeXNfb2Zmc2V0 ICYgflRBUkdFVF9QQUdFX01BU0spIDw9IElPX01FTV9ST00gfHwKICAgICAgICAgICAgICAgICAo cGh5c19vZmZzZXQgJiBJT19NRU1fUk9NRCkpCiAgICAgICAgICAgICAgICAgcGh5c19vZmZzZXQg Kz0gVEFSR0VUX1BBR0VfU0laRTsKQEAgLTIwOTMsMTAgKzIxMjIsMTAgQEAgdm9pZCBjcHVfcmVn aXN0ZXJfcGh5c2ljYWxfbWVtb3J5KHRhcmdldF9waHlzX2FkZHJfdCBzdGFydF9hZGRyLAogICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kX2FkZHIyLCBuZWVkX3N1YnBhZ2UpOwogCiAg ICAgICAgICAgICAgICAgaWYgKG5lZWRfc3VicGFnZSB8fCBwaHlzX29mZnNldCAmIElPX01FTV9T VUJXSURUSCkgewotICAgICAgICAgICAgICAgICAgICBzdWJwYWdlID0gc3VicGFnZV9pbml0KChh ZGRyICYgVEFSR0VUX1BBR0VfTUFTSyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgJnAtPnBoeXNfb2Zmc2V0LCBJT19NRU1fVU5BU1NJR05FRCk7CisgICAgICAg ICAgICAgICAgICAgIHN1YnBhZ2UgPSBzdWJwYWdlX2luaXQoKGFkZHIgJiBUQVJHRVRfUEFHRV9N QVNLKSwgcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJT19N RU1fVU5BU1NJR05FRCA+PiBJT19NRU1fU0hJRlQpOwogICAgICAgICAgICAgICAgICAgICBzdWJw YWdlX3JlZ2lzdGVyKHN1YnBhZ2UsIHN0YXJ0X2FkZHIyLCBlbmRfYWRkcjIsCi0gICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c19vZmZzZXQpOworICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIHBoeXNfb2Zmc2V0ID4+IElPX01FTV9TSElGVCk7CiAgICAg ICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC0yMTE4LDcgKzIxNDcs NyBAQCByYW1fYWRkcl90IGNwdV9nZXRfcGh5c2ljYWxfcGFnZV9kZXNjKHRhcmdldF9waHlzX2Fk ZHJfdCBhZGRyKQogICAgIHAgPSBwaHlzX3BhZ2VfZmluZChhZGRyID4+IFRBUkdFVF9QQUdFX0JJ VFMpOwogICAgIGlmICghcCkKICAgICAgICAgcmV0dXJuIElPX01FTV9VTkFTU0lHTkVEOwotICAg IHJldHVybiBwLT5waHlzX29mZnNldDsKKyAgICByZXR1cm4gcC0+cGh5c19vZmZzZXQgfCAocC0+ aW9faW5kZXggPDwgSU9fTUVNX1NISUZUKTsKIH0KIAogLyogWFhYOiBiZXR0ZXIgdGhhbiBub3Ro aW5nICovCkBAIC0yNDQwLDcgKzI0NjksNyBAQCBzdGF0aWMgQ1BVV3JpdGVNZW1vcnlGdW5jICpz dWJwYWdlX3dyaXRlW10gPSB7CiB9OwogCiBzdGF0aWMgaW50IHN1YnBhZ2VfcmVnaXN0ZXIgKHN1 YnBhZ2VfdCAqbW1pbywgdWludDMyX3Qgc3RhcnQsIHVpbnQzMl90IGVuZCwKLSAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgcmFtX2FkZHJfdCBtZW1vcnkpCisgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIGludCBtZW1vcnkpCiB7CiAgICAgaW50IGlkeCwgZWlkeDsKICAgICB1bnNpZ25l ZCBpbnQgaTsKQEAgLTI0NTMsNyArMjQ4Miw2IEBAIHN0YXRpYyBpbnQgc3VicGFnZV9yZWdpc3Rl ciAoc3VicGFnZV90ICptbWlvLCB1aW50MzJfdCBzdGFydCwgdWludDMyX3QgZW5kLAogICAgIHBy aW50ZigiJXM6ICVwIHN0YXJ0ICUwOHggZW5kICUwOHggaWR4ICUwOHggZWlkeCAlMDh4IG1lbSAl ZFxuIiwgX19mdW5jX18sCiAgICAgICAgICAgIG1taW8sIHN0YXJ0LCBlbmQsIGlkeCwgZWlkeCwg bWVtb3J5KTsKICNlbmRpZgotICAgIG1lbW9yeSA+Pj0gSU9fTUVNX1NISUZUOwogICAgIGZvciAo OyBpZHggPD0gZWlkeDsgaWR4KyspIHsKICAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykg ewogICAgICAgICAgICAgaWYgKGlvX21lbV9yZWFkW21lbW9yeV1baV0pIHsKQEAgLTI0NzAsOCAr MjQ5OCw4IEBAIHN0YXRpYyBpbnQgc3VicGFnZV9yZWdpc3RlciAoc3VicGFnZV90ICptbWlvLCB1 aW50MzJfdCBzdGFydCwgdWludDMyX3QgZW5kLAogICAgIHJldHVybiAwOwogfQogCi1zdGF0aWMg dm9pZCAqc3VicGFnZV9pbml0ICh0YXJnZXRfcGh5c19hZGRyX3QgYmFzZSwgcmFtX2FkZHJfdCAq cGh5cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbV9hZGRyX3Qgb3JpZ19tZW1vcnkp CitzdGF0aWMgdm9pZCAqc3VicGFnZV9pbml0ICh0YXJnZXRfcGh5c19hZGRyX3QgYmFzZSwgUGh5 c1BhZ2VEZXNjICpwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG9yaWdfbWVtb3J5 KQogewogICAgIHN1YnBhZ2VfdCAqbW1pbzsKICAgICBpbnQgc3VicGFnZV9tZW1vcnk7CkBAIC0y NDg0LDcgKzI1MTIsOCBAQCBzdGF0aWMgdm9pZCAqc3VicGFnZV9pbml0ICh0YXJnZXRfcGh5c19h ZGRyX3QgYmFzZSwgcmFtX2FkZHJfdCAqcGh5cywKICAgICAgICAgcHJpbnRmKCIlczogJXAgYmFz ZSAiIFRBUkdFVF9GTVRfcGx4ICIgbGVuICUwOHggJWRcbiIsIF9fZnVuY19fLAogICAgICAgICAg ICAgICAgbW1pbywgYmFzZSwgVEFSR0VUX1BBR0VfU0laRSwgc3VicGFnZV9tZW1vcnkpOwogI2Vu ZGlmCi0gICAgICAgICpwaHlzID0gc3VicGFnZV9tZW1vcnkgfCBJT19NRU1fU1VCUEFHRTsKKyAg ICAgICAgcC0+cGh5c19vZmZzZXQgPSBJT19NRU1fU1VCUEFHRTsKKyAgICAgICAgcC0+aW9faW5k ZXggPSBzdWJwYWdlX21lbW9yeSA+PiBJT19NRU1fU0hJRlQ7CiAgICAgICAgIHN1YnBhZ2VfcmVn aXN0ZXIobW1pbywgMCwgVEFSR0VUX1BBR0VfU0laRSAtIDEsIG9yaWdfbWVtb3J5KTsKICAgICB9 CiAKQEAgLTI1MjUsNyArMjU1NCwxMCBAQCBpbnQgY3B1X3JlZ2lzdGVyX2lvX21lbW9yeShpbnQg aW9faW5kZXgsCiAgICAgaWYgKGlvX2luZGV4IDw9IDApIHsKICAgICAgICAgaWYgKGlvX21lbV9u YiA+PSBJT19NRU1fTkJfRU5UUklFUykKICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAg aW9faW5kZXggPSBpb19tZW1fbmIrKzsKKyAgICAgICAgZG8KKyAgICAgICAgICAgIGlvX2luZGV4 ID0gaW9fbWVtX25iKys7CisgICAgICAgIHdoaWxlICgoKGlvX2luZGV4IDw8IElPX01FTV9TSElG VCkgJiB+VEFSR0VUX1BBR0VfTUFTSykgPD0KKyAgICAgICAgICAgICAgIElPX01FTV9VTkFTU0lH TkVEKTsKICAgICB9IGVsc2UgewogICAgICAgICBpZiAoaW9faW5kZXggPj0gSU9fTUVNX05CX0VO VFJJRVMpCiAgICAgICAgICAgICByZXR1cm4gLTE7CkBAIC0yNjExLDE0ICsyNjQzLDE1IEBAIHZv aWQgY3B1X3BoeXNpY2FsX21lbW9yeV9ydyh0YXJnZXRfcGh5c19hZGRyX3QgYWRkciwgdWludDhf dCAqYnVmLAogICAgICAgICAgICAgbCA9IGxlbjsKICAgICAgICAgcCA9IHBoeXNfcGFnZV9maW5k KHBhZ2UgPj4gVEFSR0VUX1BBR0VfQklUUyk7CiAgICAgICAgIGlmICghcCkgewotICAgICAgICAg ICAgcGQgPSBJT19NRU1fVU5BU1NJR05FRDsKKyAgICAgICAgICAgIHBkID0gMDsKKyAgICAgICAg ICAgIGlvX2luZGV4ID0gSU9fTUVNX1VOQVNTSUdORUQgPj4gSU9fTUVNX1NISUZUOwogICAgICAg ICB9IGVsc2UgewogICAgICAgICAgICAgcGQgPSBwLT5waHlzX29mZnNldDsKKyAgICAgICAgICAg IGlvX2luZGV4ID0gcC0+aW9faW5kZXg7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAoaXNfd3Jp dGUpIHsKLSAgICAgICAgICAgIGlmICgocGQgJiB+VEFSR0VUX1BBR0VfTUFTSykgIT0gSU9fTUVN X1JBTSkgewotICAgICAgICAgICAgICAgIGlvX2luZGV4ID0gKHBkID4+IElPX01FTV9TSElGVCkg JiAoSU9fTUVNX05CX0VOVFJJRVMgLSAxKTsKKyAgICAgICAgICAgIGlmIChpb19pbmRleCAhPSAo SU9fTUVNX1JBTSA+PiBJT19NRU1fU0hJRlQpKSB7CiAgICAgICAgICAgICAgICAgLyogWFhYOiBj b3VsZCBmb3JjZSBjcHVfc2luZ2xlX2VudiB0byBOVUxMIHRvIGF2b2lkCiAgICAgICAgICAgICAg ICAgICAgcG90ZW50aWFsIGJ1Z3MgKi8KICAgICAgICAgICAgICAgICBpZiAobCA+PSA0ICYmICgo YWRkciAmIDMpID09IDApKSB7CkBAIC0yNjUyLDEwICsyNjg1LDkgQEAgdm9pZCBjcHVfcGh5c2lj YWxfbWVtb3J5X3J3KHRhcmdldF9waHlzX2FkZHJfdCBhZGRyLCB1aW50OF90ICpidWYsCiAgICAg ICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewotICAgICAgICAg ICAgaWYgKChwZCAmIH5UQVJHRVRfUEFHRV9NQVNLKSA+IElPX01FTV9ST00gJiYKKyAgICAgICAg ICAgIGlmIChpb19pbmRleCAhPSAoSU9fTUVNX1JBTSA+PiBJT19NRU1fU0hJRlQpICYmCiAgICAg ICAgICAgICAgICAgIShwZCAmIElPX01FTV9ST01EKSkgewogICAgICAgICAgICAgICAgIC8qIEkv TyBjYXNlICovCi0gICAgICAgICAgICAgICAgaW9faW5kZXggPSAocGQgPj4gSU9fTUVNX1NISUZU KSAmIChJT19NRU1fTkJfRU5UUklFUyAtIDEpOwogICAgICAgICAgICAgICAgIGlmIChsID49IDQg JiYgKChhZGRyICYgMykgPT0gMCkpIHsKICAgICAgICAgICAgICAgICAgICAgLyogMzIgYml0IHJl YWQgYWNjZXNzICovCiAgICAgICAgICAgICAgICAgICAgIHZhbCA9IGlvX21lbV9yZWFkW2lvX2lu ZGV4XVsyXShpb19tZW1fb3BhcXVlW2lvX2luZGV4XSwgYWRkcik7CkBAIC0yNjg5LDcgKzI3MjEs NyBAQCB2b2lkIGNwdV9waHlzaWNhbF9tZW1vcnlfcncodGFyZ2V0X3BoeXNfYWRkcl90IGFkZHIs IHVpbnQ4X3QgKmJ1ZiwKIHZvaWQgY3B1X3BoeXNpY2FsX21lbW9yeV93cml0ZV9yb20odGFyZ2V0 X3BoeXNfYWRkcl90IGFkZHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNv bnN0IHVpbnQ4X3QgKmJ1ZiwgaW50IGxlbikKIHsKLSAgICBpbnQgbDsKKyAgICBpbnQgbCwgaW9f aW5kZXg7CiAgICAgdWludDhfdCAqcHRyOwogICAgIHRhcmdldF9waHlzX2FkZHJfdCBwYWdlOwog ICAgIHVuc2lnbmVkIGxvbmcgcGQ7CkBAIC0yNzAyLDEzICsyNzM0LDE1IEBAIHZvaWQgY3B1X3Bo eXNpY2FsX21lbW9yeV93cml0ZV9yb20odGFyZ2V0X3BoeXNfYWRkcl90IGFkZHIsCiAgICAgICAg ICAgICBsID0gbGVuOwogICAgICAgICBwID0gcGh5c19wYWdlX2ZpbmQocGFnZSA+PiBUQVJHRVRf UEFHRV9CSVRTKTsKICAgICAgICAgaWYgKCFwKSB7Ci0gICAgICAgICAgICBwZCA9IElPX01FTV9V TkFTU0lHTkVEOworICAgICAgICAgICAgcGQgPSAwOworICAgICAgICAgICAgaW9faW5kZXggPSBJ T19NRU1fVU5BU1NJR05FRCA+PiBJT19NRU1fU0hJRlQ7CiAgICAgICAgIH0gZWxzZSB7CiAgICAg ICAgICAgICBwZCA9IHAtPnBoeXNfb2Zmc2V0OworICAgICAgICAgICAgaW9faW5kZXggPSBwLT5p b19pbmRleDsKICAgICAgICAgfQogCi0gICAgICAgIGlmICgocGQgJiB+VEFSR0VUX1BBR0VfTUFT SykgIT0gSU9fTUVNX1JBTSAmJgotICAgICAgICAgICAgKHBkICYgflRBUkdFVF9QQUdFX01BU0sp ICE9IElPX01FTV9ST00gJiYKKyAgICAgICAgaWYgKGlvX2luZGV4ICE9IChJT19NRU1fUkFNID4+ IElPX01FTV9TSElGVCkgJiYKKyAgICAgICAgICAgIGlvX2luZGV4ICE9IChJT19NRU1fUk9NID4+ IElPX01FTV9TSElGVCkgJiYKICAgICAgICAgICAgICEocGQgJiBJT19NRU1fUk9NRCkpIHsKICAg ICAgICAgICAgIC8qIGRvIG5vdGhpbmcgKi8KICAgICAgICAgfSBlbHNlIHsKQEAgLTI3MzYsMTUg KzI3NzAsMTYgQEAgdWludDMyX3QgbGRsX3BoeXModGFyZ2V0X3BoeXNfYWRkcl90IGFkZHIpCiAK ICAgICBwID0gcGh5c19wYWdlX2ZpbmQoYWRkciA+PiBUQVJHRVRfUEFHRV9CSVRTKTsKICAgICBp ZiAoIXApIHsKLSAgICAgICAgcGQgPSBJT19NRU1fVU5BU1NJR05FRDsKKyAgICAgICAgcGQgPSAw OworICAgICAgICBpb19pbmRleCA9IElPX01FTV9VTkFTU0lHTkVEID4+IElPX01FTV9TSElGVDsK ICAgICB9IGVsc2UgewogICAgICAgICBwZCA9IHAtPnBoeXNfb2Zmc2V0OworICAgICAgICBpb19p bmRleCA9IHAtPmlvX2luZGV4OwogICAgIH0KIAotICAgIGlmICgocGQgJiB+VEFSR0VUX1BBR0Vf TUFTSykgPiBJT19NRU1fUk9NICYmCisgICAgaWYgKGlvX2luZGV4ID4gKElPX01FTV9ST00gPj4g SU9fTUVNX1NISUZUKSAmJgogICAgICAgICAhKHBkICYgSU9fTUVNX1JPTUQpKSB7CiAgICAgICAg IC8qIEkvTyBjYXNlICovCi0gICAgICAgIGlvX2luZGV4ID0gKHBkID4+IElPX01FTV9TSElGVCkg JiAoSU9fTUVNX05CX0VOVFJJRVMgLSAxKTsKICAgICAgICAgdmFsID0gaW9fbWVtX3JlYWRbaW9f aW5kZXhdWzJdKGlvX21lbV9vcGFxdWVbaW9faW5kZXhdLCBhZGRyKTsKICAgICB9IGVsc2Ugewog ICAgICAgICAvKiBSQU0gY2FzZSAqLwpAQCAtMjc2NiwxNSArMjgwMSwxNiBAQCB1aW50NjRfdCBs ZHFfcGh5cyh0YXJnZXRfcGh5c19hZGRyX3QgYWRkcikKIAogICAgIHAgPSBwaHlzX3BhZ2VfZmlu ZChhZGRyID4+IFRBUkdFVF9QQUdFX0JJVFMpOwogICAgIGlmICghcCkgewotICAgICAgICBwZCA9 IElPX01FTV9VTkFTU0lHTkVEOworICAgICAgICBwZCA9IDA7CisgICAgICAgIGlvX2luZGV4ID0g SU9fTUVNX1VOQVNTSUdORUQgPj4gSU9fTUVNX1NISUZUOwogICAgIH0gZWxzZSB7CiAgICAgICAg IHBkID0gcC0+cGh5c19vZmZzZXQ7CisgICAgICAgIGlvX2luZGV4ID0gcC0+aW9faW5kZXg7CiAg ICAgfQogCi0gICAgaWYgKChwZCAmIH5UQVJHRVRfUEFHRV9NQVNLKSA+IElPX01FTV9ST00gJiYK KyAgICBpZiAoaW9faW5kZXggPiAoSU9fTUVNX1JPTSA+PiBJT19NRU1fU0hJRlQpICYmCiAgICAg ICAgICEocGQgJiBJT19NRU1fUk9NRCkpIHsKICAgICAgICAgLyogSS9PIGNhc2UgKi8KLSAgICAg ICAgaW9faW5kZXggPSAocGQgPj4gSU9fTUVNX1NISUZUKSAmIChJT19NRU1fTkJfRU5UUklFUyAt IDEpOwogI2lmZGVmIFRBUkdFVF9XT1JEU19CSUdFTkRJQU4KICAgICAgICAgdmFsID0gKHVpbnQ2 NF90KWlvX21lbV9yZWFkW2lvX2luZGV4XVsyXShpb19tZW1fb3BhcXVlW2lvX2luZGV4XSwgYWRk cikgPDwgMzI7CiAgICAgICAgIHZhbCB8PSBpb19tZW1fcmVhZFtpb19pbmRleF1bMl0oaW9fbWVt X29wYXF1ZVtpb19pbmRleF0sIGFkZHIgKyA0KTsKQEAgLTI4MTksMTMgKzI4NTUsMTQgQEAgdm9p ZCBzdGxfcGh5c19ub3RkaXJ0eSh0YXJnZXRfcGh5c19hZGRyX3QgYWRkciwgdWludDMyX3QgdmFs KQogCiAgICAgcCA9IHBoeXNfcGFnZV9maW5kKGFkZHIgPj4gVEFSR0VUX1BBR0VfQklUUyk7CiAg ICAgaWYgKCFwKSB7Ci0gICAgICAgIHBkID0gSU9fTUVNX1VOQVNTSUdORUQ7CisgICAgICAgIHBk ID0gMDsKKyAgICAgICAgaW9faW5kZXggPSBJT19NRU1fVU5BU1NJR05FRCA+PiBJT19NRU1fU0hJ RlQ7CiAgICAgfSBlbHNlIHsKICAgICAgICAgcGQgPSBwLT5waHlzX29mZnNldDsKKyAgICAgICAg aW9faW5kZXggPSBwLT5pb19pbmRleDsKICAgICB9CiAKLSAgICBpZiAoKHBkICYgflRBUkdFVF9Q QUdFX01BU0spICE9IElPX01FTV9SQU0pIHsKLSAgICAgICAgaW9faW5kZXggPSAocGQgPj4gSU9f TUVNX1NISUZUKSAmIChJT19NRU1fTkJfRU5UUklFUyAtIDEpOworICAgIGlmIChpb19pbmRleCAh PSAoSU9fTUVNX1JBTSA+PiBJT19NRU1fU0hJRlQpKSB7CiAgICAgICAgIGlvX21lbV93cml0ZVtp b19pbmRleF1bMl0oaW9fbWVtX29wYXF1ZVtpb19pbmRleF0sIGFkZHIsIHZhbCk7CiAgICAgfSBl bHNlIHsKICAgICAgICAgcHRyID0gcGh5c19yYW1fYmFzZSArIChwZCAmIFRBUkdFVF9QQUdFX01B U0spICsKQEAgLTI4NDMsMTMgKzI4ODAsMTQgQEAgdm9pZCBzdHFfcGh5c19ub3RkaXJ0eSh0YXJn ZXRfcGh5c19hZGRyX3QgYWRkciwgdWludDY0X3QgdmFsKQogCiAgICAgcCA9IHBoeXNfcGFnZV9m aW5kKGFkZHIgPj4gVEFSR0VUX1BBR0VfQklUUyk7CiAgICAgaWYgKCFwKSB7Ci0gICAgICAgIHBk ID0gSU9fTUVNX1VOQVNTSUdORUQ7CisgICAgICAgIHBkID0gMDsKKyAgICAgICAgaW9faW5kZXgg PSBJT19NRU1fVU5BU1NJR05FRCA+PiBJT19NRU1fU0hJRlQ7CiAgICAgfSBlbHNlIHsKICAgICAg ICAgcGQgPSBwLT5waHlzX29mZnNldDsKKyAgICAgICAgaW9faW5kZXggPSBwLT5pb19pbmRleDsK ICAgICB9CiAKLSAgICBpZiAoKHBkICYgflRBUkdFVF9QQUdFX01BU0spICE9IElPX01FTV9SQU0p IHsKLSAgICAgICAgaW9faW5kZXggPSAocGQgPj4gSU9fTUVNX1NISUZUKSAmIChJT19NRU1fTkJf RU5UUklFUyAtIDEpOworICAgIGlmIChpb19pbmRleCAhPSAoSU9fTUVNX1JBTSA+PiBJT19NRU1f U0hJRlQpKSB7CiAjaWZkZWYgVEFSR0VUX1dPUkRTX0JJR0VORElBTgogICAgICAgICBpb19tZW1f d3JpdGVbaW9faW5kZXhdWzJdKGlvX21lbV9vcGFxdWVbaW9faW5kZXhdLCBhZGRyLCB2YWwgPj4g MzIpOwogICAgICAgICBpb19tZW1fd3JpdGVbaW9faW5kZXhdWzJdKGlvX21lbV9vcGFxdWVbaW9f aW5kZXhdLCBhZGRyICsgNCwgdmFsKTsKQEAgLTI4NzQsMTMgKzI5MTIsMTQgQEAgdm9pZCBzdGxf cGh5cyh0YXJnZXRfcGh5c19hZGRyX3QgYWRkciwgdWludDMyX3QgdmFsKQogCiAgICAgcCA9IHBo eXNfcGFnZV9maW5kKGFkZHIgPj4gVEFSR0VUX1BBR0VfQklUUyk7CiAgICAgaWYgKCFwKSB7Ci0g ICAgICAgIHBkID0gSU9fTUVNX1VOQVNTSUdORUQ7CisgICAgICAgIHBkID0gMDsKKyAgICAgICAg aW9faW5kZXggPSBJT19NRU1fVU5BU1NJR05FRCA+PiBJT19NRU1fU0hJRlQ7CiAgICAgfSBlbHNl IHsKICAgICAgICAgcGQgPSBwLT5waHlzX29mZnNldDsKKyAgICAgICAgaW9faW5kZXggPSBwLT5p b19pbmRleDsKICAgICB9CiAKLSAgICBpZiAoKHBkICYgflRBUkdFVF9QQUdFX01BU0spICE9IElP X01FTV9SQU0pIHsKLSAgICAgICAgaW9faW5kZXggPSAocGQgPj4gSU9fTUVNX1NISUZUKSAmIChJ T19NRU1fTkJfRU5UUklFUyAtIDEpOworICAgIGlmIChpb19pbmRleCAhPSAoSU9fTUVNX1JBTSA+ PiBJT19NRU1fU0hJRlQpKSB7CiAgICAgICAgIGlvX21lbV93cml0ZVtpb19pbmRleF1bMl0oaW9f bWVtX29wYXF1ZVtpb19pbmRleF0sIGFkZHIsIHZhbCk7CiAgICAgfSBlbHNlIHsKICAgICAgICAg dW5zaWduZWQgbG9uZyBhZGRyMTsKZGlmZiAtLWdpdCBhL3NvZnRtbXVfdGVtcGxhdGUuaCBiL3Nv ZnRtbXVfdGVtcGxhdGUuaAppbmRleCAwYTRiYzdlLi5iMTA4ZDczIDEwMDY0NAotLS0gYS9zb2Z0 bW11X3RlbXBsYXRlLmgKKysrIGIvc29mdG1tdV90ZW1wbGF0ZS5oCkBAIC01MSwxMiArNTEsMTAg QEAgc3RhdGljIERBVEFfVFlQRSBnbHVlKGdsdWUoc2xvd19sZCwgU1VGRklYKSwgTU1VU1VGRklY KSh0YXJnZXRfdWxvbmcgYWRkciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgaW50IG1tdV9pZHgsCiAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnJldGFkZHIpOwogc3RhdGlj IGlubGluZSBEQVRBX1RZUEUgZ2x1ZShpb19yZWFkLCBTVUZGSVgpKHRhcmdldF9waHlzX2FkZHJf dCBwaHlzYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICB0YXJnZXRfdWxvbmcgdGxiX2FkZHIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgaW50IGluZGV4KQogewogICAgIERBVEFfVFlQRSByZXM7Ci0gICAgaW50 IGluZGV4OwogCi0gICAgaW5kZXggPSAodGxiX2FkZHIgPj4gSU9fTUVNX1NISUZUKSAmIChJT19N RU1fTkJfRU5UUklFUyAtIDEpOwogI2lmIFNISUZUIDw9IDIKICAgICByZXMgPSBpb19tZW1fcmVh ZFtpbmRleF1bU0hJRlRdKGlvX21lbV9vcGFxdWVbaW5kZXhdLCBwaHlzYWRkcik7CiAjZWxzZQpA QCAtOTUsNyArOTMsOCBAQCBEQVRBX1RZUEUgUkVHUEFSTSBnbHVlKGdsdWUoX19sZCwgU1VGRklY KSwgTU1VU1VGRklYKSh0YXJnZXRfdWxvbmcgYWRkciwKICAgICAgICAgICAgIC8qIElPIGFjY2Vz cyAqLwogICAgICAgICAgICAgaWYgKChhZGRyICYgKERBVEFfU0laRSAtIDEpKSAhPSAwKQogICAg ICAgICAgICAgICAgIGdvdG8gZG9fdW5hbGlnbmVkX2FjY2VzczsKLSAgICAgICAgICAgIHJlcyA9 IGdsdWUoaW9fcmVhZCwgU1VGRklYKShwaHlzYWRkciwgdGxiX2FkZHIpOworICAgICAgICAgICAg cmVzID0gZ2x1ZShpb19yZWFkLCBTVUZGSVgpKHBoeXNhZGRyLAorICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIGVudi0+dGxiX3RhYmxlW21tdV9pZHhdW2luZGV4XS5pb19p bmRleCk7CiAgICAgICAgIH0gZWxzZSBpZiAoKChhZGRyICYgflRBUkdFVF9QQUdFX01BU0spICsg REFUQV9TSVpFIC0gMSkgPj0gVEFSR0VUX1BBR0VfU0laRSkgewogICAgICAgICAgICAgLyogc2xv dyB1bmFsaWduZWQgYWNjZXNzIChpdCBzcGFucyB0d28gcGFnZXMgb3IgSU8pICovCiAgICAgICAg IGRvX3VuYWxpZ25lZF9hY2Nlc3M6CkBAIC0xNDcsNyArMTQ2LDggQEAgc3RhdGljIERBVEFfVFlQ RSBnbHVlKGdsdWUoc2xvd19sZCwgU1VGRklYKSwgTU1VU1VGRklYKSh0YXJnZXRfdWxvbmcgYWRk ciwKICAgICAgICAgICAgIC8qIElPIGFjY2VzcyAqLwogICAgICAgICAgICAgaWYgKChhZGRyICYg KERBVEFfU0laRSAtIDEpKSAhPSAwKQogICAgICAgICAgICAgICAgIGdvdG8gZG9fdW5hbGlnbmVk X2FjY2VzczsKLSAgICAgICAgICAgIHJlcyA9IGdsdWUoaW9fcmVhZCwgU1VGRklYKShwaHlzYWRk ciwgdGxiX2FkZHIpOworICAgICAgICAgICAgcmVzID0gZ2x1ZShpb19yZWFkLCBTVUZGSVgpKHBo eXNhZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudi0+dGxi X3RhYmxlW21tdV9pZHhdW2luZGV4XS5pb19pbmRleCk7CiAgICAgICAgIH0gZWxzZSBpZiAoKChh ZGRyICYgflRBUkdFVF9QQUdFX01BU0spICsgREFUQV9TSVpFIC0gMSkgPj0gVEFSR0VUX1BBR0Vf U0laRSkgewogICAgICAgICBkb191bmFsaWduZWRfYWNjZXNzOgogICAgICAgICAgICAgLyogc2xv dyB1bmFsaWduZWQgYWNjZXNzIChpdCBzcGFucyB0d28gcGFnZXMpICovCkBAIC0xODYsMTEgKzE4 Niw5IEBAIHN0YXRpYyB2b2lkIGdsdWUoZ2x1ZShzbG93X3N0LCBTVUZGSVgpLCBNTVVTVUZGSVgp KHRhcmdldF91bG9uZyBhZGRyLAogc3RhdGljIGlubGluZSB2b2lkIGdsdWUoaW9fd3JpdGUsIFNV RkZJWCkodGFyZ2V0X3BoeXNfYWRkcl90IHBoeXNhZGRyLAogICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgREFUQV9UWVBFIHZhbCwKICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIHRhcmdldF91bG9uZyB0bGJfYWRkciwKKyAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCwKICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnJldGFkZHIpCiB7Ci0gICAgaW50IGlu ZGV4OwotCi0gICAgaW5kZXggPSAodGxiX2FkZHIgPj4gSU9fTUVNX1NISUZUKSAmIChJT19NRU1f TkJfRU5UUklFUyAtIDEpOwogICAgIGVudi0+bWVtX3dyaXRlX3ZhZGRyID0gdGxiX2FkZHI7CiAg ICAgZW52LT5tZW1fd3JpdGVfcGMgPSAodW5zaWduZWQgbG9uZylyZXRhZGRyOwogI2lmIFNISUZU IDw9IDIKQEAgLTIyOCw3ICsyMjYsOSBAQCB2b2lkIFJFR1BBUk0gZ2x1ZShnbHVlKF9fc3QsIFNV RkZJWCksIE1NVVNVRkZJWCkodGFyZ2V0X3Vsb25nIGFkZHIsCiAgICAgICAgICAgICBpZiAoKGFk ZHIgJiAoREFUQV9TSVpFIC0gMSkpICE9IDApCiAgICAgICAgICAgICAgICAgZ290byBkb191bmFs aWduZWRfYWNjZXNzOwogICAgICAgICAgICAgcmV0YWRkciA9IEdFVFBDKCk7Ci0gICAgICAgICAg ICBnbHVlKGlvX3dyaXRlLCBTVUZGSVgpKHBoeXNhZGRyLCB2YWwsIHRsYl9hZGRyLCByZXRhZGRy KTsKKyAgICAgICAgICAgIGdsdWUoaW9fd3JpdGUsIFNVRkZJWCkocGh5c2FkZHIsIHZhbCwgdGxi X2FkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudi0+dGxiX3RhYmxl W21tdV9pZHhdW2luZGV4XS5pb19pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgcmV0YWRkcik7CiAgICAgICAgIH0gZWxzZSBpZiAoKChhZGRyICYgflRBUkdFVF9QQUdF X01BU0spICsgREFUQV9TSVpFIC0gMSkgPj0gVEFSR0VUX1BBR0VfU0laRSkgewogICAgICAgICBk b191bmFsaWduZWRfYWNjZXNzOgogICAgICAgICAgICAgcmV0YWRkciA9IEdFVFBDKCk7CkBAIC0y NzgsNyArMjc4LDkgQEAgc3RhdGljIHZvaWQgZ2x1ZShnbHVlKHNsb3dfc3QsIFNVRkZJWCksIE1N VVNVRkZJWCkodGFyZ2V0X3Vsb25nIGFkZHIsCiAgICAgICAgICAgICAvKiBJTyBhY2Nlc3MgKi8K ICAgICAgICAgICAgIGlmICgoYWRkciAmIChEQVRBX1NJWkUgLSAxKSkgIT0gMCkKICAgICAgICAg ICAgICAgICBnb3RvIGRvX3VuYWxpZ25lZF9hY2Nlc3M7Ci0gICAgICAgICAgICBnbHVlKGlvX3dy aXRlLCBTVUZGSVgpKHBoeXNhZGRyLCB2YWwsIHRsYl9hZGRyLCByZXRhZGRyKTsKKyAgICAgICAg ICAgIGdsdWUoaW9fd3JpdGUsIFNVRkZJWCkocGh5c2FkZHIsIHZhbCwgdGxiX2FkZHIsCisgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudi0+dGxiX3RhYmxlW21tdV9pZHhdW2lu ZGV4XS5pb19pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0YWRk cik7CiAgICAgICAgIH0gZWxzZSBpZiAoKChhZGRyICYgflRBUkdFVF9QQUdFX01BU0spICsgREFU QV9TSVpFIC0gMSkgPj0gVEFSR0VUX1BBR0VfU0laRSkgewogICAgICAgICBkb191bmFsaWduZWRf YWNjZXNzOgogICAgICAgICAgICAgLyogWFhYOiBub3QgZWZmaWNpZW50LCBidXQgc2ltcGxlICov Cg== ------=_Part_1035_14516935.1210519216292--