diff options
author | cinap_lenrek <cinap_lenrek@felloff.net> | 2014-07-21 18:02:14 +0200 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@felloff.net> | 2014-07-21 18:02:14 +0200 |
commit | 1021caa3950b8e7c5c739a24d7839468c7bf062a (patch) | |
tree | 8d2b442a35371bd9a5d34688a08af44383c142f4 | |
parent | c78c6e349ae55d4964142780f957a9a3488b0789 (diff) |
pc64: cleanup syscallentry()
avoid the stack shuffeling and make syscallentry() and
forkret() use the same stack offsets.
-rw-r--r-- | sys/src/9/pc64/l.s | 28 |
1 files changed, 14 insertions, 14 deletions
diff --git a/sys/src/9/pc64/l.s b/sys/src/9/pc64/l.s index 996204897..f4c066a3c 100644 --- a/sys/src/9/pc64/l.s +++ b/sys/src/9/pc64/l.s @@ -711,33 +711,33 @@ TEXT syscallentry(SB), 1, $-4 PUSHQ R11 /* old flags */ PUSHQ $UESEL /* old code segment */ PUSHQ CX /* old ip */ - SUBQ $(16+16*8), SP /* unsaved registers */ - MOVQ RMACH, (14*8)(SP) - MOVQ RUSER, (13*8)(SP) + SUBQ $(8 + 23*8-5*8), SP /* arg + sizeof(Ureg)-pushed */ - MOVQ RARG, (6*8)(SP) /* system call number */ + MOVQ RMACH, (15*8)(SP) /* old r15 */ + MOVQ RUSER, (14*8)(SP) /* old r14 */ + + MOVQ RARG, (7*8)(SP) /* system call number */ MOVQ AX, RMACH /* m */ MOVQ BX, RUSER /* up */ - MOVQ SP, RARG - PUSHQ SP + LEAQ 8(SP), RARG /* Ureg* arg */ + CALL syscall(SB) TEXT forkret(SB), 1, $-4 - MOVQ 8(SP), AX - ADDQ $(8+13*8), SP /* unsaved registers */ - CLI SWAPGS - MOVQ 8(SP), RMACH - MOVQ 0(SP), RUSER + MOVQ 8(SP), AX /* return value */ + + MOVQ (15*8)(SP), RMACH /* r15 */ + MOVQ (14*8)(SP), RUSER /* r14 */ - MOVQ 40(SP), CX /* ip */ - MOVQ 56(SP), R11 /* flags */ - MOVQ 64(SP), SP /* sp */ + MOVQ (19*8)(SP), CX /* ip */ + MOVQ (21*8)(SP), R11 /* flags */ + MOVQ (22*8)(SP), SP /* sp */ BYTE $0x48; SYSRET /* SYSRETQ */ |