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

emmanuel maillard e.rsz at libertysurf.fr
Sat May 22 08:33:01 CDT 2004


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.

-------------- next part --------------
A non-text attachment was scrubbed...
Name: libswine_port.diff
Type: application/octet-stream
Size: 648 bytes
Desc: not available
Url : http://www.winehq.org/pipermail/wine-devel/attachments/20040522/c1212932/libswine_port.obj
-------------- next part --------------


emmanuel


More information about the wine-devel mailing list