Hi, The stack switching code (switch_xxx_gcc.h) for PPC is missing for stacklets under rpython/translator/c/src/stacklet, I am trying to work on adding that code but I am facing an issue when doing that due to the way PPC assembly works and needed some help/advice
I added the switch_ppc64_gcc.h file for PPC with the slp_switch function similar to the one's in the other files (eg. switch_x86_gcc.h etc) and I run the test cases in tests.c to test the new code but these fail with segfaults. I gdb'd the failures and find that the segfaults are due to PPC assembly using the calling functions stack to store the LR register but the g_save_state/g_restore_state functions in stacklet.c overwriting the stack contents causing the stored value to be destroyed Specifically, Running test_new(..) in tests.c calls stacklet_new(..) to create a new stacklet which in turn calls g_initialstub. _stacklet_switchstack is called twice here, first to save the old stack contents using g_initial_save_state in the heap memory and then again in the "if" code to restore the contents to the new stack using g_restore_state. The issue is when running the g_restore_state function, at the start the function prologue code saves the Link Register (LR) in the LR save area in the calling function's (slp_switch calls g_restore_state) stack frame as per PPC function calling conventions. This value is restored back into the LR register at the end by the epilogue code to return back to the calling function slp_switch. However in between the calling function's stack content is overwritten by the g_restore_state code (it memcpy's the stored heap memory data to the stack) causing the saved LR value to be destroyed and thus returning from the g_restore_state function (using blr) causes a segfault I am not sure how to get around this problem since it is specific to the way PPC assembly works and the same thing is not an issue on other platforms, any help/advice/comments would be a great help Thanks! Vaibhav DISCLAIMER ========== This e-mail may contain privileged and confidential information which is the property of Persistent Systems Ltd. It is intended only for the use of the individual or entity to which it is addressed. If you are not the intended recipient, you are not authorized to read, retain, copy, print, distribute or use this message. If you have received this communication in error, please notify the sender and delete all copies of this message. Persistent Systems Ltd. does not accept any liability for virus infected mails.
_______________________________________________ pypy-dev mailing list pypy-dev@python.org https://mail.python.org/mailman/listinfo/pypy-dev