diff options
| author | Marcel Moolenaar <marcel@FreeBSD.org> | 2003-05-31 20:42:35 +0000 |
|---|---|---|
| committer | Marcel Moolenaar <marcel@FreeBSD.org> | 2003-05-31 20:42:35 +0000 |
| commit | 62931aa266e9820ba42cb790e5037e4fbd538649 (patch) | |
| tree | b15981299d48c7adb91668280dc2f188cae082fc | |
| parent | bb0b8a23c09f8eed518261b72ea52d9846f22f9d (diff) | |
Notes
| -rw-r--r-- | sys/ia64/ia64/machdep.c | 14 |
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"); |
