perlasm/x86_64-xlate.pl: clarify SEH coding guidelines.
authorAndy Polyakov <appro@openssl.org>
Fri, 3 Feb 2017 11:05:52 +0000 (12:05 +0100)
committerAndy Polyakov <appro@openssl.org>
Mon, 6 Feb 2017 07:20:46 +0000 (08:20 +0100)
Reviewed-by: Rich Salz <rsalz@openssl.org>
crypto/perlasm/x86_64-xlate.pl

index 1ae2442a70ec11aea8bd3f6fedf8899414d6085d..dd8afe73e0a75cfe8f00ec6e3ca7eeedec0921ef 100755 (executable)
@@ -1072,6 +1072,7 @@ close STDOUT;
 #      movq    -16(%rcx),%rbx
 #      movq    -8(%rcx),%r15
 #      movq    %rcx,%rsp       # restore original rsp
+# magic_epilogue:
 #      ret
 # .size function,.-function
 #
@@ -1084,11 +1085,16 @@ close STDOUT;
 # EXCEPTION_DISPOSITION handler (EXCEPTION_RECORD *rec,ULONG64 frame,
 #              CONTEXT *context,DISPATCHER_CONTEXT *disp)
 # {    ULONG64 *rsp = (ULONG64 *)context->Rax;
-#      if (context->Rip >= magic_point)
-#      {   rsp = ((ULONG64 **)context->Rsp)[0];
-#          context->Rbp = rsp[-3];
-#          context->Rbx = rsp[-2];
-#          context->R15 = rsp[-1];
+#      ULONG64  rip = context->Rip;
+#
+#      if (rip >= magic_point)
+#      {   rsp = (ULONG64 *)context->Rsp;
+#          if (rip < magic_epilogue)
+#          {   rsp = (ULONG64 *)rsp[0];
+#              context->Rbp = rsp[-3];
+#              context->Rbx = rsp[-2];
+#              context->R15 = rsp[-1];
+#          }
 #      }
 #      context->Rsp = (ULONG64)rsp;
 #      context->Rdi = rsp[1];
@@ -1180,13 +1186,12 @@ close STDOUT;
 # instruction and reflecting it in finer grade unwind logic in handler.
 # After all, isn't it why it's called *language-specific* handler...
 #
-# Attentive reader can notice that exceptions would be mishandled in
-# auto-generated "gear" epilogue. Well, exception effectively can't
-# occur there, because if memory area used by it was subject to
-# segmentation violation, then it would be raised upon call to the
-# function (and as already mentioned be accounted to caller, which is
-# not a problem). If you're still not comfortable, then define tail
-# "magic point" just prior ret instruction and have handler treat it...
+# SE handlers are also involved in unwinding stack when executable is
+# profiled or debugged. Profiling implies additional limitations that
+# are too subtle to discuss here. For now it's sufficient to say that
+# in order to simplify handlers one should either a) offload original
+# %rsp to stack (like discussed above); or b) if you have a register to
+# spare for frame pointer, choose volatile one.
 #
 # (*)  Note that we're talking about run-time, not debug-time. Lack of
 #      unwind information makes debugging hard on both Windows and