summaryrefslogtreecommitdiffstats
path: root/sys/alpha
diff options
context:
space:
mode:
authordeischen <deischen@FreeBSD.org>2003-04-25 01:50:30 +0000
committerdeischen <deischen@FreeBSD.org>2003-04-25 01:50:30 +0000
commit3d51b3a2809784a3fd4e35c34422c2f82d8fd818 (patch)
treebb8eb253f377c8996df874bb13ce8f388ab880c7 /sys/alpha
parentaf0b381b9f2eb4edc2bbd4c4d7b902ed42d913d7 (diff)
downloadFreeBSD-src-3d51b3a2809784a3fd4e35c34422c2f82d8fd818.zip
FreeBSD-src-3d51b3a2809784a3fd4e35c34422c2f82d8fd818.tar.gz
Add an argument to get_mcontext() which specified whether the
syscall return values should be cleared. The system calls getcontext() and swapcontext() want to return 0 on success but these contexts can be switched to at a later time so the return values need to be cleared in the saved register sets. Other callers of get_mcontext() would normally want the context without clearing the return values. Remove the i386-specific context saving from the KSE code. get_mcontext() is not i386-specific any more. Fix a bad pointer in the alpha get_mcontext() code. The context was being bcopy()'d from &td->tf_frame, but tf_frame is itself a pointer, so the thread was being copied instead. Spotted by jake. Glanced at by: jake Reviewed by: bde (months ago)
Diffstat (limited to 'sys/alpha')
-rw-r--r--sys/alpha/alpha/machdep.c10
1 files changed, 7 insertions, 3 deletions
diff --git a/sys/alpha/alpha/machdep.c b/sys/alpha/alpha/machdep.c
index c7e8c8c..1efc6b9 100644
--- a/sys/alpha/alpha/machdep.c
+++ b/sys/alpha/alpha/machdep.c
@@ -1977,13 +1977,17 @@ set_regs(td, regs)
}
int
-get_mcontext(struct thread *td, mcontext_t *mcp)
+get_mcontext(struct thread *td, mcontext_t *mcp, int clear_ret)
{
/*
* Use a trapframe for getsetcontext, so just copy the
* threads trapframe.
*/
- bcopy(&td->td_frame, &mcp->mc_regs, sizeof(td->td_frame));
+ bcopy(td->td_frame, &mcp->mc_regs, sizeof(struct trapframe));
+ if (clear_ret != 0) {
+ mcp->mc_regs[FRAME_V0] = 0;
+ mcp->mc_regs[FRAME_A4] = 0;
+ }
/*
* When the thread is the current thread, the user stack pointer
@@ -2029,7 +2033,7 @@ set_mcontext(struct thread *td, const mcontext_t *mcp)
* The context is a trapframe, so just copy it over the
* threads frame.
*/
- bcopy(&mcp->mc_regs, &td->td_frame, sizeof(td->td_frame));
+ bcopy(&mcp->mc_regs, td->td_frame, sizeof(struct trapframe));
}
return (0);
}
OpenPOWER on IntegriCloud