From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 15365 invoked by alias); 31 Jan 2012 09:47:08 -0000 Received: (qmail 15321 invoked by uid 22791); 31 Jan 2012 09:47:05 -0000 X-SWARE-Spam-Status: No, hits=-1.7 required=5.0 tests=AWL,BAYES_00,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,FREEMAIL_ENVFROM_END_DIGIT,FREEMAIL_FROM,RCVD_IN_DNSWL_LOW,TW_IB,TW_JN X-Spam-Check-By: sourceware.org Received: from mail-tul01m020-f175.google.com (HELO mail-tul01m020-f175.google.com) (209.85.214.175) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Tue, 31 Jan 2012 09:46:49 +0000 Received: by obhx4 with SMTP id x4so304088obh.20 for ; Tue, 31 Jan 2012 01:46:48 -0800 (PST) MIME-Version: 1.0 Received: by 10.182.38.7 with SMTP id c7mr34571981obk.44.1328003208596; Tue, 31 Jan 2012 01:46:48 -0800 (PST) Received: by 10.182.60.232 with HTTP; Tue, 31 Jan 2012 01:46:48 -0800 (PST) In-Reply-To: References: Date: Tue, 31 Jan 2012 10:08:00 -0000 Message-ID: Subject: Re: [Bug libgcj/51500] [4.7 regression] 106 unexpected libjava testsuite failures with mingw32 From: Kai Tietz To: ubizjak at gmail dot com Cc: gcc-bugs@gcc.gnu.org Content-Type: multipart/mixed; boundary=f46d0447f28c824d8104b7cfd786 X-IsSubscribed: yes Mailing-List: contact gcc-bugs-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Archive: List-Post: List-Help: Sender: gcc-bugs-owner@gcc.gnu.org X-SW-Source: 2012-01/txt/msg03638.txt.bz2 --f46d0447f28c824d8104b7cfd786 Content-Type: text/plain; charset=ISO-8859-1 Content-length: 8010 Ok, here is a variant treating stack-alignment for closure. ChangeLog 2012-01-31 Kai Tietz * src/prep_cif.c (ffi_prep_cif): Allow for X86_WIN32 also FFI_THISCALL. * src/x86/ffi.c (ffi_closure_THISCALL): Add prototype. (FFI_INIT_TRAMPOLINE_THISCALL): New trampoline code. (ffi_prep_closure_loc): Add FFI_THISCALL support. * src/x86/ffitarget.h (FFI_TRAMPOLINE_SIZE): Adjust size. * src/x86/win32.S (ffi_closure_THISCALL): New closure code for thiscall-calling convention. * testsuite/libffi.call/closure_thiscall.c: New test. Index: gcc/libffi/src/prep_cif.c =================================================================== --- gcc.orig/libffi/src/prep_cif.c +++ gcc/libffi/src/prep_cif.c @@ -93,7 +93,12 @@ ffi_status ffi_prep_cif(ffi_cif *cif, ff ffi_type **ptr; FFI_ASSERT(cif != NULL); +#ifndef X86_WIN32 FFI_ASSERT((abi > FFI_FIRST_ABI) && (abi <= FFI_DEFAULT_ABI)); +#else + FFI_ASSERT(abi > FFI_FIRST_ABI && abi <= FFI_DEFAULT_ABI + || abi == FFI_THISCALL); +#endif cif->abi = abi; cif->arg_types = atypes; Index: gcc/libffi/src/x86/ffi.c =================================================================== --- gcc.orig/libffi/src/x86/ffi.c +++ gcc/libffi/src/x86/ffi.c @@ -449,6 +449,8 @@ void FFI_HIDDEN ffi_closure_raw_SYSV (ff #ifdef X86_WIN32 void FFI_HIDDEN ffi_closure_STDCALL (ffi_closure *) __attribute__ ((regparm(1))); +void FFI_HIDDEN ffi_closure_THISCALL (ffi_closure *) + __attribute__ ((regparm(1))); #endif #ifdef X86_WIN64 void FFI_HIDDEN ffi_closure_win64 (ffi_closure *); @@ -608,6 +610,33 @@ ffi_prep_incoming_args_SYSV(char *stack, *(unsigned int*) &__tramp[6] = __dis; /* jmp __fun */ \ } +#define FFI_INIT_TRAMPOLINE_THISCALL(TRAMP,FUN,CTX,SIZE) \ +{ unsigned char *__tramp = (unsigned char*)(TRAMP); \ + unsigned int __fun = (unsigned int)(FUN); \ + unsigned int __ctx = (unsigned int)(CTX); \ + unsigned int __dis = __fun - (__ctx + 22); \ + unsigned short __size = (unsigned short)(SIZE); \ + *(unsigned int *) &__tramp[0] = 0x8324048b; /* mov (%esp), %eax */ \ + *(unsigned int *) &__tramp[4] = 0x4c8910ec; /* sub $16, %esp */ \ + *(unsigned int *) &__tramp[8] = 0x04890424; /* mov %ecx, 4(%esp) */ \ + *(unsigned char*) &__tramp[12] = 0x24; /* mov %eax, (%esp) */ \ + *(unsigned char*) &__tramp[13] = 0xb8; \ + *(unsigned int *) &__tramp[14] = __size; /* mov __size, %eax */ \ + *(unsigned int *) &__tramp[18] = 0x08244c8d; /* lea 8(%esp), %ecx */ \ + *(unsigned int *) &__tramp[22] = 0x4802e8c1; /* shr $2, %eax ; dec %eax */ \ + *(unsigned short*) &__tramp[26] = 0x0b74; /* jz 1f */ \ + *(unsigned int *) &__tramp[28] = 0x890c518b; /* 2b: mov 12(%eax), %edx */ \ + *(unsigned int *) &__tramp[32] = 0x04c18311; /* mov %edx, (%ecx) ; add $4, %edx */ \ + *(unsigned char*) &__tramp[36] = 0x48; /* dec %eax */ \ + *(unsigned short*) &__tramp[37] = 0xf575; /* jnz 2b ; 1f: */ \ + *(unsigned char*) &__tramp[39] = 0xb8; \ + *(unsigned int*) &__tramp[40] = __ctx; /* movl __ctx, %eax */ \ + *(unsigned char *) &__tramp[44] = 0xe8; \ + *(unsigned int*) &__tramp[45] = __dis; /* call __fun */ \ + *(unsigned char*) &__tramp[49] = 0xc2; /* ret */ \ + *(unsigned short*) &__tramp[50] = (__size + 12); /* ret (__size + 12) */ \ + } + #define FFI_INIT_TRAMPOLINE_STDCALL(TRAMP,FUN,CTX,SIZE) \ { unsigned char *__tramp = (unsigned char*)(TRAMP); \ unsigned int __fun = (unsigned int)(FUN); \ @@ -650,6 +679,13 @@ ffi_prep_closure_loc (ffi_closure* closu (void*)codeloc); } #ifdef X86_WIN32 + else if (cif->abi == FFI_THISCALL) + { + FFI_INIT_TRAMPOLINE_THISCALL (&closure->tramp[0], + &ffi_closure_THISCALL, + (void*)codeloc, + cif->bytes); + } else if (cif->abi == FFI_STDCALL) { FFI_INIT_TRAMPOLINE_STDCALL (&closure->tramp[0], Index: gcc/libffi/src/x86/ffitarget.h =================================================================== --- gcc.orig/libffi/src/x86/ffitarget.h +++ gcc/libffi/src/x86/ffitarget.h @@ -103,7 +103,7 @@ typedef enum ffi_abi { #define FFI_NATIVE_RAW_API 0 #else #ifdef X86_WIN32 -#define FFI_TRAMPOLINE_SIZE 13 +#define FFI_TRAMPOLINE_SIZE 52 #else #ifdef X86_WIN64 #define FFI_TRAMPOLINE_SIZE 29 Index: gcc/libffi/src/x86/win32.S =================================================================== --- gcc.orig/libffi/src/x86/win32.S +++ gcc/libffi/src/x86/win32.S @@ -170,6 +170,16 @@ ca_epilogue: ret ffi_call_win32 ENDP +ffi_closure_THISCALL PROC NEAR FORCEFRAME + push ebp + mov ebp, esp + sub esp, 40 + lea edx, [ebp -24] + mov [ebp - 12], edx /* resp */ + lea edx, [ebp + 12] /* account for stub return address on stack */ + jmp stub +ffi_closure_THISCALL ENDP + ffi_closure_SYSV PROC NEAR FORCEFRAME ;; the ffi_closure ctx is passed in eax by the trampoline. @@ -177,6 +187,7 @@ ffi_closure_SYSV PROC NEAR FORCEFRAME lea edx, [ebp - 24] mov [ebp - 12], edx ;; resp lea edx, [ebp + 8] +stub: mov [esp + 8], edx ;; args lea edx, [ebp - 12] mov [esp + 4], edx ;; &resp @@ -573,6 +584,19 @@ _ffi_call_win32: popl %ebp ret .ffi_call_win32_end: + .balign 16 + .globl _ffi_closure_THISCALL +#ifndef __OS2__ + .def _ffi_closure_THISCALL; .scl 2; .type 32; .endef +#endif +_ffi_closure_THISCALL: + pushl %ebp + movl %esp, %ebp + subl $40, %esp + leal -24(%ebp), %edx + movl %edx, -12(%ebp) /* resp */ + leal 12(%ebp), %edx /* account for stub return address on stack */ + jmp .stub .LFE1: # This assumes we are using gas. @@ -591,6 +615,7 @@ _ffi_closure_SYSV: leal -24(%ebp), %edx movl %edx, -12(%ebp) /* resp */ leal 8(%ebp), %edx +.stub: movl %edx, 4(%esp) /* args = __builtin_dwarf_cfa () */ leal -12(%ebp), %edx movl %edx, (%esp) /* &resp */ Index: gcc/libffi/testsuite/libffi.call/closure_thiscall.c =================================================================== --- /dev/null +++ gcc/libffi/testsuite/libffi.call/closure_thiscall.c @@ -0,0 +1,64 @@ +/* Area: closure_call (thiscall convention) + Purpose: Check handling when caller expects thiscall callee + Limitations: none. + PR: none. + Originator: */ + +/* { dg-do run { target i?86-*-cygwin* i?86-*-mingw* } } */ +#include "ffitest.h" + +static void +closure_test_thiscall(ffi_cif* cif __UNUSED__, void* resp, void** args, + void* userdata) +{ + *(ffi_arg*)resp = + (int)*(int *)args[0] + (int)(*(int *)args[1]) + + (int)(*(int *)args[2]) + (int)(*(int *)args[3]) + + (int)(intptr_t)userdata; + + printf("%d %d %d %d: %d\n", + (int)*(int *)args[0], (int)(*(int *)args[1]), + (int)(*(int *)args[2]), (int)(*(int *)args[3]), + (int)*(ffi_arg *)resp); + +} + +typedef int (__thiscall *closure_test_type0)(int, int, int, int); + +int main (void) +{ + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + ffi_type * cl_arg_types[17]; + int res; + void* sp_pre; + void* sp_post; + char buf[1024]; + + cl_arg_types[0] = &ffi_type_uint; + cl_arg_types[1] = &ffi_type_uint; + cl_arg_types[2] = &ffi_type_uint; + cl_arg_types[3] = &ffi_type_uint; + cl_arg_types[4] = NULL; + + /* Initialize the cif */ + CHECK(ffi_prep_cif(&cif, FFI_THISCALL, 4, + &ffi_type_sint, cl_arg_types) == FFI_OK); + + CHECK(ffi_prep_closure_loc(pcl, &cif, closure_test_thiscall, + (void *) 3 /* userdata */, code) == FFI_OK); + + asm volatile (" movl %%esp,%0" : "=g" (sp_pre)); + res = (*(closure_test_type0)code)(0, 1, 2, 3); + asm volatile (" movl %%esp,%0" : "=g" (sp_post)); + /* { dg-output "0 1 2 3: 9" } */ + + printf("res: %d\n",res); + /* { dg-output "\nres: 9" } */ + + sprintf(buf, "mismatch: pre=%p vs post=%p", sp_pre, sp_post); + printf("stack pointer %s\n", (sp_pre == sp_post ? "match" : buf)); + /* { dg-output "\nstack pointer match" } */ + exit(0); +} --f46d0447f28c824d8104b7cfd786 Content-Type: text/plain; charset=US-ASCII; name="pr51500_libffi_tc_closure.txt" Content-Disposition: attachment; filename="pr51500_libffi_tc_closure.txt" Content-Transfer-Encoding: base64 X-Attachment-Id: f_gy2qtjm30 Content-length: 10785 Q2hhbmdlTG9nCgoyMDEyLTAxLTMxICBLYWkgVGlldHogIDxrdGlldHpAcmVk aGF0LmNvbT4KCgkqIHNyYy9wcmVwX2NpZi5jIChmZmlfcHJlcF9jaWYpOiBB bGxvdyBmb3IgWDg2X1dJTjMyCglhbHNvIEZGSV9USElTQ0FMTC4KCSogc3Jj L3g4Ni9mZmkuYyAoZmZpX2Nsb3N1cmVfVEhJU0NBTEwpOiBBZGQgcHJvdG90 eXBlLgoJKEZGSV9JTklUX1RSQU1QT0xJTkVfVEhJU0NBTEwpOiBOZXcgdHJh bXBvbGluZSBjb2RlLgoJKGZmaV9wcmVwX2Nsb3N1cmVfbG9jKTogQWRkIEZG SV9USElTQ0FMTCBzdXBwb3J0LgoJKiBzcmMveDg2L2ZmaXRhcmdldC5oIChG RklfVFJBTVBPTElORV9TSVpFKTogQWRqdXN0IHNpemUuCgkqIHNyYy94ODYv d2luMzIuUyAoZmZpX2Nsb3N1cmVfVEhJU0NBTEwpOiBOZXcgY2xvc3VyZSBj b2RlCglmb3IgdGhpc2NhbGwtY2FsbGluZyBjb252ZW50aW9uLgoJKiB0ZXN0 c3VpdGUvbGliZmZpLmNhbGwvY2xvc3VyZV90aGlzY2FsbC5jOiBOZXcgdGVz dC4KCkluZGV4OiBnY2MvbGliZmZpL3NyYy9wcmVwX2NpZi5jCj09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT0KLS0tIGdjYy5vcmlnL2xpYmZmaS9zcmMvcHJlcF9j aWYuYworKysgZ2NjL2xpYmZmaS9zcmMvcHJlcF9jaWYuYwpAQCAtOTMsNyAr OTMsMTIgQEAgZmZpX3N0YXR1cyBmZmlfcHJlcF9jaWYoZmZpX2NpZiAqY2lm LCBmZgogICBmZmlfdHlwZSAqKnB0cjsKIAogICBGRklfQVNTRVJUKGNpZiAh PSBOVUxMKTsKKyNpZm5kZWYgWDg2X1dJTjMyCiAgIEZGSV9BU1NFUlQoKGFi aSA+IEZGSV9GSVJTVF9BQkkpICYmIChhYmkgPD0gRkZJX0RFRkFVTFRfQUJJ KSk7CisjZWxzZQorICBGRklfQVNTRVJUKGFiaSA+IEZGSV9GSVJTVF9BQkkg JiYgYWJpIDw9IEZGSV9ERUZBVUxUX0FCSQorCSAgICAgfHwgYWJpID09IEZG SV9USElTQ0FMTCk7CisjZW5kaWYKIAogICBjaWYtPmFiaSA9IGFiaTsKICAg Y2lmLT5hcmdfdHlwZXMgPSBhdHlwZXM7CkluZGV4OiBnY2MvbGliZmZpL3Ny Yy94ODYvZmZpLmMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gZ2NjLm9y aWcvbGliZmZpL3NyYy94ODYvZmZpLmMKKysrIGdjYy9saWJmZmkvc3JjL3g4 Ni9mZmkuYwpAQCAtNDQ5LDYgKzQ0OSw4IEBAIHZvaWQgRkZJX0hJRERFTiBm ZmlfY2xvc3VyZV9yYXdfU1lTViAoZmYKICNpZmRlZiBYODZfV0lOMzIKIHZv aWQgRkZJX0hJRERFTiBmZmlfY2xvc3VyZV9TVERDQUxMIChmZmlfY2xvc3Vy ZSAqKQogICAgICBfX2F0dHJpYnV0ZV9fICgocmVncGFybSgxKSkpOwordm9p ZCBGRklfSElEREVOIGZmaV9jbG9zdXJlX1RISVNDQUxMIChmZmlfY2xvc3Vy ZSAqKQorICAgICBfX2F0dHJpYnV0ZV9fICgocmVncGFybSgxKSkpOwogI2Vu ZGlmCiAjaWZkZWYgWDg2X1dJTjY0CiB2b2lkIEZGSV9ISURERU4gZmZpX2Ns b3N1cmVfd2luNjQgKGZmaV9jbG9zdXJlICopOwpAQCAtNjA4LDYgKzYxMCwz MyBAQCBmZmlfcHJlcF9pbmNvbWluZ19hcmdzX1NZU1YoY2hhciAqc3RhY2ss CiAgICAqKHVuc2lnbmVkIGludCopICAmX190cmFtcFs2XSA9IF9fZGlzOyAv KiBqbXAgX19mdW4gICovIFwKICB9CiAKKyNkZWZpbmUgRkZJX0lOSVRfVFJB TVBPTElORV9USElTQ0FMTChUUkFNUCxGVU4sQ1RYLFNJWkUpIFwKK3sgdW5z aWduZWQgY2hhciAqX190cmFtcCA9ICh1bnNpZ25lZCBjaGFyKikoVFJBTVAp OyBcCisgICB1bnNpZ25lZCBpbnQgIF9fZnVuID0gKHVuc2lnbmVkIGludCko RlVOKTsgXAorICAgdW5zaWduZWQgaW50ICBfX2N0eCA9ICh1bnNpZ25lZCBp bnQpKENUWCk7IFwKKyAgIHVuc2lnbmVkIGludCAgX19kaXMgPSBfX2Z1biAt IChfX2N0eCArIDIyKTsgIFwKKyAgIHVuc2lnbmVkIHNob3J0IF9fc2l6ZSA9 ICh1bnNpZ25lZCBzaG9ydCkoU0laRSk7IFwKKyAgICoodW5zaWduZWQgaW50 ICopICZfX3RyYW1wWzBdID0gMHg4MzI0MDQ4YjsJLyogbW92ICglZXNwKSwg JWVheCAqLyBcCisgICAqKHVuc2lnbmVkIGludCAqKSAmX190cmFtcFs0XSA9 IDB4NGM4OTEwZWM7CS8qIHN1YiAkMTYsICVlc3AgKi8gXAorICAgKih1bnNp Z25lZCBpbnQgKikgJl9fdHJhbXBbOF0gPSAweDA0ODkwNDI0OwkvKiBtb3Yg JWVjeCwgNCglZXNwKSAqLyBcCisgICAqKHVuc2lnbmVkIGNoYXIqKSAmX190 cmFtcFsxMl0gPSAweDI0OwkvKiBtb3YgJWVheCwgKCVlc3ApICovIFwKKyAg ICoodW5zaWduZWQgY2hhciopICZfX3RyYW1wWzEzXSA9IDB4Yjg7IFwKKyAg ICoodW5zaWduZWQgaW50ICopICZfX3RyYW1wWzE0XSA9IF9fc2l6ZTsJLyog bW92IF9fc2l6ZSwgJWVheCAqLyBcCisgICAqKHVuc2lnbmVkIGludCAqKSAm X190cmFtcFsxOF0gPSAweDA4MjQ0YzhkOwkvKiBsZWEgOCglZXNwKSwgJWVj eCAqLyBcCisgICAqKHVuc2lnbmVkIGludCAqKSAmX190cmFtcFsyMl0gPSAw eDQ4MDJlOGMxOyAvKiBzaHIgJDIsICVlYXggOyBkZWMgJWVheCAqLyBcCisg ICAqKHVuc2lnbmVkIHNob3J0KikgJl9fdHJhbXBbMjZdID0gMHgwYjc0Owkv KiBqeiAxZiAqLyBcCisgICAqKHVuc2lnbmVkIGludCAqKSAmX190cmFtcFsy OF0gPSAweDg5MGM1MThiOwkvKiAyYjogbW92IDEyKCVlYXgpLCAlZWR4ICov IFwKKyAgICoodW5zaWduZWQgaW50ICopICZfX3RyYW1wWzMyXSA9IDB4MDRj MTgzMTE7IC8qIG1vdiAlZWR4LCAoJWVjeCkgOyBhZGQgJDQsICVlZHggKi8g XAorICAgKih1bnNpZ25lZCBjaGFyKikgJl9fdHJhbXBbMzZdID0gMHg0ODsJ LyogZGVjICVlYXggKi8gXAorICAgKih1bnNpZ25lZCBzaG9ydCopICZfX3Ry YW1wWzM3XSA9IDB4ZjU3NTsJLyogam56IDJiIDsgMWY6ICovIFwKKyAgICoo dW5zaWduZWQgY2hhciopICZfX3RyYW1wWzM5XSA9IDB4Yjg7IFwKKyAgICoo dW5zaWduZWQgaW50KikgICZfX3RyYW1wWzQwXSA9IF9fY3R4OyAvKiBtb3Zs IF9fY3R4LCAlZWF4ICovIFwKKyAgICoodW5zaWduZWQgY2hhciAqKSAgJl9f dHJhbXBbNDRdID0gMHhlODsgXAorICAgKih1bnNpZ25lZCBpbnQqKSAgJl9f dHJhbXBbNDVdID0gX19kaXM7IC8qIGNhbGwgX19mdW4gICovIFwKKyAgICoo dW5zaWduZWQgY2hhciopICAmX190cmFtcFs0OV0gPSAweGMyOyAvKiByZXQg ICovIFwKKyAgICoodW5zaWduZWQgc2hvcnQqKSAgJl9fdHJhbXBbNTBdID0g KF9fc2l6ZSArIDEyKTsgLyogcmV0IChfX3NpemUgKyAxMikgICovIFwKKyB9 CisKICNkZWZpbmUgRkZJX0lOSVRfVFJBTVBPTElORV9TVERDQUxMKFRSQU1Q LEZVTixDVFgsU0laRSkgIFwKIHsgdW5zaWduZWQgY2hhciAqX190cmFtcCA9 ICh1bnNpZ25lZCBjaGFyKikoVFJBTVApOyBcCiAgICB1bnNpZ25lZCBpbnQg IF9fZnVuID0gKHVuc2lnbmVkIGludCkoRlVOKTsgXApAQCAtNjUwLDYgKzY3 OSwxMyBAQCBmZmlfcHJlcF9jbG9zdXJlX2xvYyAoZmZpX2Nsb3N1cmUqIGNs b3N1CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopY29kZWxv Yyk7CiAgICAgfQogI2lmZGVmIFg4Nl9XSU4zMgorICBlbHNlIGlmIChjaWYt PmFiaSA9PSBGRklfVEhJU0NBTEwpCisgICAgeworICAgICAgRkZJX0lOSVRf VFJBTVBPTElORV9USElTQ0FMTCAoJmNsb3N1cmUtPnRyYW1wWzBdLAorCQkJ CSAgICAmZmZpX2Nsb3N1cmVfVEhJU0NBTEwsCisJCQkJICAgICh2b2lkKilj b2RlbG9jLAorCQkJCSAgICBjaWYtPmJ5dGVzKTsKKyAgICB9CiAgIGVsc2Ug aWYgKGNpZi0+YWJpID09IEZGSV9TVERDQUxMKQogICAgIHsKICAgICAgIEZG SV9JTklUX1RSQU1QT0xJTkVfU1REQ0FMTCAoJmNsb3N1cmUtPnRyYW1wWzBd LApJbmRleDogZ2NjL2xpYmZmaS9zcmMveDg2L2ZmaXRhcmdldC5oCj09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT0KLS0tIGdjYy5vcmlnL2xpYmZmaS9zcmMveDg2 L2ZmaXRhcmdldC5oCisrKyBnY2MvbGliZmZpL3NyYy94ODYvZmZpdGFyZ2V0 LmgKQEAgLTEwMyw3ICsxMDMsNyBAQCB0eXBlZGVmIGVudW0gZmZpX2FiaSB7 CiAjZGVmaW5lIEZGSV9OQVRJVkVfUkFXX0FQSSAwCiAjZWxzZQogI2lmZGVm IFg4Nl9XSU4zMgotI2RlZmluZSBGRklfVFJBTVBPTElORV9TSVpFIDEzCisj ZGVmaW5lIEZGSV9UUkFNUE9MSU5FX1NJWkUgNTIKICNlbHNlCiAjaWZkZWYg WDg2X1dJTjY0CiAjZGVmaW5lIEZGSV9UUkFNUE9MSU5FX1NJWkUgMjkKSW5k ZXg6IGdjYy9saWJmZmkvc3JjL3g4Ni93aW4zMi5TCj09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT0KLS0tIGdjYy5vcmlnL2xpYmZmaS9zcmMveDg2L3dpbjMyLlMK KysrIGdjYy9saWJmZmkvc3JjL3g4Ni93aW4zMi5TCkBAIC0xNzAsNiArMTcw LDE2IEBAIGNhX2VwaWxvZ3VlOgogICAgICAgICByZXQKIGZmaV9jYWxsX3dp bjMyIEVORFAKIAorZmZpX2Nsb3N1cmVfVEhJU0NBTEwgUFJPQyBORUFSIEZP UkNFRlJBTUUKKwlwdXNoCWVicAorCW1vdgllYnAsIGVzcAorCXN1Ygllc3As IDQwCisJbGVhCWVkeCwgW2VicCAtMjRdCisJbW92CVtlYnAgLSAxMl0sIGVk eAkvKiByZXNwICovCisJbGVhCWVkeCwgW2VicCArIDEyXSAgLyogYWNjb3Vu dCBmb3Igc3R1YiByZXR1cm4gYWRkcmVzcyBvbiBzdGFjayAqLworCWptcAlz dHViCitmZmlfY2xvc3VyZV9USElTQ0FMTCBFTkRQCisKIGZmaV9jbG9zdXJl X1NZU1YgUFJPQyBORUFSIEZPUkNFRlJBTUUKICAgICA7OyB0aGUgZmZpX2Ns b3N1cmUgY3R4IGlzIHBhc3NlZCBpbiBlYXggYnkgdGhlIHRyYW1wb2xpbmUu CiAKQEAgLTE3Nyw2ICsxODcsNyBAQCBmZmlfY2xvc3VyZV9TWVNWIFBST0Mg TkVBUiBGT1JDRUZSQU1FCiAgICAgICAgIGxlYSAgZWR4LCBbZWJwIC0gMjRd CiAgICAgICAgIG1vdiAgW2VicCAtIDEyXSwgZWR4ICAgICAgICAgOzsgcmVz cAogICAgICAgICBsZWEgIGVkeCwgW2VicCArIDhdCitzdHViOgogICAgICAg ICBtb3YgIFtlc3AgKyA4XSwgZWR4ICAgICAgICAgIDs7IGFyZ3MKICAgICAg ICAgbGVhICBlZHgsIFtlYnAgLSAxMl0KICAgICAgICAgbW92ICBbZXNwICsg NF0sIGVkeCAgICAgICAgICA7OyAmcmVzcApAQCAtNTczLDYgKzU4NCwxOSBA QCBfZmZpX2NhbGxfd2luMzI6CiAgICAgICAgIHBvcGwgJWVicAogICAgICAg ICByZXQKIC5mZmlfY2FsbF93aW4zMl9lbmQ6CisgICAgICAgIC5iYWxpZ24g MTYKKwkuZ2xvYmwJX2ZmaV9jbG9zdXJlX1RISVNDQUxMCisjaWZuZGVmIF9f T1MyX18KKwkuZGVmCV9mZmlfY2xvc3VyZV9USElTQ0FMTDsJLnNjbAkyOwku dHlwZQkzMjsJLmVuZGVmCisjZW5kaWYKK19mZmlfY2xvc3VyZV9USElTQ0FM TDoKKwlwdXNobAklZWJwCisJbW92bAklZXNwLCAlZWJwCisJc3VibAkkNDAs ICVlc3AKKwlsZWFsCS0yNCglZWJwKSwgJWVkeAorCW1vdmwJJWVkeCwgLTEy KCVlYnApCS8qIHJlc3AgKi8KKwlsZWFsCTEyKCVlYnApLCAlZWR4ICAvKiBh Y2NvdW50IGZvciBzdHViIHJldHVybiBhZGRyZXNzIG9uIHN0YWNrICovCisJ am1wCS5zdHViCiAuTEZFMToKIAogICAgICAgICAjIFRoaXMgYXNzdW1lcyB3 ZSBhcmUgdXNpbmcgZ2FzLgpAQCAtNTkxLDYgKzYxNSw3IEBAIF9mZmlfY2xv c3VyZV9TWVNWOgogCWxlYWwJLTI0KCVlYnApLCAlZWR4CiAJbW92bAklZWR4 LCAtMTIoJWVicCkJLyogcmVzcCAqLwogCWxlYWwJOCglZWJwKSwgJWVkeAor LnN0dWI6CiAJbW92bAklZWR4LCA0KCVlc3ApCS8qIGFyZ3MgPSBfX2J1aWx0 aW5fZHdhcmZfY2ZhICgpICovCiAJbGVhbAktMTIoJWVicCksICVlZHgKIAlt b3ZsCSVlZHgsICglZXNwKQkvKiAmcmVzcCAqLwpJbmRleDogZ2NjL2xpYmZm aS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xvc3VyZV90aGlzY2FsbC5jCj09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT0KLS0tIC9kZXYvbnVsbAorKysgZ2NjL2xp YmZmaS90ZXN0c3VpdGUvbGliZmZpLmNhbGwvY2xvc3VyZV90aGlzY2FsbC5j CkBAIC0wLDAgKzEsNjQgQEAKKy8qIEFyZWE6CWNsb3N1cmVfY2FsbCAodGhp c2NhbGwgY29udmVudGlvbikKKyAgIFB1cnBvc2U6CUNoZWNrIGhhbmRsaW5n IHdoZW4gY2FsbGVyIGV4cGVjdHMgdGhpc2NhbGwgY2FsbGVlCisgICBMaW1p dGF0aW9uczoJbm9uZS4KKyAgIFBSOgkJbm9uZS4KKyAgIE9yaWdpbmF0b3I6 CTxrdGlldHpAcmVkaGF0LmNvbT4gKi8KKworLyogeyBkZy1kbyBydW4geyB0 YXJnZXQgaT84Ni0qLWN5Z3dpbiogaT84Ni0qLW1pbmd3KiB9IH0gKi8KKyNp bmNsdWRlICJmZml0ZXN0LmgiCisKK3N0YXRpYyB2b2lkCitjbG9zdXJlX3Rl c3RfdGhpc2NhbGwoZmZpX2NpZiogY2lmIF9fVU5VU0VEX18sIHZvaWQqIHJl c3AsIHZvaWQqKiBhcmdzLAorCQkgICAgICB2b2lkKiB1c2VyZGF0YSkKK3sK KyAgKihmZmlfYXJnKilyZXNwID0KKyAgICAoaW50KSooaW50ICopYXJnc1sw XSArIChpbnQpKCooaW50ICopYXJnc1sxXSkKKyAgICArIChpbnQpKCooaW50 ICopYXJnc1syXSkgICsgKGludCkoKihpbnQgKilhcmdzWzNdKQorICAgICsg KGludCkoaW50cHRyX3QpdXNlcmRhdGE7CisKKyAgcHJpbnRmKCIlZCAlZCAl ZCAlZDogJWRcbiIsCisJIChpbnQpKihpbnQgKilhcmdzWzBdLCAoaW50KSgq KGludCAqKWFyZ3NbMV0pLAorCSAoaW50KSgqKGludCAqKWFyZ3NbMl0pLCAo aW50KSgqKGludCAqKWFyZ3NbM10pLAorICAgICAgICAgKGludCkqKGZmaV9h cmcgKilyZXNwKTsKKworfQorCit0eXBlZGVmIGludCAoX190aGlzY2FsbCAq Y2xvc3VyZV90ZXN0X3R5cGUwKShpbnQsIGludCwgaW50LCBpbnQpOworCitp bnQgbWFpbiAodm9pZCkKK3sKKyAgZmZpX2NpZiBjaWY7CisgIHZvaWQgKmNv ZGU7CisgIGZmaV9jbG9zdXJlICpwY2wgPSBmZmlfY2xvc3VyZV9hbGxvYyhz aXplb2YoZmZpX2Nsb3N1cmUpLCAmY29kZSk7CisgIGZmaV90eXBlICogY2xf YXJnX3R5cGVzWzE3XTsKKyAgaW50IHJlczsKKyAgdm9pZCogc3BfcHJlOwor ICB2b2lkKiBzcF9wb3N0OworICBjaGFyIGJ1ZlsxMDI0XTsKKworICBjbF9h cmdfdHlwZXNbMF0gPSAmZmZpX3R5cGVfdWludDsKKyAgY2xfYXJnX3R5cGVz WzFdID0gJmZmaV90eXBlX3VpbnQ7CisgIGNsX2FyZ190eXBlc1syXSA9ICZm ZmlfdHlwZV91aW50OworICBjbF9hcmdfdHlwZXNbM10gPSAmZmZpX3R5cGVf dWludDsKKyAgY2xfYXJnX3R5cGVzWzRdID0gTlVMTDsKKworICAvKiBJbml0 aWFsaXplIHRoZSBjaWYgKi8KKyAgQ0hFQ0soZmZpX3ByZXBfY2lmKCZjaWYs IEZGSV9USElTQ0FMTCwgNCwKKwkJICAgICAmZmZpX3R5cGVfc2ludCwgY2xf YXJnX3R5cGVzKSA9PSBGRklfT0spOworCisgIENIRUNLKGZmaV9wcmVwX2Ns b3N1cmVfbG9jKHBjbCwgJmNpZiwgY2xvc3VyZV90ZXN0X3RoaXNjYWxsLAor ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKSAzIC8qIHVz ZXJkYXRhICovLCBjb2RlKSA9PSBGRklfT0spOworCisgIGFzbSB2b2xhdGls ZSAoIiBtb3ZsICUlZXNwLCUwIiA6ICI9ZyIgKHNwX3ByZSkpOworICByZXMg PSAoKihjbG9zdXJlX3Rlc3RfdHlwZTApY29kZSkoMCwgMSwgMiwgMyk7Cisg IGFzbSB2b2xhdGlsZSAoIiBtb3ZsICUlZXNwLCUwIiA6ICI9ZyIgKHNwX3Bv c3QpKTsKKyAgLyogeyBkZy1vdXRwdXQgIjAgMSAyIDM6IDkiIH0gKi8KKwor ICBwcmludGYoInJlczogJWRcbiIscmVzKTsKKyAgLyogeyBkZy1vdXRwdXQg IlxucmVzOiA5IiB9ICovCisKKyAgc3ByaW50ZihidWYsICJtaXNtYXRjaDog cHJlPSVwIHZzIHBvc3Q9JXAiLCBzcF9wcmUsIHNwX3Bvc3QpOworICBwcmlu dGYoInN0YWNrIHBvaW50ZXIgJXNcbiIsIChzcF9wcmUgPT0gc3BfcG9zdCA/ ICJtYXRjaCIgOiBidWYpKTsKKyAgLyogeyBkZy1vdXRwdXQgIlxuc3RhY2sg cG9pbnRlciBtYXRjaCIgfSAqLworICBleGl0KDApOworfQo= --f46d0447f28c824d8104b7cfd786--