From 1021caa3950b8e7c5c739a24d7839468c7bf062a Mon Sep 17 00:00:00 2001 From: cinap_lenrek Date: Mon, 21 Jul 2014 18:02:14 +0200 Subject: pc64: cleanup syscallentry() avoid the stack shuffeling and make syscallentry() and forkret() use the same stack offsets. --- sys/src/9/pc64/l.s | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) (limited to 'sys/src') 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 */ -- cgit v1.2.3