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