diff options
| author | Peter Wemm <peter@FreeBSD.org> | 2003-06-02 21:56:08 +0000 |
|---|---|---|
| committer | Peter Wemm <peter@FreeBSD.org> | 2003-06-02 21:56:08 +0000 |
| commit | babc58fd749a5bef05f6861e9ae3b86ed01c8bf7 (patch) | |
| tree | 8afdc45e166e9dbfabb5cc78ea699d5505295862 /sys | |
| parent | c35518b4ed716088dc485300b4dcb9118f5ac042 (diff) | |
Notes
Diffstat (limited to 'sys')
| -rw-r--r-- | sys/amd64/amd64/trap.c | 8 |
1 files changed, 6 insertions, 2 deletions
diff --git a/sys/amd64/amd64/trap.c b/sys/amd64/amd64/trap.c index 72ba59037804..c4e7f16e991b 100644 --- a/sys/amd64/amd64/trap.c +++ b/sys/amd64/amd64/trap.c @@ -751,10 +751,14 @@ syscall(frame) case ERESTART: /* - * Reconstruct pc, assuming lcall $X,y is 7 bytes, - * int 0x80 is 2 bytes. We saved this in tf_err. + * Reconstruct pc, we know that 'syscall' is 2 bytes. + * We have to do a full context restore so that %r10 + * (which was holding the value of %rcx) is restored for + * the next iteration. */ frame.tf_rip -= frame.tf_err; + frame.tf_r10 = frame.tf_rcx; + td->td_pcb->pcb_flags |= PCB_FULLCTX; break; case EJUSTRETURN: |
