I am sorry I meant:
Le 22 mai 04, à 13:20, Pierre d'Herbemont a écrit :
libs/wine/port.c
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.
I'm not sure what the problem is
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.
Pierre