perlasm/x86_64-xlate.pl: clarify SEH coding guidelines.
Reviewed-by: Rich Salz <rsalz@openssl.org>
This commit is contained in:
parent
fe4075f259
commit
e1dbf7f431
1 changed files with 17 additions and 12 deletions
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue