unw_resume - Man Page

resume execution in a particular stack frame

Synopsis

#include <libunwind.h>

int unw_resume(unw_cursor_t *cp);

Description

The unw_resume() routine resumes execution at the stack frame  identified by cp​. The behavior of this routine differs  slightly for local and remote unwinding.

For local unwinding, unw_resume() restores the machine state  and then directly resumes execution in the target stack frame. Thus  unw_resume() does not return in this case. Restoring the  machine state normally involves restoring the “preserved​”  (callee-saved) registers. However, if execution in any of the stack  frames younger (more deeply nested) than the one identified by  cp was interrupted by a signal, then unw_resume() will  restore all registers as well as the signal mask. Attempting to call  unw_resume() on a cursor which identifies the stack frame of  another thread results in undefined behavior (e.g., the program may  crash).

For remote unwinding, unw_resume() installs the machine state  identified by the cursor by calling the access_reg and  access_fpreg accessor callbacks as needed. Once that is  accomplished, the resume accessor callback is invoked. The  unw_resume routine then returns normally (that is, unlikely  for local unwinding, unw_resume will always return for remote  unwinding).

Most platforms reserve some registers to pass arguments to exception  handlers (e.g., IA-64 uses r15-r18 for this  purpose). These registers are normally treated like “scratch​”  registers. However, if libunwind is used to set an exception  argument register to a particular value (e.g., via  unw_set_reg()), then unw_resume() will install this  value as the contents of the register. In other words, the exception  handling arguments are installed even in cases where normally only the  “preserved​” registers are restored.

Note that unw_resume() does not invoke any unwind  handlers (aka, “personality routines​”). If a program needs this, it  will have to do so on its own by obtaining the unw_proc_info_t of each unwound frame and appropriately processing its unwind handler  and language-specific data area (lsda). These steps are generally  dependent on the target platform and are regulated by the  processor-specific ABI (application-binary interface).

Return Value

For local unwinding, unw_resume() does not return on success.  For remote unwinding, it returns 0 on success. On failure, the  negative value of one of the errors below is returned.

Thread and Signal Safety

unw_resume() is thread-safe. If cursor cp is in the  local address-space, this routine is also safe to use from a signal  handler.

Errors

UNW_EUNSPEC

An unspecified error occurred.

UNW_EBADREG

A register needed by unw_resume() wasn​'t  accessible.

UNW_EINVALIDIP

The instruction pointer identified by  cp is not valid.

UNW_BADFRAME

The stack frame identified by  cp is not valid.

See Also

libunwind(3libunwind), unw_set_reg(3libunwind), sigprocmask(2)

Author

David Mosberger-Tang
Email: dmosberger@gmail.com
WWW: http://www.nongnu.org/libunwind/​.

Info

29 August 2023 Programming Library