mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-10-27 00:51:33 +01:00
* fixed syscall helpers: threadvar index now correctly loaded as dword, helpers are now TOC and environment pointer aware, one-parameter helper was bugged and general cleanup; solves random crashes in these functions in particular with -O2 and threads.
git-svn-id: trunk@4236 -
This commit is contained in:
parent
c8b0d1ae2d
commit
2b8d704238
@ -31,41 +31,54 @@ var
|
|||||||
temp : qword;
|
temp : qword;
|
||||||
retaddress: ptruint;
|
retaddress: ptruint;
|
||||||
asm
|
asm
|
||||||
mr r0,r3
|
mr r0, r3
|
||||||
sc
|
sc
|
||||||
bns .LDone
|
bns .LDone
|
||||||
lis r10,(fpc_threadvar_relocate_proc)@highesta
|
lis r10, (fpc_threadvar_relocate_proc)@highesta
|
||||||
ori r10, r10, (fpc_threadvar_relocate_proc)@highera
|
ori r10, r10, (fpc_threadvar_relocate_proc)@highera
|
||||||
sldi r10, r10, 32
|
sldi r10, r10, 32
|
||||||
oris r10, r10, (fpc_threadvar_relocate_proc)@ha
|
oris r10, r10, (fpc_threadvar_relocate_proc)@ha
|
||||||
ld r10,(fpc_threadvar_relocate_proc)@l(r10)
|
ld r10, (fpc_threadvar_relocate_proc)@l(r10)
|
||||||
|
|
||||||
cmpdi r10,0
|
cmpdi r10, 0
|
||||||
bne .LThreaded
|
bne .LThreaded
|
||||||
lis r4, (Errno+8)@highesta
|
lis r4, (Errno+8)@highesta
|
||||||
ori r4, r4, (Errno+8)@highera
|
ori r4, r4, (Errno+8)@highera
|
||||||
sldi r4, r4, 32
|
sldi r4, r4, 32
|
||||||
oris r4, r4, (Errno+8)@ha
|
oris r4, r4, (Errno+8)@ha
|
||||||
stw r3,(Errno+8)@l(r4)
|
stw r3, (Errno+8)@l(r4)
|
||||||
b .LFailed
|
b .LFailed
|
||||||
.LThreaded:
|
.LThreaded:
|
||||||
std r3,temp
|
std r3, temp
|
||||||
mflr r3
|
mflr r3
|
||||||
std r3,retaddress
|
std r3, retaddress
|
||||||
ld r10, 0(r10)
|
|
||||||
mtctr r10
|
// load actual function entry into r9
|
||||||
lis r4, (errno)@highesta
|
ld r9, 0(r10)
|
||||||
ori r4, r4, (errno)@highera
|
// save old TOC value
|
||||||
sldi r4, r4, 32
|
std r2, 40(r1)
|
||||||
oris r4, r4, (errno)@ha
|
// move function entry into ctr
|
||||||
ld r3,(errno)@l(r4)
|
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
|
bctrl
|
||||||
ld r4,temp
|
// restore old TOC value
|
||||||
ld r5,retaddress
|
ld r2, 40(r1)
|
||||||
std r4,0(r3)
|
|
||||||
mtlr r5
|
ld r4, temp
|
||||||
|
ld r5, retaddress
|
||||||
|
std r4, 0(r3)
|
||||||
|
mtlr r5
|
||||||
.LFailed:
|
.LFailed:
|
||||||
li r3, -1
|
li r3, -1
|
||||||
.LDone:
|
.LDone:
|
||||||
end;
|
end;
|
||||||
|
|
||||||
@ -78,43 +91,55 @@ var
|
|||||||
temp : qword;
|
temp : qword;
|
||||||
retaddress: ptruint;
|
retaddress: ptruint;
|
||||||
asm
|
asm
|
||||||
mr r0,r3
|
mr r0, r3
|
||||||
mr r3,r4
|
mr r3, r4
|
||||||
sc
|
sc
|
||||||
bns .LDone
|
bns .LDone
|
||||||
lis r10,(fpc_threadvar_relocate_proc)@highesta
|
lis r10, (fpc_threadvar_relocate_proc)@highesta
|
||||||
ori r10, r10, (fpc_threadvar_relocate_proc)@highera
|
ori r10, r10, (fpc_threadvar_relocate_proc)@highera
|
||||||
sldi r10, r10, 32
|
sldi r10, r10, 32
|
||||||
oris r10, r10, (fpc_threadvar_relocate_proc)@ha
|
oris r10, r10, (fpc_threadvar_relocate_proc)@ha
|
||||||
ld r10,(fpc_threadvar_relocate_proc)@l(r10)
|
ld r10, (fpc_threadvar_relocate_proc)@l(r10)
|
||||||
|
|
||||||
cmpdi r10,0
|
cmpdi r10, 0
|
||||||
bne .LThreaded
|
bne .LThreaded
|
||||||
lis r4, (Errno+8)@highesta
|
lis r4, (Errno+8)@highesta
|
||||||
ori r4, r4, (Errno+8)@highera
|
ori r4, r4, (Errno+8)@highera
|
||||||
sldi r4, r4, 32
|
sldi r4, r4, 32
|
||||||
oris r4, r4, (Errno+8)@ha
|
oris r4, r4, (Errno+8)@ha
|
||||||
stw r3,(Errno+8)@l(r4)
|
stw r3, (Errno+8)@l(r4)
|
||||||
b .LFailed
|
b .LFailed
|
||||||
.LThreaded:
|
.LThreaded:
|
||||||
std r3,temp
|
std r3, temp
|
||||||
mflr r3
|
mflr r3
|
||||||
mtctr r10
|
|
||||||
ld r10, 0(r10)
|
|
||||||
|
|
||||||
lis r4, (errno)@highesta
|
// load actual function entry into r9
|
||||||
ori r4, r4, (errno)@highera
|
ld r9, 0(r10)
|
||||||
sldi r4, r4, 32
|
// save old TOC value
|
||||||
oris r4, r4, (errno)@ha
|
std r2, 40(r1)
|
||||||
std r3,retaddress
|
// move function entry into ctr
|
||||||
ld r3,(errno)@l(r4)
|
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
|
bctrl
|
||||||
ld r4,temp
|
// restore old TOC value
|
||||||
ld r5,retaddress
|
ld r2, 40(r1)
|
||||||
std r4,0(r3)
|
|
||||||
mtlr r5
|
ld r4, temp
|
||||||
|
ld r5, retaddress
|
||||||
|
std r4, 0(r3)
|
||||||
|
mtlr r5
|
||||||
.LFailed:
|
.LFailed:
|
||||||
li r3, -1
|
li r3, -1
|
||||||
.LDone:
|
.LDone:
|
||||||
end;
|
end;
|
||||||
|
|
||||||
@ -127,43 +152,55 @@ var
|
|||||||
temp : qword;
|
temp : qword;
|
||||||
retaddress: ptruint;
|
retaddress: ptruint;
|
||||||
asm
|
asm
|
||||||
mr r0,r3
|
mr r0, r3
|
||||||
mr r3,r4
|
mr r3, r4
|
||||||
mr r4,r5
|
mr r4, r5
|
||||||
sc
|
sc
|
||||||
bns .LDone
|
bns .LDone
|
||||||
lis r10,(fpc_threadvar_relocate_proc)@highesta
|
lis r10, (fpc_threadvar_relocate_proc)@highesta
|
||||||
ori r10, r10, (fpc_threadvar_relocate_proc)@highera
|
ori r10, r10, (fpc_threadvar_relocate_proc)@highera
|
||||||
sldi r10, r10, 32
|
sldi r10, r10, 32
|
||||||
oris r10, r10, (fpc_threadvar_relocate_proc)@ha
|
oris r10, r10, (fpc_threadvar_relocate_proc)@ha
|
||||||
ld r10,(fpc_threadvar_relocate_proc)@l(r10)
|
ld r10, (fpc_threadvar_relocate_proc)@l(r10)
|
||||||
|
|
||||||
cmpdi r10,0
|
cmpdi r10, 0
|
||||||
bne .LThreaded
|
bne .LThreaded
|
||||||
lis r4, (Errno+8)@highesta
|
lis r4, (Errno+8)@highesta
|
||||||
ori r4, r4, (Errno+8)@highera
|
ori r4, r4, (Errno+8)@highera
|
||||||
sldi r4, r4, 32
|
sldi r4, r4, 32
|
||||||
oris r4, r4, (Errno+8)@ha
|
oris r4, r4, (Errno+8)@ha
|
||||||
stw r3,(Errno+8)@l(r4)
|
stw r3, (Errno+8)@l(r4)
|
||||||
b .LFailed
|
b .LFailed
|
||||||
.LThreaded:
|
.LThreaded:
|
||||||
std r3,temp
|
std r3, temp
|
||||||
mflr r3
|
mflr r3
|
||||||
ld r10, 0(r10)
|
// load actual function entry into r9
|
||||||
mtctr r10
|
ld r9, 0(r10)
|
||||||
lis r4, (errno)@highesta
|
// save old TOC value
|
||||||
ori r4, r4, (errno)@highera
|
std r2, 40(r1)
|
||||||
sldi r4, r4, 32
|
// move function entry into ctr
|
||||||
oris r4, r4, (errno)@ha
|
mtctr r9
|
||||||
std r3,retaddress
|
// load new TOC value
|
||||||
ld r3,(errno)@l(r4)
|
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
|
bctrl
|
||||||
ld r4,temp
|
// restore old TOC value
|
||||||
ld r5,retaddress
|
ld r2, 40(r1)
|
||||||
std r4,0(r3)
|
|
||||||
mtlr r5
|
ld r4, temp
|
||||||
|
ld r5, retaddress
|
||||||
|
std r4, 0(r3)
|
||||||
|
mtlr r5
|
||||||
.LFailed:
|
.LFailed:
|
||||||
li r3, -1
|
li r3, -1
|
||||||
.LDone:
|
.LDone:
|
||||||
end;
|
end;
|
||||||
|
|
||||||
@ -177,44 +214,57 @@ var
|
|||||||
temp : qword;
|
temp : qword;
|
||||||
retaddress: ptruint;
|
retaddress: ptruint;
|
||||||
asm
|
asm
|
||||||
mr r0,r3
|
mr r0, r3
|
||||||
mr r3,r4
|
mr r3, r4
|
||||||
mr r4,r5
|
mr r4, r5
|
||||||
mr r5,r6
|
mr r5, r6
|
||||||
sc
|
sc
|
||||||
bns .LDone
|
bns .LDone
|
||||||
lis r10,(fpc_threadvar_relocate_proc)@highesta
|
lis r10, (fpc_threadvar_relocate_proc)@highesta
|
||||||
ori r10, r10, (fpc_threadvar_relocate_proc)@highera
|
ori r10, r10, (fpc_threadvar_relocate_proc)@highera
|
||||||
sldi r10, r10, 32
|
sldi r10, r10, 32
|
||||||
oris r10, r10, (fpc_threadvar_relocate_proc)@ha
|
oris r10, r10, (fpc_threadvar_relocate_proc)@ha
|
||||||
ld r10,(fpc_threadvar_relocate_proc)@l(r10)
|
ld r10, (fpc_threadvar_relocate_proc)@l(r10)
|
||||||
|
|
||||||
cmpdi r10,0
|
cmpdi r10, 0
|
||||||
bne .LThreaded
|
bne .LThreaded
|
||||||
lis r4, (Errno+8)@highesta
|
lis r4, (Errno+8)@highesta
|
||||||
ori r4, r4, (Errno+8)@highera
|
ori r4, r4, (Errno+8)@highera
|
||||||
sldi r4, r4, 32
|
sldi r4, r4, 32
|
||||||
oris r4, r4, (Errno+8)@ha
|
oris r4, r4, (Errno+8)@ha
|
||||||
stw r3,(Errno+8)@l(r4)
|
stw r3, (Errno+8)@l(r4)
|
||||||
b .LFailed
|
b .LFailed
|
||||||
.LThreaded:
|
.LThreaded:
|
||||||
std r3,temp
|
std r3, temp
|
||||||
mflr r3
|
mflr r3
|
||||||
ld r10, 0(r10)
|
|
||||||
mtctr r10
|
// load actual function entry into r9
|
||||||
lis r4, (errno)@highesta
|
ld r9, 0(r10)
|
||||||
ori r4, r4, (errno)@highera
|
// save old TOC value
|
||||||
sldi r4, r4, 32
|
std r2, 40(r1)
|
||||||
oris r4, r4, (errno)@ha
|
// move function entry into ctr
|
||||||
std r3,retaddress
|
mtctr r9
|
||||||
ld r3,(errno)@l(r4)
|
// 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
|
bctrl
|
||||||
ld r4,temp
|
|
||||||
ld r5,retaddress
|
// restore old TOC value
|
||||||
std r4,0(r3)
|
ld r2, 40(r1)
|
||||||
mtlr r5
|
ld r4, temp
|
||||||
|
ld r5, retaddress
|
||||||
|
std r4, 0(r3)
|
||||||
|
mtlr r5
|
||||||
.LFailed:
|
.LFailed:
|
||||||
li r3, -1
|
li r3, -1
|
||||||
.LDone:
|
.LDone:
|
||||||
end;
|
end;
|
||||||
|
|
||||||
@ -228,45 +278,58 @@ var
|
|||||||
temp : qword;
|
temp : qword;
|
||||||
retaddress: ptruint;
|
retaddress: ptruint;
|
||||||
asm
|
asm
|
||||||
mr r0,r3
|
mr r0, r3
|
||||||
mr r3,r4
|
mr r3, r4
|
||||||
mr r4,r5
|
mr r4, r5
|
||||||
mr r5,r6
|
mr r5, r6
|
||||||
mr r6,r7
|
mr r6, r7
|
||||||
sc
|
sc
|
||||||
bns .LDone
|
bns .LDone
|
||||||
lis r10,(fpc_threadvar_relocate_proc)@highesta
|
lis r10, (fpc_threadvar_relocate_proc)@highesta
|
||||||
ori r10, r10, (fpc_threadvar_relocate_proc)@highera
|
ori r10, r10, (fpc_threadvar_relocate_proc)@highera
|
||||||
sldi r10, r10, 32
|
sldi r10, r10, 32
|
||||||
oris r10, r10, (fpc_threadvar_relocate_proc)@ha
|
oris r10, r10, (fpc_threadvar_relocate_proc)@ha
|
||||||
ld r10,(fpc_threadvar_relocate_proc)@l(r10)
|
ld r10, (fpc_threadvar_relocate_proc)@l(r10)
|
||||||
|
|
||||||
cmpdi r10,0
|
cmpdi r10, 0
|
||||||
bne .LThreaded
|
bne .LThreaded
|
||||||
lis r4, (Errno+8)@highesta
|
lis r4, (Errno+8)@highesta
|
||||||
ori r4, r4, (Errno+8)@highera
|
ori r4, r4, (Errno+8)@highera
|
||||||
sldi r4, r4, 32
|
sldi r4, r4, 32
|
||||||
oris r4, r4, (Errno+8)@ha
|
oris r4, r4, (Errno+8)@ha
|
||||||
stw r3,(Errno+8)@l(r4)
|
stw r3, (Errno+8)@l(r4)
|
||||||
b .LFailed
|
b .LFailed
|
||||||
.LThreaded:
|
.LThreaded:
|
||||||
std r3,temp
|
std r3, temp
|
||||||
mflr r3
|
mflr r3
|
||||||
ld r10, 0(r10)
|
|
||||||
mtctr r10
|
// load actual function entry into r9
|
||||||
lis r4, (errno)@highesta
|
ld r9, 0(r10)
|
||||||
ori r4, r4, (errno)@highera
|
// save old TOC value
|
||||||
sldi r4, r4, 32
|
std r2, 40(r1)
|
||||||
oris r4, r4, (errno)@ha
|
// move function entry into ctr
|
||||||
std r3,retaddress
|
mtctr r9
|
||||||
ld r3,(errno)@l(r4)
|
// 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
|
bctrl
|
||||||
ld r4,temp
|
|
||||||
ld r5,retaddress
|
// restore old TOC value
|
||||||
std r4,0(r3)
|
ld r2, 40(r1)
|
||||||
mtlr r5
|
ld r4, temp
|
||||||
|
ld r5, retaddress
|
||||||
|
std r4, 0(r3)
|
||||||
|
mtlr r5
|
||||||
.LFailed:
|
.LFailed:
|
||||||
li r3, -1
|
li r3, -1
|
||||||
.LDone:
|
.LDone:
|
||||||
end;
|
end;
|
||||||
|
|
||||||
@ -280,46 +343,59 @@ var
|
|||||||
temp : qword;
|
temp : qword;
|
||||||
retaddress: ptruint;
|
retaddress: ptruint;
|
||||||
asm
|
asm
|
||||||
mr r0,r3
|
mr r0, r3
|
||||||
mr r3,r4
|
mr r3, r4
|
||||||
mr r4,r5
|
mr r4, r5
|
||||||
mr r5,r6
|
mr r5, r6
|
||||||
mr r6,r7
|
mr r6, r7
|
||||||
mr r7,r8
|
mr r7, r8
|
||||||
sc
|
sc
|
||||||
bns .LDone
|
bns .LDone
|
||||||
lis r10,(fpc_threadvar_relocate_proc)@highesta
|
lis r10, (fpc_threadvar_relocate_proc)@highesta
|
||||||
ori r10, r10, (fpc_threadvar_relocate_proc)@highera
|
ori r10, r10, (fpc_threadvar_relocate_proc)@highera
|
||||||
sldi r10, r10, 32
|
sldi r10, r10, 32
|
||||||
oris r10, r10, (fpc_threadvar_relocate_proc)@ha
|
oris r10, r10, (fpc_threadvar_relocate_proc)@ha
|
||||||
ld r10,(fpc_threadvar_relocate_proc)@l(r10)
|
ld r10, (fpc_threadvar_relocate_proc)@l(r10)
|
||||||
|
|
||||||
cmpdi r10,0
|
cmpdi r10, 0
|
||||||
bne .LThreaded
|
bne .LThreaded
|
||||||
lis r4, (Errno+8)@highesta
|
lis r4, (Errno+8)@highesta
|
||||||
ori r4, r4, (Errno+8)@highera
|
ori r4, r4, (Errno+8)@highera
|
||||||
sldi r4, r4, 32
|
sldi r4, r4, 32
|
||||||
oris r4, r4, (Errno+8)@ha
|
oris r4, r4, (Errno+8)@ha
|
||||||
stw r3,(Errno+8)@l(r4)
|
stw r3, (Errno+8)@l(r4)
|
||||||
b .LFailed
|
b .LFailed
|
||||||
.LThreaded:
|
.LThreaded:
|
||||||
std r3,temp
|
std r3, temp
|
||||||
mflr r3
|
mflr r3
|
||||||
ld r10, 0(r10)
|
|
||||||
mtctr r10
|
// load actual function entry into r9
|
||||||
lis r4, (errno)@highesta
|
ld r9, 0(r10)
|
||||||
ori r4, r4, (errno)@highera
|
// save old TOC value
|
||||||
sldi r4, r4, 32
|
std r2, 40(r1)
|
||||||
oris r4, r4, (errno)@ha
|
// move function entry into ctr
|
||||||
std r3,retaddress
|
mtctr r9
|
||||||
ld r3,(errno)@l(r4)
|
// 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
|
bctrl
|
||||||
ld r4,temp
|
// restore old TOC value
|
||||||
ld r5,retaddress
|
ld r2, 40(r1)
|
||||||
std r4,0(r3)
|
|
||||||
mtlr r5
|
ld r4, temp
|
||||||
|
ld r5, retaddress
|
||||||
|
std r4, 0(r3)
|
||||||
|
mtlr r5
|
||||||
.LFailed:
|
.LFailed:
|
||||||
li r3, -1
|
li r3, -1
|
||||||
.LDone:
|
.LDone:
|
||||||
end;
|
end;
|
||||||
|
|
||||||
@ -333,46 +409,59 @@ var
|
|||||||
temp : qword;
|
temp : qword;
|
||||||
retaddress: ptruint;
|
retaddress: ptruint;
|
||||||
asm
|
asm
|
||||||
mr r0,r3
|
mr r0, r3
|
||||||
mr r3,r4
|
mr r3, r4
|
||||||
mr r4,r5
|
mr r4, r5
|
||||||
mr r5,r6
|
mr r5, r6
|
||||||
mr r6,r7
|
mr r6, r7
|
||||||
mr r7,r8
|
mr r7, r8
|
||||||
mr r8,r9
|
mr r8, r9
|
||||||
sc
|
sc
|
||||||
bns .LDone
|
bns .LDone
|
||||||
lis r10,(fpc_threadvar_relocate_proc)@highesta
|
lis r10, (fpc_threadvar_relocate_proc)@highesta
|
||||||
ori r10, r10, (fpc_threadvar_relocate_proc)@highera
|
ori r10, r10, (fpc_threadvar_relocate_proc)@highera
|
||||||
sldi r10, r10, 32
|
sldi r10, r10, 32
|
||||||
oris r10, r10, (fpc_threadvar_relocate_proc)@ha
|
oris r10, r10, (fpc_threadvar_relocate_proc)@ha
|
||||||
ld r10,(fpc_threadvar_relocate_proc)@l(r10)
|
ld r10, (fpc_threadvar_relocate_proc)@l(r10)
|
||||||
|
|
||||||
cmpdi r10,0
|
cmpdi r10, 0
|
||||||
bne .LThreaded
|
bne .LThreaded
|
||||||
lis r4, (Errno+8)@highesta
|
lis r4, (Errno+8)@highesta
|
||||||
ori r4, r4, (Errno+8)@highera
|
ori r4, r4, (Errno+8)@highera
|
||||||
sldi r4, r4, 32
|
sldi r4, r4, 32
|
||||||
oris r4, r4, (Errno+8)@ha
|
oris r4, r4, (Errno+8)@ha
|
||||||
stw r3,(Errno+8)@l(r4)
|
stw r3, (Errno+8)@l(r4)
|
||||||
b .LFailed
|
b .LFailed
|
||||||
.LThreaded:
|
.LThreaded:
|
||||||
std r3,temp
|
std r3, temp
|
||||||
mflr r3
|
mflr r3
|
||||||
ld r10, 0(r10)
|
|
||||||
mtctr r10
|
// load actual function entry into r9
|
||||||
lis r4, (errno)@highesta
|
ld r9, 0(r10)
|
||||||
ori r4, r4, (errno)@highera
|
// save old TOC value
|
||||||
sldi r4, r4, 32
|
std r2, 40(r1)
|
||||||
oris r4, r4, (errno)@ha
|
// move function entry into ctr
|
||||||
std r3,retaddress
|
mtctr r9
|
||||||
ld r3,(errno)@l(r4)
|
// 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
|
bctrl
|
||||||
ld r4,temp
|
// restore old TOC value
|
||||||
ld r5,retaddress
|
ld r2, 40(r1)
|
||||||
std r4,0(r3)
|
|
||||||
mtlr r5
|
ld r4, temp
|
||||||
|
ld r5, retaddress
|
||||||
|
std r4, 0(r3)
|
||||||
|
mtlr r5
|
||||||
.LFailed:
|
.LFailed:
|
||||||
li r3, -1
|
li r3, -1
|
||||||
.LDone:
|
.LDone:
|
||||||
end;
|
end;
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user