* 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:
tom_at_work 2006-07-16 19:22:31 +00:00
parent c8b0d1ae2d
commit 2b8d704238

View File

@ -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;