diff --git a/rtl/linux/powerpc64/syscall.inc b/rtl/linux/powerpc64/syscall.inc index 58eaef4c32..172ee0b1ad 100644 --- a/rtl/linux/powerpc64/syscall.inc +++ b/rtl/linux/powerpc64/syscall.inc @@ -31,41 +31,54 @@ var temp : qword; retaddress: ptruint; asm - mr r0,r3 + mr r0, r3 sc - bns .LDone - lis r10,(fpc_threadvar_relocate_proc)@highesta - ori r10, r10, (fpc_threadvar_relocate_proc)@highera - sldi r10, r10, 32 - oris r10, r10, (fpc_threadvar_relocate_proc)@ha - ld r10,(fpc_threadvar_relocate_proc)@l(r10) + bns .LDone + lis r10, (fpc_threadvar_relocate_proc)@highesta + ori r10, r10, (fpc_threadvar_relocate_proc)@highera + sldi r10, r10, 32 + oris r10, r10, (fpc_threadvar_relocate_proc)@ha + ld r10, (fpc_threadvar_relocate_proc)@l(r10) - cmpdi r10,0 - bne .LThreaded - lis r4, (Errno+8)@highesta - ori r4, r4, (Errno+8)@highera - sldi r4, r4, 32 - oris r4, r4, (Errno+8)@ha - stw r3,(Errno+8)@l(r4) - b .LFailed + cmpdi r10, 0 + bne .LThreaded + lis r4, (Errno+8)@highesta + ori r4, r4, (Errno+8)@highera + sldi r4, r4, 32 + oris r4, r4, (Errno+8)@ha + stw r3, (Errno+8)@l(r4) + b .LFailed .LThreaded: - std r3,temp - mflr r3 - std r3,retaddress - ld r10, 0(r10) - mtctr r10 - lis r4, (errno)@highesta - ori r4, r4, (errno)@highera - sldi r4, r4, 32 - oris r4, r4, (errno)@ha - ld r3,(errno)@l(r4) + std r3, temp + mflr r3 + std r3, retaddress + + // load actual function entry into r9 + ld r9, 0(r10) + // save old TOC value + std r2, 40(r1) + // move function entry into ctr + mtctr r9 + // load new TOC value + ld r2, 8(r10) + // load environment pointer from TOC + ld r11, 16(r10) + // load parameters + lis r4, (errno)@highesta + ori r4, r4, (errno)@highera + sldi r4, r4, 32 + oris r4, r4, (errno)@ha + lwz r3, (errno)@l(r4) bctrl - ld r4,temp - ld r5,retaddress - std r4,0(r3) - mtlr r5 + // restore old TOC value + ld r2, 40(r1) + + ld r4, temp + ld r5, retaddress + std r4, 0(r3) + mtlr r5 .LFailed: - li r3, -1 + li r3, -1 .LDone: end; @@ -78,43 +91,55 @@ var temp : qword; retaddress: ptruint; asm - mr r0,r3 - mr r3,r4 + mr r0, r3 + mr r3, r4 sc - bns .LDone - lis r10,(fpc_threadvar_relocate_proc)@highesta - ori r10, r10, (fpc_threadvar_relocate_proc)@highera - sldi r10, r10, 32 - oris r10, r10, (fpc_threadvar_relocate_proc)@ha - ld r10,(fpc_threadvar_relocate_proc)@l(r10) + bns .LDone + lis r10, (fpc_threadvar_relocate_proc)@highesta + ori r10, r10, (fpc_threadvar_relocate_proc)@highera + sldi r10, r10, 32 + oris r10, r10, (fpc_threadvar_relocate_proc)@ha + ld r10, (fpc_threadvar_relocate_proc)@l(r10) - cmpdi r10,0 - bne .LThreaded - lis r4, (Errno+8)@highesta - ori r4, r4, (Errno+8)@highera - sldi r4, r4, 32 - oris r4, r4, (Errno+8)@ha - stw r3,(Errno+8)@l(r4) - b .LFailed + cmpdi r10, 0 + bne .LThreaded + lis r4, (Errno+8)@highesta + ori r4, r4, (Errno+8)@highera + sldi r4, r4, 32 + oris r4, r4, (Errno+8)@ha + stw r3, (Errno+8)@l(r4) + b .LFailed .LThreaded: - std r3,temp - mflr r3 - mtctr r10 - ld r10, 0(r10) + std r3, temp + mflr r3 - lis r4, (errno)@highesta - ori r4, r4, (errno)@highera - sldi r4, r4, 32 - oris r4, r4, (errno)@ha - std r3,retaddress - ld r3,(errno)@l(r4) + // load actual function entry into r9 + ld r9, 0(r10) + // save old TOC value + std r2, 40(r1) + // move function entry into ctr + mtctr r9 + // load new TOC value + ld r2, 8(r10) + // load environment pointer from TOC + ld r11, 16(r10) + // load parameters + lis r4, (errno)@highesta + ori r4, r4, (errno)@highera + sldi r4, r4, 32 + oris r4, r4, (errno)@ha + std r3, retaddress + lwz r3, (errno)@l(r4) bctrl - ld r4,temp - ld r5,retaddress - std r4,0(r3) - mtlr r5 + // restore old TOC value + ld r2, 40(r1) + + ld r4, temp + ld r5, retaddress + std r4, 0(r3) + mtlr r5 .LFailed: - li r3, -1 + li r3, -1 .LDone: end; @@ -127,43 +152,55 @@ var temp : qword; retaddress: ptruint; asm - mr r0,r3 - mr r3,r4 - mr r4,r5 + mr r0, r3 + mr r3, r4 + mr r4, r5 sc - bns .LDone - lis r10,(fpc_threadvar_relocate_proc)@highesta - ori r10, r10, (fpc_threadvar_relocate_proc)@highera - sldi r10, r10, 32 - oris r10, r10, (fpc_threadvar_relocate_proc)@ha - ld r10,(fpc_threadvar_relocate_proc)@l(r10) + bns .LDone + lis r10, (fpc_threadvar_relocate_proc)@highesta + ori r10, r10, (fpc_threadvar_relocate_proc)@highera + sldi r10, r10, 32 + oris r10, r10, (fpc_threadvar_relocate_proc)@ha + ld r10, (fpc_threadvar_relocate_proc)@l(r10) - cmpdi r10,0 - bne .LThreaded - lis r4, (Errno+8)@highesta - ori r4, r4, (Errno+8)@highera - sldi r4, r4, 32 - oris r4, r4, (Errno+8)@ha - stw r3,(Errno+8)@l(r4) - b .LFailed + cmpdi r10, 0 + bne .LThreaded + lis r4, (Errno+8)@highesta + ori r4, r4, (Errno+8)@highera + sldi r4, r4, 32 + oris r4, r4, (Errno+8)@ha + stw r3, (Errno+8)@l(r4) + b .LFailed .LThreaded: - std r3,temp - mflr r3 - ld r10, 0(r10) - mtctr r10 - lis r4, (errno)@highesta - ori r4, r4, (errno)@highera - sldi r4, r4, 32 - oris r4, r4, (errno)@ha - std r3,retaddress - ld r3,(errno)@l(r4) + std r3, temp + mflr r3 + // load actual function entry into r9 + ld r9, 0(r10) + // save old TOC value + std r2, 40(r1) + // move function entry into ctr + mtctr r9 + // load new TOC value + ld r2, 8(r10) + // load environment pointer from TOC + ld r11, 16(r10) + // load parameters + lis r4, (errno)@highesta + ori r4, r4, (errno)@highera + sldi r4, r4, 32 + oris r4, r4, (errno)@ha + std r3, retaddress + lwz r3, (errno)@l(r4) bctrl - ld r4,temp - ld r5,retaddress - std r4,0(r3) - mtlr r5 + // restore old TOC value + ld r2, 40(r1) + + ld r4, temp + ld r5, retaddress + std r4, 0(r3) + mtlr r5 .LFailed: - li r3, -1 + li r3, -1 .LDone: end; @@ -177,44 +214,57 @@ var temp : qword; retaddress: ptruint; asm - mr r0,r3 - mr r3,r4 - mr r4,r5 - mr r5,r6 + mr r0, r3 + mr r3, r4 + mr r4, r5 + mr r5, r6 sc - bns .LDone - lis r10,(fpc_threadvar_relocate_proc)@highesta - ori r10, r10, (fpc_threadvar_relocate_proc)@highera - sldi r10, r10, 32 - oris r10, r10, (fpc_threadvar_relocate_proc)@ha - ld r10,(fpc_threadvar_relocate_proc)@l(r10) + bns .LDone + lis r10, (fpc_threadvar_relocate_proc)@highesta + ori r10, r10, (fpc_threadvar_relocate_proc)@highera + sldi r10, r10, 32 + oris r10, r10, (fpc_threadvar_relocate_proc)@ha + ld r10, (fpc_threadvar_relocate_proc)@l(r10) - cmpdi r10,0 - bne .LThreaded - lis r4, (Errno+8)@highesta - ori r4, r4, (Errno+8)@highera - sldi r4, r4, 32 - oris r4, r4, (Errno+8)@ha - stw r3,(Errno+8)@l(r4) - b .LFailed + cmpdi r10, 0 + bne .LThreaded + lis r4, (Errno+8)@highesta + ori r4, r4, (Errno+8)@highera + sldi r4, r4, 32 + oris r4, r4, (Errno+8)@ha + stw r3, (Errno+8)@l(r4) + b .LFailed .LThreaded: - std r3,temp - mflr r3 - ld r10, 0(r10) - mtctr r10 - lis r4, (errno)@highesta - ori r4, r4, (errno)@highera - sldi r4, r4, 32 - oris r4, r4, (errno)@ha - std r3,retaddress - ld r3,(errno)@l(r4) + std r3, temp + mflr r3 + + // load actual function entry into r9 + ld r9, 0(r10) + // save old TOC value + std r2, 40(r1) + // move function entry into ctr + mtctr r9 + // load new TOC value + ld r2, 8(r10) + // load environment pointer from TOC + ld r11, 16(r10) + // load parameters + lis r4, (errno)@highesta + ori r4, r4, (errno)@highera + sldi r4, r4, 32 + oris r4, r4, (errno)@ha + std r3, retaddress + lwz r3, (errno)@l(r4) bctrl - ld r4,temp - ld r5,retaddress - std r4,0(r3) - mtlr r5 + + // restore old TOC value + ld r2, 40(r1) + ld r4, temp + ld r5, retaddress + std r4, 0(r3) + mtlr r5 .LFailed: - li r3, -1 + li r3, -1 .LDone: end; @@ -228,45 +278,58 @@ var temp : qword; retaddress: ptruint; asm - mr r0,r3 - mr r3,r4 - mr r4,r5 - mr r5,r6 - mr r6,r7 + mr r0, r3 + mr r3, r4 + mr r4, r5 + mr r5, r6 + mr r6, r7 sc - bns .LDone - lis r10,(fpc_threadvar_relocate_proc)@highesta - ori r10, r10, (fpc_threadvar_relocate_proc)@highera - sldi r10, r10, 32 - oris r10, r10, (fpc_threadvar_relocate_proc)@ha - ld r10,(fpc_threadvar_relocate_proc)@l(r10) + bns .LDone + lis r10, (fpc_threadvar_relocate_proc)@highesta + ori r10, r10, (fpc_threadvar_relocate_proc)@highera + sldi r10, r10, 32 + oris r10, r10, (fpc_threadvar_relocate_proc)@ha + ld r10, (fpc_threadvar_relocate_proc)@l(r10) - cmpdi r10,0 - bne .LThreaded - lis r4, (Errno+8)@highesta - ori r4, r4, (Errno+8)@highera - sldi r4, r4, 32 - oris r4, r4, (Errno+8)@ha - stw r3,(Errno+8)@l(r4) - b .LFailed + cmpdi r10, 0 + bne .LThreaded + lis r4, (Errno+8)@highesta + ori r4, r4, (Errno+8)@highera + sldi r4, r4, 32 + oris r4, r4, (Errno+8)@ha + stw r3, (Errno+8)@l(r4) + b .LFailed .LThreaded: - std r3,temp - mflr r3 - ld r10, 0(r10) - mtctr r10 - lis r4, (errno)@highesta - ori r4, r4, (errno)@highera - sldi r4, r4, 32 - oris r4, r4, (errno)@ha - std r3,retaddress - ld r3,(errno)@l(r4) + std r3, temp + mflr r3 + + // load actual function entry into r9 + ld r9, 0(r10) + // save old TOC value + std r2, 40(r1) + // move function entry into ctr + mtctr r9 + // load new TOC value + ld r2, 8(r10) + // load environment pointer from TOC + ld r11, 16(r10) + // load parameters + lis r4, (errno)@highesta + ori r4, r4, (errno)@highera + sldi r4, r4, 32 + oris r4, r4, (errno)@ha + std r3, retaddress + lwz r3, (errno)@l(r4) bctrl - ld r4,temp - ld r5,retaddress - std r4,0(r3) - mtlr r5 + + // restore old TOC value + ld r2, 40(r1) + ld r4, temp + ld r5, retaddress + std r4, 0(r3) + mtlr r5 .LFailed: - li r3, -1 + li r3, -1 .LDone: end; @@ -280,46 +343,59 @@ var temp : qword; retaddress: ptruint; asm - mr r0,r3 - mr r3,r4 - mr r4,r5 - mr r5,r6 - mr r6,r7 - mr r7,r8 + mr r0, r3 + mr r3, r4 + mr r4, r5 + mr r5, r6 + mr r6, r7 + mr r7, r8 sc - bns .LDone - lis r10,(fpc_threadvar_relocate_proc)@highesta - ori r10, r10, (fpc_threadvar_relocate_proc)@highera - sldi r10, r10, 32 - oris r10, r10, (fpc_threadvar_relocate_proc)@ha - ld r10,(fpc_threadvar_relocate_proc)@l(r10) + bns .LDone + lis r10, (fpc_threadvar_relocate_proc)@highesta + ori r10, r10, (fpc_threadvar_relocate_proc)@highera + sldi r10, r10, 32 + oris r10, r10, (fpc_threadvar_relocate_proc)@ha + ld r10, (fpc_threadvar_relocate_proc)@l(r10) - cmpdi r10,0 - bne .LThreaded - lis r4, (Errno+8)@highesta - ori r4, r4, (Errno+8)@highera - sldi r4, r4, 32 - oris r4, r4, (Errno+8)@ha - stw r3,(Errno+8)@l(r4) - b .LFailed + cmpdi r10, 0 + bne .LThreaded + lis r4, (Errno+8)@highesta + ori r4, r4, (Errno+8)@highera + sldi r4, r4, 32 + oris r4, r4, (Errno+8)@ha + stw r3, (Errno+8)@l(r4) + b .LFailed .LThreaded: - std r3,temp - mflr r3 - ld r10, 0(r10) - mtctr r10 - lis r4, (errno)@highesta - ori r4, r4, (errno)@highera - sldi r4, r4, 32 - oris r4, r4, (errno)@ha - std r3,retaddress - ld r3,(errno)@l(r4) + std r3, temp + mflr r3 + + // load actual function entry into r9 + ld r9, 0(r10) + // save old TOC value + std r2, 40(r1) + // move function entry into ctr + mtctr r9 + // load new TOC value + ld r2, 8(r10) + // load environment pointer from TOC + ld r11, 16(r10) + // load parameters + lis r4, (errno)@highesta + ori r4, r4, (errno)@highera + sldi r4, r4, 32 + oris r4, r4, (errno)@ha + std r3, retaddress + lwz r3, (errno)@l(r4) bctrl - ld r4,temp - ld r5,retaddress - std r4,0(r3) - mtlr r5 + // restore old TOC value + ld r2, 40(r1) + + ld r4, temp + ld r5, retaddress + std r4, 0(r3) + mtlr r5 .LFailed: - li r3, -1 + li r3, -1 .LDone: end; @@ -333,46 +409,59 @@ var temp : qword; retaddress: ptruint; asm - mr r0,r3 - mr r3,r4 - mr r4,r5 - mr r5,r6 - mr r6,r7 - mr r7,r8 - mr r8,r9 + mr r0, r3 + mr r3, r4 + mr r4, r5 + mr r5, r6 + mr r6, r7 + mr r7, r8 + mr r8, r9 sc - bns .LDone - lis r10,(fpc_threadvar_relocate_proc)@highesta - ori r10, r10, (fpc_threadvar_relocate_proc)@highera - sldi r10, r10, 32 - oris r10, r10, (fpc_threadvar_relocate_proc)@ha - ld r10,(fpc_threadvar_relocate_proc)@l(r10) + bns .LDone + lis r10, (fpc_threadvar_relocate_proc)@highesta + ori r10, r10, (fpc_threadvar_relocate_proc)@highera + sldi r10, r10, 32 + oris r10, r10, (fpc_threadvar_relocate_proc)@ha + ld r10, (fpc_threadvar_relocate_proc)@l(r10) - cmpdi r10,0 - bne .LThreaded - lis r4, (Errno+8)@highesta - ori r4, r4, (Errno+8)@highera - sldi r4, r4, 32 - oris r4, r4, (Errno+8)@ha - stw r3,(Errno+8)@l(r4) - b .LFailed + cmpdi r10, 0 + bne .LThreaded + lis r4, (Errno+8)@highesta + ori r4, r4, (Errno+8)@highera + sldi r4, r4, 32 + oris r4, r4, (Errno+8)@ha + stw r3, (Errno+8)@l(r4) + b .LFailed .LThreaded: - std r3,temp - mflr r3 - ld r10, 0(r10) - mtctr r10 - lis r4, (errno)@highesta - ori r4, r4, (errno)@highera - sldi r4, r4, 32 - oris r4, r4, (errno)@ha - std r3,retaddress - ld r3,(errno)@l(r4) + std r3, temp + mflr r3 + + // load actual function entry into r9 + ld r9, 0(r10) + // save old TOC value + std r2, 40(r1) + // move function entry into ctr + mtctr r9 + // load new TOC value + ld r2, 8(r10) + // load environment pointer from TOC + ld r11, 16(r10) + // load parameters + lis r4, (errno)@highesta + ori r4, r4, (errno)@highera + sldi r4, r4, 32 + oris r4, r4, (errno)@ha + std r3, retaddress + lwz r3, (errno)@l(r4) bctrl - ld r4,temp - ld r5,retaddress - std r4,0(r3) - mtlr r5 + // restore old TOC value + ld r2, 40(r1) + + ld r4, temp + ld r5, retaddress + std r4, 0(r3) + mtlr r5 .LFailed: - li r3, -1 + li r3, -1 .LDone: end;