[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