From 4b90ce9b60b31bd0d0cbceb17532b5c810912f88 Mon Sep 17 00:00:00 2001 From: Alex Brainman Date: Sat, 1 Aug 2020 18:10:44 +1000 Subject: [PATCH] windows/svc: align stack in servicemain before calling syscall I noticed that we call syscall in servicemain without aligning stack. That is against Windows rules, so align the stack as required. I tried running this code with specifically non-aligned stack (I aligned stack, and then subtracted 1 from SP) on my Windows 10 to test this change. But it makes no difference on my Windows 10 PC - I built and run golang.org/x/sys/windows/svc/example, and it runs successfully regardless of stack alignment. But alignment might make difference on other computers. Maybe fixes golang/go#40160 Change-Id: I351f7f730fba4aa6dc409a79de4ad737b4a0a7d4 Reviewed-on: https://go-review.googlesource.com/c/sys/+/246317 Run-TryBot: Alex Brainman TryBot-Result: Gobot Gobot Reviewed-by: Ian Lance Taylor --- windows/svc/sys_amd64.s | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/windows/svc/sys_amd64.s b/windows/svc/sys_amd64.s index 2f7609c5b..3d4df0c3d 100644 --- a/windows/svc/sys_amd64.s +++ b/windows/svc/sys_amd64.s @@ -6,11 +6,15 @@ // func servicemain(argc uint32, argv **uint16) TEXT ·servicemain(SB),7,$0 + MOVQ SP, AX + ANDQ $~15, SP // alignment as per Windows requirement + SUBQ $48, SP // room for SP and 4 args as per Windows requirement + // plus one extra word to keep stack 16 bytes aligned + MOVQ AX, 32(SP) + MOVL CX, ·sArgc(SB) MOVQ DX, ·sArgv(SB) - SUBQ $32, SP // stack for the first 4 syscall params - MOVQ ·sName(SB), CX MOVQ $·servicectlhandler(SB), DX // BUG(pastarmovj): Figure out a way to pass in context in R8. @@ -32,7 +36,7 @@ TEXT ·servicemain(SB),7,$0 CALL AX exit: - ADDQ $32, SP + MOVQ 32(SP), SP RET // I do not know why, but this seems to be the only way to call