From owner-freebsd-emulation@FreeBSD.ORG Tue Nov 25 23:59:30 2008 Return-Path: Delivered-To: freebsd-emulation@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 8C6321065674 for ; Tue, 25 Nov 2008 23:59:30 +0000 (UTC) (envelope-from kozlov@ravenloft.kiev.ua) Received: from istc.kiev.ua (wolf.istc.kiev.ua [193.108.236.1]) by mx1.freebsd.org (Postfix) with ESMTP id E903A8FC1E for ; Tue, 25 Nov 2008 23:59:29 +0000 (UTC) (envelope-from kozlov@ravenloft.kiev.ua) Received: from [91.123.146.100] (helo=ravenloft.kiev.ua) by istc.kiev.ua with esmtp (Exim 4.52) id 1L565s-000497-Cy; Wed, 26 Nov 2008 00:09:34 +0200 Date: Wed, 26 Nov 2008 00:08:52 +0200 From: Alex Kozlov To: Gerald Pfeifer , freebsd-emulation@freebsd.org, spam@rm-rf.kiev.ua Message-ID: <20081125220852.GA53049@ravenloft.kiev.ua> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline X-Spam-Score: 0.1 (/) X-Spam-Report: Content analysis detailz: (0.1 points, 10.0 required) * 0.1 URI_NO_WWW_ANY_CGI URI: CGI with long hostname other fourth-level * "www" Cc: Subject: Re: wine-1.1.8 regression -- wine: could not load L"...": Invalid address X-BeenThere: freebsd-emulation@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Development of Emulators of other operating systems List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 25 Nov 2008 23:59:30 -0000 On Tue, Nov 25, 2008 at 10:39:25PM +0100, Gerald Pfeifer wrote: >> Patch helps me. Thank you. >> Now no more "Invalid address" messages. > Cool. Thanks a lot for addressing this Alex, and Vladimir for your > testing! Problem was surprisingly easy to diagnose. > Alex, would you mind submitting this patch upstream as well, to > wine-patches@winehq.org Cc:ing me on that? (If you prefer, I can > also do this, but since it's your patch...) I'm already contact to julliard@winehq.org. If You think it is necessary, You can submit patch to wine-patches. p.s. Preliminary analysis: After this commit http://source.winehq.org/git/wine.git/?a=commitdiff;h=222e406deb878a6312b3c4bf3bcd0e185fa2ff2c wine on freebsd 6/7 almost completely broken. I believe this is because wine reserves only dos area on freebsd. So wine_mmap_enum_reserved_areas fail: if (!wine_mmap_enum_reserved_areas( alloc_virtual_heap, &heap_base, 0 )) heap_base = wine_anon_mmap( NULL, VIRTUAL_HEAP_SIZE, PROT_READ|PROT_WRITE, 0 ); Then wine_anon_mmap with NULL as base (this changes to 0x110000 - another freebsd kludge) map first available address. After this map_image can't map PE to 0x400000 and in most cases fail with: warn:module:map_image Need to relocate module from 0x400000 to 0x660000, but there are no relocation records Quick and dirty workaround: Index: dlls/ntdll/virtual.c @@ -1250,8 +1254,13 @@ } /* try to find space in a reserved area for the virtual heap */ - if (!wine_mmap_enum_reserved_areas( alloc_virtual_heap, &heap_base, 1 )) +#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__) + heap_base = wine_anon_mmap( address_space_limit - 10 * VIRTUAL_HEAP_SIZE, + VIRTUAL_HEAP_SIZE, PROT_READ|PROT_WRITE, 0 ); +#else + if (!wine_mmap_enum_reserved_areas( alloc_virtual_heap, &heap_base, 0 )) heap_base = wine_anon_mmap( NULL, VIRTUAL_HEAP_SIZE, PROT_READ|PROT_WRITE, 0 ); +#endif assert( heap_base != (void *)-1 ); virtual_heap = RtlCreateHeap( HEAP_NO_SERIALIZE, heap_base, VIRTUAL_HEAP_SIZE, Logs. WINEDEBUG=all wine 1.1.7: 0009:trace:module:load_native_dll Trying native dll L"C:\\Arcanum\\Arcanum.exe" 0009: create_mapping( access=000f0005, attributes=00000000, size=000000000, protect=192, file_handle=0x18, objattr={rootdir=0x0,sd={},name=L""} ) 0009: create_mapping() = 0 { handle=0x1c } 0009:trace:virtual:NtMapViewOfSection handle=0x1c process=0xffffffff addr=0x0 off=000000000 size=0 access=2 0009: get_mapping_info( handle=0x1c ) 0009: get_mapping_info() = 0 { size=000356000, protect=128, header_size=4096, base=0x400000, mapping=0x20, shared_file=0x0 } 0009: get_handle_fd( handle=0x1c ) 0009: *fd* 0x1c -> 68 0009: get_handle_fd() = 0 { type=1, removable=0, access=000f0005, options=00000000 } 0009:trace:virtual:VIRTUAL_DumpView View: 0x400000 - 0x755fff (anonymous) 0009:trace:virtual:VIRTUAL_DumpView 0x400000 - 0x755fff c-rWx >0009:trace:module:map_image mapped PE file at 0x400000-0x756000 0009:trace:module:map_image mapping section .text at 0x401000 off 1000 size 195000 virt 195000 flags 60000020 0009:trace:module:map_image mapping section .rdata at 0x596000 off 196000 size 4000 virt 3cc0 flags 40000040 0009:trace:module:map_image mapping section .data at 0x59a000 off 19a000 size 36000 virt 1a1318 flags c0000040 0009:trace:module:map_image mapping section .idata at 0x73c000 off 1d0000 size 2000 virt 10c0 flags c0000040 0009:trace:module:map_image mapping section .rsrc at 0x73e000 off 1d2000 size 3000 virt 27a0 flags 40000040 0009:trace:module:map_image mapping section .reloc at 0x741000 off 1d5000 size 15000 virt 14a90 flags 42000040 WINEDEBUG=all wine 1.1.9: 001b:trace:module:load_native_dll Trying native dll L"C:\\Arcanum\\Arcanum.exe" 001b: create_mapping( access=000f0005, attributes=00000000, size=000000000, protect=00000140, file_handle=0x18, objattr={rootdir=0x0,sd={},name=L""} ) 001b: create_mapping() = 0 { handle=0x1c } 001b:trace:virtual:NtMapViewOfSection handle=0x1c process=0xffffffff addr=0x0 off=000000000 size=0 a ccess=2 001b: get_mapping_info( handle=0x1c, access=00000005 ) 001b: get_mapping_info() = 0 { size=000356000, protect=256, header_size=4096, base=0x400000, mapping =0x20, shared_file=0x0 } 001b: get_handle_fd( handle=0x1c ) 001b: *fd* 0x1c -> 21 001b: get_handle_fd() = 0 { type=1, removable=0, access=000f0005, options=00000000 } 001b:trace:virtual:map_view got mem with anon mmap 0x660000-0x9b6000 001b:trace:heap:RtlAllocateHeap (0x110000,00000001,00000371): returning 0x110998 001b:trace:virtual:VIRTUAL_DumpView View: 0x660000 - 0x9b5fff (anonymous) 001b:trace:virtual:VIRTUAL_DumpView 0x660000 - 0x9b5fff c-rWx >001b:trace:module:map_image mapped PE file at 0x660000-0x9b6000 001b:trace:module:map_image mapping section .text at 0x661000 off 1000 size 195000 virt 195000 flags 60000020 001b:trace:module:map_image mapping section .rdata at 0x7f6000 off 196000 size 4000 virt 3cc0 flags 40000040 001b:trace:module:map_image mapping section .data at 0x7fa000 off 19a000 size 36000 virt 1a1318 flags c0000040 001b:trace:module:map_image mapping section .idata at 0x99c000 off 1d0000 size 2000 virt 10c0 flags c0000040 001b:trace:module:map_image mapping section .rsrc at 0x99e000 off 1d2000 size 3000 virt 27a0 flags 40000040 001b:trace:module:map_image mapping section .reloc at 0x9a1000 off 1d5000 size 15000 virt 14a90 flags 42000040 001b:warn:module:map_image Need to relocate module from 0x400000 to 0x660000, but there are no relocation records wine_anon_map log on 1.1.9: base=0x1000 size=0x10f000 prot=0 flags=1042 ptr=0x1000 base=0x0 size=0x1000 prot=0 flags=1052 ptr=0x0 >base=0x110000 size=0x400000 prot=3 flags=1002 ptr=0x110000 # VIRTUAL_HEAP base=0x7ffe0000 size=0x10000 prot=3 flags=1002 ptr=0x7ffe0000 base=0x110000 size=0x2000 prot=3 flags=1002 ptr=0x510000 base=0x110000 size=0x8000 prot=3 flags=1002 ptr=0x511000 base=0x110000 size=0x120000 prot=0 flags=1002 ptr=0x518000 base=0x7e180000 size=0x1000 prot=3 flags=1012 ptr=0x7e180000 base=0x7e240000 size=0x1000 prot=3 flags=1012 ptr=0x7e240000 base=0x110000 size=0x11000 prot=3 flags=1002 ptr=0x630000 base=0x110000 size=0x11000 prot=3 flags=1002 ptr=0x631000 >base=0x400000 size=0x356000 prot=7 flags=1002 ptr=0x631000 # PE image base=0x110000 size=0x366000 prot=7 flags=1002 ptr=0x631000 base=0x110000 size=0x11000 prot=3 flags=1002 ptr=0x631000 base=0x1000 size=0x10f000 prot=0 flags=1042 ptr=0x1000 base=0x0 size=0x1000 prot=0 flags=1052 ptr=0x0 base=0x110000 size=0x400000 prot=3 flags=1002 ptr=0x110000 base=0x7ffe0000 size=0x10000 prot=3 flags=1002 ptr=0x7ffe0000 base=0x110000 size=0x2000 prot=3 flags=1002 ptr=0x510000 base=0x110000 size=0x8000 prot=3 flags=1002 ptr=0x511000 base=0x110000 size=0x120000 prot=0 flags=1002 ptr=0x518000 base=0x110000 size=0x12000 prot=3 flags=1002 ptr=0x630000 base=0x110000 size=0x11000 prot=3 flags=1002 ptr=0x632000 base=0x7e180000 size=0x1000 prot=3 flags=1012 ptr=0x7e180000 base=0x7e240000 size=0x1000 prot=3 flags=1012 ptr=0x7e240000 base=0x400000 size=0x356000 prot=7 flags=1002 ptr=0x641000 base=0x110000 size=0x366000 prot=7 flags=1002 ptr=0x641000 -- Adios