aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarcel Moolenaar <marcel@FreeBSD.org>2003-05-31 20:42:35 +0000
committerMarcel Moolenaar <marcel@FreeBSD.org>2003-05-31 20:42:35 +0000
commit62931aa266e9820ba42cb790e5037e4fbd538649 (patch)
treeb15981299d48c7adb91668280dc2f188cae082fc
parentbb0b8a23c09f8eed518261b72ea52d9846f22f9d (diff)
Notes
-rw-r--r--sys/ia64/ia64/machdep.c14
1 files changed, 12 insertions, 2 deletions
diff --git a/sys/ia64/ia64/machdep.c b/sys/ia64/ia64/machdep.c
index cc6f407e229c1..9ff50d47ce92c 100644
--- a/sys/ia64/ia64/machdep.c
+++ b/sys/ia64/ia64/machdep.c
@@ -1074,8 +1074,18 @@ exec_setregs(struct thread *td, u_long entry, u_long stack, u_long ps_strings)
if (ndirty > 0) {
__asm __volatile("mov ar.rsc=0;;");
__asm __volatile("mov %0=ar.bspstore" : "=r"(bspst));
- rssz = bspst - kstack - ndirty;
- bcopy((void*)(kstack + ndirty), (void*)kstack, rssz);
+ /*
+ * Make sure we have all the user registers written out.
+ * We're doing culculations with ndirty and ar.bspstore
+ * and we better make sure ar.bspstore >= ndirty.
+ */
+ rssz = bspst - kstack;
+ if (rssz < ndirty) {
+ __asm __volatile("flushrs;;");
+ __asm __volatile("mov %0=ar.bspstore" : "=r"(bspst));
+ rssz = bspst - kstack;
+ }
+ bcopy((void*)(kstack + ndirty), (void*)kstack, rssz - ndirty);
bspst -= ndirty;
__asm __volatile("mov ar.bspstore=%0;;" :: "r"(bspst));
__asm __volatile("mov ar.rsc=3");