Index: lss/linux_syscall_support.h |
=================================================================== |
--- lss/linux_syscall_support.h (revision 6) |
+++ lss/linux_syscall_support.h (working copy) |
@@ -2170,8 +2170,24 @@ |
/* In the child, now. Call "fn(arg)". |
*/ |
"ldr r0,[sp, #4]\n" |
+ |
+ /* When compiling for Thumb-2 the "MOV LR,PC" here |
+ * won't work because it loads PC+4 into LR, |
+ * whereas the LDR is a 4-byte instruction. |
+ * This results in the child thread always |
+ * crashing with an "Illegal Instruction" when it |
+ * returned into the middle of the LDR instruction |
+ * The instruction sequence used instead was |
+ * recommended by |
+ * "https://wiki.edubuntu.org/ARM/Thumb2PortingHowto#Quick_Reference". |
+ */ |
+ #ifdef __thumb2__ |
+ "ldr r7,[sp]\n" |
+ "blx r7\n" |
+ #else |
"mov lr,pc\n" |
"ldr pc,[sp]\n" |
+ #endif |
/* Call _exit(%r0). |
*/ |