This fixes a bug found and fixed by JC. Basically

no save was being done of the ra and gp pointers
before we call the __error function.

Obtained from:	JC (c.jayachandran@gmail.com)
This commit is contained in:
Randall Stewart 2010-02-03 12:59:44 +00:00
parent 4c9d5e6b0f
commit 1de48bf3a3

View File

@ -42,14 +42,26 @@ __FBSDID("$FreeBSD$");
#endif /* LIBC_SCCS and not lint */
LEAF(ptrace)
.frame sp,40,ra
.mask 0x80000000, -8
#ifdef __ABICALLS__
.set noreorder
.cpload t9
.set reorder
#endif
subu sp, sp, 40
sw ra, 32(sp)
#ifdef __ABICALLS__
.cprestore 16
#endif
la t9, _C_LABEL(__error) # locate address of errno
jalr t9
jalr t9
#ifdef __ABICALLS__
lw gp, 16(sp)
#endif
sw zero, 0(v0)
lw ra, 32(sp)
addu sp, sp, 40
li v0, SYS_ptrace
syscall
bne a3, zero, 1f