[Darwine] Re: Building wine on darwin (resend) (3/6)

maillard.emmanuel at libertysurf.fr maillard.emmanuel at libertysurf.fr
Sat May 22 14:20:13 CDT 2004


Sorry this is the good patch :

Changelog
	Adjust stack pointer in wine_switch_to_stack to prevent segmentation 
fault on darwin/ppc.

-------------- next part --------------
A non-text attachment was scrubbed...
Name: wine_port.diff
Type: application/octet-stream
Size: 679 bytes
Desc: not available
Url : http://www.winehq.org/pipermail/wine-patches/attachments/20040522/7fb011c6/wine_port.obj
-------------- next part --------------


emmanuel


Le 22 mai 04, ? 15:33, emmanuel maillard a ?crit :

> Hi,
>
>>> --------------
>>> elif defined(__powerpc__) && defined(__APPLE__)
>>> 136 __ASM_GLOBAL_FUNC( wine_switch_to_stack,
>>> 137                    "mtctr r3\n\t" /* func -> ctr */
>>> 138                    "mr r3,r4\n\t" /* args -> function param 1  
>>> (r3) */
>>> 139                    "mr r1,r5\n\t" /* stack */
>>
>> +139                    "add r5,r5,-0xf\n\t" /* adjust the stack  
>> pointer add an extra 16 bits for the function return ptr stored at  
>> 8(SP) */
>>
>> and not "0xf" you guessed.
>>
>
> This doesn't compile.
>
>> According to:
>> http://developer.apple.com/documentation/DeveloperTools/Conceptual/ 
>> MachORuntime/index.html?http://developer.apple.com/documentation/ 
>> DeveloperTools/Conceptual/MachORuntime/2rt_powerpc_abi/ 
>> chapter_9_section_5.html
>>
>> "The calling routine?s linkage area holds a number of values, some of  
>> which are saved by the calling routine and some by the called  
>> routine. The elements within the linkage area are as follows:
>> 	? 	The Link Register (LR) value is saved at 8(SP) by the called  
>> routine if it chooses to do so.
>> 	? 	The Condition Register (CR) value may be saved at 4(SP) by the  
>> called routine. As with the Link Register value, the called routine  
>> is not required to save this value."
>>
>> The trouble is that Tib.StackBase points to the top of the stack  
>> frame, and as the stack grows down, if the function called by  
>> wine_switch_to_stack wants to save its link register it will try to  
>> write at Tib.StackBase+8 which will end up in an error, since the  
>> stack is allocated from Tib.StackBase to (Tib.StackBase -  
>> stack_size). And actually start_process saves its LR.
>>
>
> To adjust stack with only 16 bytes is not enought, this fix the  
> segmentation fault problem but corrupt the stack.
> Using 256 bytes adjustement (as done by _adjust_sp(void *) ) work fine  
>  : no seg fault, no stack corruption.
>
> Changelog :
> 	Adjust stack pointer in wine_switch_to_stack to prevent segmentation  
> fault on darwin/ppc.
>
> <libswine_port.diff>
>
> emmanuel


More information about the wine-patches mailing list