diff options
author | cvs2svn <> | 2013-06-05 11:57:40 +0400 |
---|---|---|
committer | cvs2svn <> | 2013-06-05 11:57:40 +0400 |
commit | 310a2eeef1d094d59ea9897be0ddb1b33869b885 (patch) | |
tree | 6c061f692be2a0be45d81351d4b9dfc06ec9fe9c /winsup/cygwin/exceptions.cc | |
parent | c82eac05c783fa1cb82eac9216dab1ed8aa482ae (diff) |
This commit was manufactured by cvs2svn to create tag 'cygwin-cygwin-1_7_19-release
1_7_19-release'.
Sprout from cygwin-64bit-premerge-branch 2013-04-22 17:11:23 UTC cvs2svn 'This commit was manufactured by cvs2svn to create branch 'cygwin-64bit-'
Cherrypick from master 2013-06-05 07:57:39 UTC Corinna Vinschen <corinna@vinschen.de> ' * faq-programming.xml: Convert url to refer to new flat faq.html file.':
COPYING.NEWLIB
ChangeLog
config.guess
config.sub
config/ChangeLog
config/bootstrap-asan.mk
config/dfp.m4
config/picflag.m4
include/ChangeLog
include/elf/ChangeLog
include/elf/aarch64.h
include/elf/common.h
include/elf/mips.h
include/elf/msp430.h
include/opcode/ChangeLog
include/opcode/avr.h
include/opcode/mips.h
include/opcode/msp430.h
newlib/ChangeLog
newlib/MAINTAINERS
newlib/configure
newlib/configure.host
newlib/configure.in
newlib/libc/configure
newlib/libc/configure.in
newlib/libc/ctype/ctype_.c
newlib/libc/ctype/isalnum.c
newlib/libc/ctype/isalpha.c
newlib/libc/ctype/isblank.c
newlib/libc/ctype/iscntrl.c
newlib/libc/ctype/isdigit.c
newlib/libc/ctype/islower.c
newlib/libc/ctype/isprint.c
newlib/libc/ctype/ispunct.c
newlib/libc/ctype/isxdigit.c
newlib/libc/include/machine/ieeefp.h
newlib/libc/include/machine/setjmp.h
newlib/libc/include/reent.h
newlib/libc/include/sys/cdefs.h
newlib/libc/include/sys/config.h
newlib/libc/include/sys/features.h
newlib/libc/include/sys/reent.h
newlib/libc/include/sys/stat.h
newlib/libc/libc.texinfo
newlib/libc/machine/arm/Makefile.am
newlib/libc/machine/arm/Makefile.in
newlib/libc/machine/arm/memcpy-armv7a.S
newlib/libc/machine/arm/memcpy-armv7m.S
newlib/libc/machine/arm/memcpy-stub.c
newlib/libc/machine/arm/memcpy.S
newlib/libc/machine/arm/strcmp.S
newlib/libc/machine/configure
newlib/libc/machine/configure.in
newlib/libc/machine/powerpc/Makefile.am
newlib/libc/machine/powerpc/Makefile.in
newlib/libc/reent/reent.c
newlib/libc/stdio/fgetc.c
newlib/libc/stdio/fgetwc.c
newlib/libc/stdio/fgetws.c
newlib/libc/stdio/findfp.c
newlib/libc/stdio/fputc.c
newlib/libc/stdio/fputwc.c
newlib/libc/stdio/fputws.c
newlib/libc/stdio/getc.c
newlib/libc/stdio/getchar.c
newlib/libc/stdio/local.h
newlib/libc/stdio/putc.c
newlib/libc/stdio/putchar.c
newlib/libc/stdio/scanf.c
newlib/libc/stdio/setvbuf.c
newlib/libc/stdio/ungetwc.c
newlib/libc/stdio/vfscanf.c
newlib/libc/stdio/vfwscanf.c
newlib/libc/stdio/viprintf.c
newlib/libc/stdio/viscanf.c
newlib/libc/stdio/vprintf.c
newlib/libc/stdio/vscanf.c
newlib/libc/stdio/vwprintf.c
newlib/libc/stdio/vwscanf.c
newlib/libc/stdio/wscanf.c
newlib/libc/stdlib/Makefile.am
newlib/libc/stdlib/Makefile.in
newlib/libc/stdlib/__atexit.c
newlib/libc/stdlib/__call_atexit.c
newlib/libc/stdlib/ecvtbuf.c
newlib/libc/stdlib/mblen.c
newlib/libc/stdlib/mbrlen.c
newlib/libc/stdlib/mbrtowc.c
newlib/libc/stdlib/mbtowc.c
newlib/libc/stdlib/nano-mallocr.c
newlib/libc/stdlib/rand.c
newlib/libc/stdlib/strtod.c
newlib/libc/stdlib/wcrtomb.c
newlib/libc/stdlib/wctob.c
newlib/libc/stdlib/wctomb.c
newlib/libc/string/strtok.c
newlib/libc/time/asctime.c
newlib/libc/time/gmtime.c
newlib/libc/time/lcltime.c
newlib/libm/libm.texinfo
winsup/cygserver/ChangeLog
winsup/cygserver/ChangeLog.64bit
winsup/cygserver/Makefile.in
winsup/cygserver/bsd_helper.cc
winsup/cygserver/bsd_helper.h
winsup/cygserver/bsd_log.cc
winsup/cygserver/bsd_log.h
winsup/cygserver/bsd_mutex.cc
winsup/cygserver/client.cc
winsup/cygserver/cygserver.cc
winsup/cygserver/msg.cc
winsup/cygserver/process.h
winsup/cygserver/sem.cc
winsup/cygserver/shm.cc
winsup/cygserver/sysv_shm.cc
winsup/cygserver/threaded_queue.h
winsup/cygwin/ChangeLog
winsup/cygwin/ChangeLog.64bit
winsup/cygwin/Makefile.in
winsup/cygwin/aclocal.m4
winsup/cygwin/advapi32.cc
winsup/cygwin/autoload.cc
winsup/cygwin/automode.c
winsup/cygwin/binmode.c
winsup/cygwin/child_info.h
winsup/cygwin/common.din
winsup/cygwin/configure
winsup/cygwin/configure.ac
winsup/cygwin/cpuid.h
winsup/cygwin/cygerrno.h
winsup/cygwin/cygheap.cc
winsup/cygwin/cygheap.h
winsup/cygwin/cygmagic
winsup/cygwin/cygmalloc.h
winsup/cygwin/cygserver.h
winsup/cygwin/cygserver_ipc.h
winsup/cygwin/cygthread.cc
winsup/cygwin/cygtls.cc
winsup/cygwin/cygtls.h
winsup/cygwin/cygwin.sc.in
winsup/cygwin/dcrt0.cc
winsup/cygwin/debug.h
winsup/cygwin/devices.cc
winsup/cygwin/devices.h
winsup/cygwin/devices.in
winsup/cygwin/dir.cc
winsup/cygwin/dlfcn.cc
winsup/cygwin/dll_init.cc
winsup/cygwin/dll_init.h
winsup/cygwin/dtable.cc
winsup/cygwin/environ.cc
winsup/cygwin/environ.h
winsup/cygwin/errno.cc
winsup/cygwin/exception.h
winsup/cygwin/exceptions.cc
winsup/cygwin/external.cc
winsup/cygwin/fcntl.cc
winsup/cygwin/fenv.cc
winsup/cygwin/fhandler.cc
winsup/cygwin/fhandler.h
winsup/cygwin/fhandler_clipboard.cc
winsup/cygwin/fhandler_console.cc
winsup/cygwin/fhandler_dev.cc
winsup/cygwin/fhandler_disk_file.cc
winsup/cygwin/fhandler_dsp.cc
winsup/cygwin/fhandler_fifo.cc
winsup/cygwin/fhandler_floppy.cc
winsup/cygwin/fhandler_mailslot.cc
winsup/cygwin/fhandler_mem.cc
winsup/cygwin/fhandler_netdrive.cc
winsup/cygwin/fhandler_proc.cc
winsup/cygwin/fhandler_process.cc
winsup/cygwin/fhandler_procnet.cc
winsup/cygwin/fhandler_procsys.cc
winsup/cygwin/fhandler_procsysvipc.cc
winsup/cygwin/fhandler_random.cc
winsup/cygwin/fhandler_raw.cc
winsup/cygwin/fhandler_registry.cc
winsup/cygwin/fhandler_serial.cc
winsup/cygwin/fhandler_socket.cc
winsup/cygwin/fhandler_tape.cc
winsup/cygwin/fhandler_termios.cc
winsup/cygwin/fhandler_tty.cc
winsup/cygwin/fhandler_virtual.cc
winsup/cygwin/fhandler_virtual.h
winsup/cygwin/fhandler_windows.cc
winsup/cygwin/fhandler_zero.cc
winsup/cygwin/flock.cc
winsup/cygwin/fork.cc
winsup/cygwin/gendef
winsup/cygwin/gentls_offsets
winsup/cygwin/glob.cc
winsup/cygwin/globals.cc
winsup/cygwin/grp.cc
winsup/cygwin/heap.cc
winsup/cygwin/hookapi.cc
winsup/cygwin/i686.din
winsup/cygwin/include/a.out.h
winsup/cygwin/include/asm/byteorder.h
winsup/cygwin/include/bits/wordsize.h
winsup/cygwin/include/cygwin/acl.h
winsup/cygwin/include/cygwin/config.h
winsup/cygwin/include/cygwin/cygwin_dll.h
winsup/cygwin/include/cygwin/grp.h
winsup/cygwin/include/cygwin/if.h
winsup/cygwin/include/cygwin/ipc.h
winsup/cygwin/include/cygwin/msg.h
winsup/cygwin/include/cygwin/sem.h
winsup/cygwin/include/cygwin/shm.h
winsup/cygwin/include/cygwin/signal.h
winsup/cygwin/include/cygwin/socket.h
winsup/cygwin/include/cygwin/stat.h
winsup/cygwin/include/cygwin/stdlib.h
winsup/cygwin/include/cygwin/sysproto.h
winsup/cygwin/include/cygwin/time.h
winsup/cygwin/include/cygwin/types.h
winsup/cygwin/include/cygwin/version.h
winsup/cygwin/include/fcntl.h
winsup/cygwin/include/fts.h
winsup/cygwin/include/ftw.h
winsup/cygwin/include/glob.h
winsup/cygwin/include/inttypes.h
winsup/cygwin/include/io.h
winsup/cygwin/include/limits.h
winsup/cygwin/include/mntent.h
winsup/cygwin/include/stdint.h
winsup/cygwin/include/sys/cygwin.h
winsup/cygwin/include/sys/dirent.h
winsup/cygwin/include/sys/resource.h
winsup/cygwin/include/sys/socket.h
winsup/cygwin/include/sys/strace.h
winsup/cygwin/init.cc
winsup/cygwin/ioctl.cc
winsup/cygwin/ipc.cc
winsup/cygwin/kernel32.cc
winsup/cygwin/lc_msg.h
winsup/cygwin/lib/_cygwin_crt0_common.cc
winsup/cygwin/lib/crt0.h
winsup/cygwin/lib/cygwin_attach_dll.c
winsup/cygwin/lib/premain0.c
winsup/cygwin/lib/premain1.c
winsup/cygwin/lib/premain2.c
winsup/cygwin/lib/premain3.c
winsup/cygwin/libc/arc4random.cc
winsup/cygwin/libc/base64.c
winsup/cygwin/libc/bsdlib.cc
winsup/cygwin/libc/fts.c
winsup/cygwin/libc/ftw.c
winsup/cygwin/libc/inet_network.c
winsup/cygwin/libc/minires-os-if.c
winsup/cygwin/libc/minires.c
winsup/cygwin/libc/nftw.c
winsup/cygwin/libc/rcmd.cc
winsup/cygwin/libc/rexec.cc
winsup/cygwin/libstdcxx_wrapper.cc
winsup/cygwin/localtime.cc
winsup/cygwin/malloc_wrapper.cc
winsup/cygwin/miscfuncs.cc
winsup/cygwin/mkimport
winsup/cygwin/mktemp.cc
winsup/cygwin/mmap.cc
winsup/cygwin/mount.cc
winsup/cygwin/mount.h
winsup/cygwin/msg.cc
winsup/cygwin/mtinfo.h
winsup/cygwin/net.cc
winsup/cygwin/netdb.cc
winsup/cygwin/nfs.h
winsup/cygwin/nlsfuncs.cc
winsup/cygwin/ntdll.h
winsup/cygwin/ntea.cc
winsup/cygwin/passwd.cc
winsup/cygwin/path.cc
winsup/cygwin/path.h
winsup/cygwin/perprocess.h
winsup/cygwin/pinfo.cc
winsup/cygwin/pinfo.h
winsup/cygwin/pipe.cc
winsup/cygwin/poll.cc
winsup/cygwin/posix.sgml
winsup/cygwin/posix_ipc.cc
winsup/cygwin/profil.c
winsup/cygwin/profil.h
winsup/cygwin/pseudo-reloc.cc
winsup/cygwin/pwdgrp.h
winsup/cygwin/regex/engine.c
winsup/cygwin/regex/regcomp.c
winsup/cygwin/registry.cc
winsup/cygwin/regparm.h
winsup/cygwin/release/1.7.19
winsup/cygwin/resource.cc
winsup/cygwin/sched.cc
winsup/cygwin/sec_acl.cc
winsup/cygwin/sec_auth.cc
winsup/cygwin/sec_helper.cc
winsup/cygwin/security.cc
winsup/cygwin/security.h
winsup/cygwin/select.cc
winsup/cygwin/select.h
winsup/cygwin/sem.cc
winsup/cygwin/shared.cc
winsup/cygwin/shared_info.h
winsup/cygwin/shm.cc
winsup/cygwin/signal.cc
winsup/cygwin/sigproc.cc
winsup/cygwin/sigproc.h
winsup/cygwin/smallprint.cc
winsup/cygwin/spawn.cc
winsup/cygwin/speclib
winsup/cygwin/spinlock.h
winsup/cygwin/strace.cc
winsup/cygwin/strfuncs.cc
winsup/cygwin/strsig.cc
winsup/cygwin/sync.cc
winsup/cygwin/sync.h
winsup/cygwin/syscalls.cc
winsup/cygwin/sysconf.cc
winsup/cygwin/syslog.cc
winsup/cygwin/termios.cc
winsup/cygwin/textmode.c
winsup/cygwin/textreadmode.c
winsup/cygwin/thread.cc
winsup/cygwin/thread.h
winsup/cygwin/timer.cc
winsup/cygwin/times.cc
winsup/cygwin/tlsoffsets.h
winsup/cygwin/tlsoffsets64.h
winsup/cygwin/tty.cc
winsup/cygwin/tty.h
winsup/cygwin/uinfo.cc
winsup/cygwin/wait.cc
winsup/cygwin/winbase.h
winsup/cygwin/wincap.cc
winsup/cygwin/wincap.h
winsup/cygwin/window.cc
winsup/cygwin/winlean.h
winsup/cygwin/winsup.h
winsup/cygwin/wow64.cc
winsup/cygwin/wow64.h
winsup/cygwin/x86_64.din
winsup/doc/.cvsignore
winsup/doc/ChangeLog
winsup/doc/Makefile.in
winsup/doc/Wishlist
winsup/doc/bodysnatcher.pl
winsup/doc/configure
winsup/doc/configure.ac
winsup/doc/cygserver.xml
winsup/doc/cygwin-api.in.xml
winsup/doc/cygwin-ug-net.xml
winsup/doc/cygwin.xsl
winsup/doc/cygwinenv.xml
winsup/doc/dll.xml
winsup/doc/effectively.xml
winsup/doc/faq-api.xml
winsup/doc/faq-copyright.xml
winsup/doc/faq-programming.xml
winsup/doc/faq-resources.xml
winsup/doc/faq-setup.xml
winsup/doc/faq-using.xml
winsup/doc/faq-what.xml
winsup/doc/faq.xml
winsup/doc/filemodes.xml
winsup/doc/gcc.xml
winsup/doc/gdb.xml
winsup/doc/highlights.xml
winsup/doc/legal.xml
winsup/doc/new-features.xml
winsup/doc/ntsec.xml
winsup/doc/ov-ex-unix.xml
winsup/doc/ov-ex-win.xml
winsup/doc/overview.xml
winsup/doc/pathnames.xml
winsup/doc/programming.xml
winsup/doc/setup-env.xml
winsup/doc/setup-files.xml
winsup/doc/setup-locale.xml
winsup/doc/setup-maxmem.xml
winsup/doc/setup-net.xml
winsup/doc/specialnames.xml
winsup/doc/textbinary.xml
winsup/doc/ug-info.xml
winsup/doc/using.xml
winsup/doc/windres.xml
winsup/doc/xidepend
winsup/lsaauth/ChangeLog
winsup/lsaauth/ChangeLog.64bit
winsup/lsaauth/Makefile.in
winsup/lsaauth/configure
winsup/lsaauth/configure.ac
winsup/utils/ChangeLog
winsup/utils/ChangeLog.64bit
winsup/utils/Makefile.in
winsup/utils/aclocal.m4
winsup/utils/configure
winsup/utils/cygcheck.cc
winsup/utils/dumper.cc
winsup/utils/dumper.h
winsup/utils/kill.cc
winsup/utils/ldd.cc
winsup/utils/locale.cc
winsup/utils/mkgroup.c
winsup/utils/mkpasswd.c
winsup/utils/module_info.cc
winsup/utils/mount.cc
winsup/utils/parse_pe.cc
winsup/utils/passwd.c
winsup/utils/path.cc
winsup/utils/ps.cc
winsup/utils/regtool.cc
winsup/utils/ssp.c
winsup/utils/strace.cc
winsup/utils/tzset.c
winsup/utils/utils.xml
Delete:
COPYING3
COPYING3.LIB
config.rpath
configure.ac
ltgcc.m4
newlib/libc/machine/aarch64/Makefile.am
newlib/libc/machine/aarch64/Makefile.in
newlib/libc/machine/aarch64/aclocal.m4
newlib/libc/machine/aarch64/configure
newlib/libc/machine/aarch64/configure.in
newlib/libc/machine/aarch64/memcmp-stub.c
newlib/libc/machine/aarch64/memcmp.S
newlib/libc/machine/aarch64/memcpy-stub.c
newlib/libc/machine/aarch64/memcpy.S
newlib/libc/machine/aarch64/memmove-stub.c
newlib/libc/machine/aarch64/memmove.S
newlib/libc/machine/aarch64/memset-stub.c
newlib/libc/machine/aarch64/memset.S
newlib/libc/machine/aarch64/setjmp.S
newlib/libc/machine/aarch64/strcmp-stub.c
newlib/libc/machine/aarch64/strcmp.S
newlib/libc/machine/aarch64/strlen-stub.c
newlib/libc/machine/aarch64/strlen.S
newlib/libc/machine/aarch64/strncmp-stub.c
newlib/libc/machine/aarch64/strncmp.S
newlib/libc/machine/aarch64/strnlen-stub.c
newlib/libc/machine/aarch64/strnlen.S
newlib/libc/machine/epiphany/Makefile.am
newlib/libc/machine/epiphany/Makefile.in
newlib/libc/machine/epiphany/aclocal.m4
newlib/libc/machine/epiphany/configure
newlib/libc/machine/epiphany/configure.in
newlib/libc/machine/epiphany/machine/stdlib.h
newlib/libc/machine/epiphany/setjmp.S
newlib/libc/machine/powerpc/times.c
newlib/libc/sys/epiphany/Makefile.am
newlib/libc/sys/epiphany/Makefile.in
newlib/libc/sys/epiphany/aclocal.m4
newlib/libc/sys/epiphany/configure
newlib/libc/sys/epiphany/configure.in
newlib/libc/sys/epiphany/e_printf.c
newlib/libm/machine/aarch64/Makefile.am
newlib/libm/machine/aarch64/Makefile.in
newlib/libm/machine/aarch64/aclocal.m4
newlib/libm/machine/aarch64/configure
newlib/libm/machine/aarch64/configure.in
newlib/libm/machine/aarch64/s_ceil.c
newlib/libm/machine/aarch64/s_floor.c
newlib/libm/machine/aarch64/s_fma.c
newlib/libm/machine/aarch64/s_fmax.c
newlib/libm/machine/aarch64/s_fmin.c
newlib/libm/machine/aarch64/s_llrint.c
newlib/libm/machine/aarch64/s_llround.c
newlib/libm/machine/aarch64/s_lrint.c
newlib/libm/machine/aarch64/s_lround.c
newlib/libm/machine/aarch64/s_nearbyint.c
newlib/libm/machine/aarch64/s_rint.c
newlib/libm/machine/aarch64/s_round.c
newlib/libm/machine/aarch64/s_trunc.c
newlib/libm/machine/aarch64/sf_ceil.c
newlib/libm/machine/aarch64/sf_floor.c
newlib/libm/machine/aarch64/sf_fma.c
newlib/libm/machine/aarch64/sf_fmax.c
newlib/libm/machine/aarch64/sf_fmin.c
newlib/libm/machine/aarch64/sf_llrint.c
newlib/libm/machine/aarch64/sf_llround.c
newlib/libm/machine/aarch64/sf_lrint.c
newlib/libm/machine/aarch64/sf_lround.c
newlib/libm/machine/aarch64/sf_nearbyint.c
newlib/libm/machine/aarch64/sf_rint.c
newlib/libm/machine/aarch64/sf_round.c
newlib/libm/machine/aarch64/sf_trunc.c
winsup/cygwin/cygwin.din
winsup/cygwin/cygwin.sc
winsup/doc/cygserver.sgml
winsup/doc/cygwin-api.in.sgml
winsup/doc/cygwin-ug-net.in.sgml
winsup/doc/cygwin-ug.in.sgml
winsup/doc/cygwin.dsl
winsup/doc/cygwinenv.sgml
winsup/doc/dll.sgml
winsup/doc/effectively.sgml
winsup/doc/faq-sections.xml
winsup/doc/filemodes.sgml
winsup/doc/gcc.sgml
winsup/doc/gdb.sgml
winsup/doc/legal.sgml
winsup/doc/new-features.sgml
winsup/doc/ntsec.sgml
winsup/doc/overview.sgml
winsup/doc/overview2.sgml
winsup/doc/pathnames.sgml
winsup/doc/programming.sgml
winsup/doc/setup-net.sgml
winsup/doc/setup.sgml
winsup/doc/setup2.sgml
winsup/doc/textbinary.sgml
winsup/doc/using.sgml
winsup/doc/windres.sgml
winsup/utils/utils.sgml
Diffstat (limited to 'winsup/cygwin/exceptions.cc')
-rw-r--r-- | winsup/cygwin/exceptions.cc | 311 |
1 files changed, 223 insertions, 88 deletions
diff --git a/winsup/cygwin/exceptions.cc b/winsup/cygwin/exceptions.cc index d86635bae..abb973528 100644 --- a/winsup/cygwin/exceptions.cc +++ b/winsup/cygwin/exceptions.cc @@ -1,7 +1,7 @@ /* exceptions.cc - Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, - 2007, 2008, 2009, 2010, 2011, 2012, 2013 Red Hat, Inc. + Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, + 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 Red Hat, Inc. This file is part of Cygwin. @@ -32,6 +32,17 @@ details. */ #include "ntdll.h" #include "exception.h" +/* Definitions for code simplification */ +#ifdef __x86_64__ +# define _GR(reg) R ## reg +# define _AFMT "%011X" +# define _ADDR DWORD64 +#else +# define _GR(reg) E ## reg +# define _AFMT "%08x" +# define _ADDR DWORD +#endif + #define CALL_HANDLER_RETRY_OUTER 10 #define CALL_HANDLER_RETRY_INNER 10 @@ -39,7 +50,7 @@ char debugger_command[2 * NT_MAX_PATH + 20]; static BOOL WINAPI ctrl_c_handler (DWORD); -NO_COPY static struct +static const struct { NTSTATUS code; const char *name; @@ -178,6 +189,20 @@ cygwin_exception::dump_exception () } } +#ifdef __x86_64__ + if (exception_name) + small_printf ("Exception: %s at rip=%011X\r\n", exception_name, ctx->Rip); + else + small_printf ("Signal %d at rip=%011X\r\n", e->ExceptionCode, ctx->Rip); + small_printf ("rax=%016X rbx=%016X rcx=%016X\r\n", ctx->Rax, ctx->Rbx, ctx->Rcx); + small_printf ("rdx=%016X rsi=%016X rdi=%016X\r\n", ctx->Rdx, ctx->Rsi, ctx->Rdi); + small_printf ("r8 =%016X r9 =%016X r10=%016X\r\n", ctx->R8, ctx->R9, ctx->R10); + small_printf ("r11=%016X r12=%016X r13=%016X\r\n", ctx->R11, ctx->R12, ctx->R13); + small_printf ("r14=%016X r15=%016X\r\n", ctx->R14, ctx->R15); + small_printf ("rbp=%016X rsp=%016X\r\n", ctx->Rbp, ctx->Rsp); + small_printf ("program=%W, pid %u, thread %s\r\n", + myself->progname, myself->pid, cygthread::name ()); +#else if (exception_name) small_printf ("Exception: %s at eip=%08x\r\n", exception_name, ctx->Eip); else @@ -185,7 +210,9 @@ cygwin_exception::dump_exception () small_printf ("eax=%08x ebx=%08x ecx=%08x edx=%08x esi=%08x edi=%08x\r\n", ctx->Eax, ctx->Ebx, ctx->Ecx, ctx->Edx, ctx->Esi, ctx->Edi); small_printf ("ebp=%08x esp=%08x program=%W, pid %u, thread %s\r\n", - ctx->Ebp, ctx->Esp, myself->progname, myself->pid, cygthread::name ()); + ctx->Ebp, ctx->Esp, myself->progname, myself->pid, + cygthread::name ()); +#endif small_printf ("cs=%04x ds=%04x es=%04x fs=%04x gs=%04x ss=%04x\r\n", ctx->SegCs, ctx->SegDs, ctx->SegEs, ctx->SegFs, ctx->SegGs, ctx->SegSs); } @@ -196,10 +223,14 @@ class stack_info int walk (); /* Uses the "old" method */ char *next_offset () {return *((char **) sf.AddrFrame.Offset);} bool needargs; - DWORD dummy_frame; + PUINT_PTR dummy_frame; +#ifdef __x86_64__ + CONTEXT c; + UNWIND_HISTORY_TABLE hist; +#endif public: STACKFRAME sf; /* For storing the stack information */ - void init (DWORD, bool, bool); /* Called the first time that stack info is needed */ + void init (PUINT_PTR, bool, PCONTEXT); /* Called the first time that stack info is needed */ /* Postfix ++ iterates over the stack, returning zero when nothing is left. */ int operator ++(int) { return walk (); } @@ -213,21 +244,30 @@ static NO_COPY stack_info thestack; /* Initialize everything needed to start iterating. */ void -stack_info::init (DWORD ebp, bool wantargs, bool goodframe) +stack_info::init (PUINT_PTR framep, bool wantargs, PCONTEXT ctx) { -# define debp ((DWORD *) ebp) +#ifdef __x86_64__ + memset (&hist, 0, sizeof hist); + if (ctx) + memcpy (&c, ctx, sizeof c); + else + { + memset (&c, 0, sizeof c); + c.ContextFlags = CONTEXT_ALL; + } +#endif memset (&sf, 0, sizeof (sf)); - if (!goodframe) - sf.AddrFrame.Offset = ebp; + if (ctx) + sf.AddrFrame.Offset = (UINT_PTR) framep; else { - dummy_frame = ebp; - sf.AddrFrame.Offset = (DWORD) &dummy_frame; + dummy_frame = framep; + sf.AddrFrame.Offset = (UINT_PTR) &dummy_frame; } - sf.AddrReturn.Offset = debp[1]; + if (framep) + sf.AddrReturn.Offset = framep[1]; sf.AddrFrame.Mode = AddrModeFlat; needargs = wantargs; -# undef debp } extern "C" void _cygwin_exit_return (); @@ -237,26 +277,56 @@ extern "C" void _cygwin_exit_return (); int stack_info::walk () { - char **ebp; +#ifdef __x86_64__ + PRUNTIME_FUNCTION f; + ULONG64 imagebase; + DWORD64 establisher; + PVOID hdl; + + if (!c.Rip) + return 0; + + sf.AddrPC.Offset = c.Rip; + sf.AddrStack.Offset = c.Rsp; + sf.AddrFrame.Offset = c.Rbp; + + f = RtlLookupFunctionEntry (c.Rip, &imagebase, &hist); + if (f) + RtlVirtualUnwind (0, imagebase, c.Rip, f, &c, &hdl, &establisher, NULL); + else + { + c.Rip = *(ULONG_PTR *) c.Rsp; + c.Rsp += 8; + } + if (needargs && c.Rip) + { + PULONG_PTR p = (PULONG_PTR) c.Rsp; + for (unsigned i = 0; i < NPARAMS; ++i) + sf.Params[i] = p[i + 1]; + } + return 1; +#else + char **framep; if ((void (*) ()) sf.AddrPC.Offset == _cygwin_exit_return) return 0; /* stack frames are exhausted */ - if (((ebp = (char **) next_offset ()) == NULL) || (ebp >= (char **) cygwin_hmodule)) + if (((framep = (char **) next_offset ()) == NULL) + || (framep >= (char **) cygwin_hmodule)) return 0; - sf.AddrFrame.Offset = (DWORD) ebp; + sf.AddrFrame.Offset = (_ADDR) framep; sf.AddrPC.Offset = sf.AddrReturn.Offset; /* The return address always follows the stack pointer */ - sf.AddrReturn.Offset = (DWORD) *++ebp; + sf.AddrReturn.Offset = (_ADDR) *++framep; if (needargs) { unsigned nparams = NPARAMS; /* The arguments follow the return address */ - sf.Params[0] = (DWORD) *++ebp; + sf.Params[0] = (_ADDR) *++framep; /* Hack for XP/2K3 WOW64. If the first stack param points to the application entry point, we can only fetch one additional parameter. Accessing anything beyond this address results in @@ -264,16 +334,19 @@ stack_info::walk () if (wincap.has_restricted_stack_args () && sf.Params[0] == 0x401000) nparams = 2; for (unsigned i = 1; i < nparams; i++) - sf.Params[i] = (DWORD) *++ebp; + sf.Params[i] = (_ADDR) *++framep; } - return 1; +#endif } void cygwin_exception::dumpstack () { static bool already_dumped; + myfault efault; + if (efault.faulted ()) + return; if (already_dumped || cygheap->rlim_core == 0Ul) return; @@ -285,14 +358,18 @@ cygwin_exception::dumpstack () int i; - thestack.init (ebp, 1, !ctx); /* Initialize from the input CONTEXT */ + thestack.init (framep, 1, ctx); /* Initialize from the input CONTEXT */ +#ifdef __x86_64__ + small_printf ("Stack trace:\r\nFrame Function Args\r\n"); +#else small_printf ("Stack trace:\r\nFrame Function Args\r\n"); +#endif for (i = 0; i < 16 && thestack++; i++) { - small_printf ("%08x %08x ", thestack.sf.AddrFrame.Offset, + small_printf (_AFMT " " _AFMT, thestack.sf.AddrFrame.Offset, thestack.sf.AddrPC.Offset); for (unsigned j = 0; j < NPARAMS; j++) - small_printf ("%s%08x", j == 0 ? " (" : ", ", thestack.sf.Params[j]); + small_printf ("%s" _AFMT, j == 0 ? " (" : ", ", thestack.sf.Params[j]); small_printf (")\r\n"); } small_printf ("End of stack trace%s\n", @@ -309,8 +386,8 @@ _cygtls::inside_kernel (CONTEXT *cx) return true; memset (&m, 0, sizeof m); - if (!VirtualQuery ((LPCVOID) cx->Eip, &m, sizeof m)) - sigproc_printf ("couldn't get memory info, pc %p, %E", cx->Eip); + if (!VirtualQuery ((LPCVOID) cx->_GR(ip), &m, sizeof m)) + sigproc_printf ("couldn't get memory info, pc %p, %E", cx->_GR(ip)); size_t size = (windows_system_directory_length + 6) * sizeof (WCHAR); PWCHAR checkdir = (PWCHAR) alloca (size); @@ -330,12 +407,14 @@ _cygtls::inside_kernel (CONTEXT *cx) checkdir += 4; res = wcsncasecmp (windows_system_directory, checkdir, windows_system_directory_length) == 0; +#ifndef __x86_64__ if (!res && system_wow64_directory_length) res = wcsncasecmp (system_wow64_directory, checkdir, system_wow64_directory_length) == 0; +#endif } - sigproc_printf ("pc %p, h %p, inside_kernel %d", cx->Eip, h, res); + sigproc_printf ("pc %p, h %p, inside_kernel %d", cx->_GR(ip), h, res); # undef h return res; } @@ -346,8 +425,8 @@ cygwin_stackdump () { CONTEXT c; c.ContextFlags = CONTEXT_FULL; - GetThreadContext (GetCurrentThread (), &c); - cygwin_exception exc (c.Ebp); + RtlCaptureContext (&c); + cygwin_exception exc ((PUINT_PTR) c._GR(bp), &c); exc.dumpstack (); } @@ -440,9 +519,13 @@ try_to_debug (bool waitloop) return dbg; } -extern "C" void WINAPI RtlUnwind (void *, void *, PEXCEPTION_RECORD, void *); -static void __reg3 rtl_unwind (exception_list *, PEXCEPTION_RECORD) __attribute__ ((noinline, )); -void __stdcall +#ifdef __x86_64__ +/* Don't unwind the stack on x86_64. It's not necessary to do that from the + exception handler. */ +#define rtl_unwind(el,er) +#else +static void __reg3 rtl_unwind (exception_list *, PEXCEPTION_RECORD) __attribute__ ((noinline, regparm (3))); +void __reg3 rtl_unwind (exception_list *frame, PEXCEPTION_RECORD e) { __asm__ ("\n\ @@ -460,27 +543,47 @@ rtl_unwind (exception_list *frame, PEXCEPTION_RECORD e) popl %%ebx \n\ ": : "r" (frame), "r" (e)); } +#endif /* Main exception handler. */ -extern exception_list *_except_list asm ("%fs:0"); +#ifdef __x86_64__ +#define CYG_EXC_CONTINUE_EXECUTION EXCEPTION_CONTINUE_EXECUTION +#define CYG_EXC_CONTINUE_SEARCH EXCEPTION_CONTINUE_SEARCH + +bool exception::handler_installed NO_COPY; + +int +exception::handle (LPEXCEPTION_POINTERS ep) +#else +#define CYG_EXC_CONTINUE_EXECUTION ExceptionContinueExecution +#define CYG_EXC_CONTINUE_SEARCH ExceptionContinueSearch int exception::handle (EXCEPTION_RECORD *e, exception_list *frame, CONTEXT *in, void *) +#endif { static bool NO_COPY debugging; _cygtls& me = _my_tls; + if (me.andreas) + me.andreas->leave (); /* Return from a "san" caught fault */ + +#ifdef __x86_64__ + EXCEPTION_RECORD *e = ep->ExceptionRecord; + CONTEXT *in = ep->ContextRecord; +#endif + if (debugging && ++debugging < 500000) { SetThreadPriority (hMainThread, THREAD_PRIORITY_NORMAL); - return 0; + return CYG_EXC_CONTINUE_EXECUTION; } - /* If we're exiting, don't do anything here. Returning 1 - tells Windows to keep looking for an exception handler. */ + /* If we're exiting, tell Windows to keep looking for an + exception handler. */ if (exit_state || e->ExceptionFlags) - return 1; + return CYG_EXC_CONTINUE_SEARCH; siginfo_t si = {}; si.si_code = SI_KERNEL; @@ -549,7 +652,7 @@ exception::handle (EXCEPTION_RECORD *e, exception_list *frame, CONTEXT *in, void 1)) { case MMAP_NORESERVE_COMMITED: - return 0; + return CYG_EXC_CONTINUE_EXECUTION; case MMAP_RAISE_SIGBUS: /* MAP_NORESERVE page, commit failed, or access to mmap page beyond EOF. */ si.si_signo = SIGBUS; @@ -583,26 +686,31 @@ exception::handle (EXCEPTION_RECORD *e, exception_list *frame, CONTEXT *in, void want CloseHandle to return an error. This can be revisited if gcc ever supports Windows style structured exception handling. */ - return 0; + return CYG_EXC_CONTINUE_EXECUTION; default: /* If we don't recognize the exception, we have to assume that we are doing structured exception handling, and we let something else handle it. */ - return 1; + return CYG_EXC_CONTINUE_SEARCH; } - if (me.andreas) - me.andreas->leave (); /* Return from a "san" caught fault */ - - debug_printf ("In cygwin_except_handler exception %p at %p sp %p", e->ExceptionCode, in->Eip, in->Esp); - debug_printf ("In cygwin_except_handler signal %d at %p", si.si_signo, in->Eip); - - DWORD *ebp = (DWORD *) in->Esp; - for (DWORD *bpend = (DWORD *) __builtin_frame_address (0); ebp > bpend; ebp--) - if (*ebp == in->SegCs && ebp[-1] == in->Eip) + debug_printf ("In cygwin_except_handler exception %y at %p sp %p", e->ExceptionCode, in->_GR(ip), in->_GR(sp)); + debug_printf ("In cygwin_except_handler signal %d at %p", si.si_signo, in->_GR(ip)); + +#ifdef __x86_64__ + PUINT_PTR framep = (PUINT_PTR) in->Rbp; + /* Sometimes, when a stack is screwed up, Rbp tends to be NULL. In that + case, base the stacktrace on Rsp. In most cases, it allows to generate + useful stack trace. */ + if (!framep) + framep = (PUINT_PTR) in->Rsp; +#else + PUINT_PTR framep = (PUINT_PTR) in->_GR(sp); + for (PUINT_PTR bpend = (PUINT_PTR) __builtin_frame_address (0); framep > bpend; framep--) + if (*framep == in->SegCs && framep[-1] == in->_GR(ip)) { - ebp -= 2; + framep -= 2; break; } @@ -610,6 +718,7 @@ exception::handle (EXCEPTION_RECORD *e, exception_list *frame, CONTEXT *in, void We don't want any Windows magic kicking in. This top level frame will be removed automatically after our exception handler returns. */ _except_list->handler = handle; +#endif if (exit_state >= ES_SIGNAL_EXIT && (NTSTATUS) e->ExceptionCode != STATUS_CONTROL_C_EXIT) @@ -619,7 +728,7 @@ exception::handle (EXCEPTION_RECORD *e, exception_list *frame, CONTEXT *in, void else { debugging = true; - return 0; + return CYG_EXC_CONTINUE_EXECUTION; } /* FIXME: Probably should be handled in signal processing code */ @@ -632,19 +741,25 @@ exception::handle (EXCEPTION_RECORD *e, exception_list *frame, CONTEXT *in, void error_code |= 2; if (!me.inside_kernel (in)) /* User space */ error_code |= 4; - klog (LOG_INFO, "%s[%d]: segfault at %08x rip %08x rsp %08x error %d", - __progname, myself->pid, e->ExceptionInformation[1], - in->Eip, in->Esp, error_code); + klog (LOG_INFO, +#ifdef __x86_64__ + "%s[%d]: segfault at %011X rip %011X rsp %011X error %d", +#else + "%s[%d]: segfault at %08x rip %08x rsp %08x error %d", +#endif + __progname, myself->pid, + e->ExceptionInformation[1], in->_GR(ip), in->_GR(sp), + error_code); } - - cygwin_exception exc ((DWORD) ebp, in, e); + cygwin_exception exc (framep, in, e); si.si_cyg = (void *) &exc; - si.si_addr = (void *) in->Eip; + si.si_addr = (si.si_signo == SIGSEGV || si.si_signo == SIGBUS) + ? (void *) e->ExceptionInformation[1] : (void *) in->_GR(ip); me.incyg++; sig_send (NULL, si, &me); /* Signal myself */ me.incyg--; e->ExceptionFlags = 0; - return 0; + return CYG_EXC_CONTINUE_EXECUTION; } /* Utilities to call a user supplied exception handler. */ @@ -664,7 +779,7 @@ handle_sigsuspend (sigset_t tempmask) sigset_t oldmask = _my_tls.sigmask; // Remember for restoration set_signal_mask (_my_tls.sigmask, tempmask); - sigproc_printf ("oldmask %p, newmask %p", oldmask, tempmask); + sigproc_printf ("oldmask %ly, newmask %ly", oldmask, tempmask); pthread_testcancel (); cygwait (NULL, cw_infinite, cw_cancel | cw_cancel_self | cw_sig_eintr); @@ -730,16 +845,17 @@ _cygtls::interrupt_now (CONTEXT *cx, siginfo_t& si, void *handler, interrupted = false; else { - push ((__stack_t) cx->Eip); + _ADDR &ip = cx->_GR(ip); + push (ip); interrupt_setup (si, handler, siga); - cx->Eip = pop (); + ip = pop (); SetThreadContext (*this, cx); /* Restart the thread in a new location */ interrupted = true; } return interrupted; } -void __stdcall +void __reg3 _cygtls::interrupt_setup (siginfo_t& si, void *handler, struct sigaction& siga) { push ((__stack_t) sigdelayed); @@ -1050,7 +1166,7 @@ set_process_mask_delta () else oldmask = _my_tls.sigmask; newmask = (oldmask | _my_tls.deltamask) & ~SIG_NONMASKABLE; - sigproc_printf ("oldmask %p, newmask %p, deltamask %p", oldmask, newmask, + sigproc_printf ("oldmask %lx, newmask %lx, deltamask %lx", oldmask, newmask, _my_tls.deltamask); _my_tls.sigmask = newmask; return oldmask; @@ -1064,7 +1180,7 @@ set_signal_mask (sigset_t& setmask, sigset_t newmask) { newmask &= ~SIG_NONMASKABLE; sigset_t mask_bits = setmask & ~newmask; - sigproc_printf ("setmask %p, newmask %p, mask_bits %p", setmask, newmask, + sigproc_printf ("setmask %lx, newmask %lx, mask_bits %lx", setmask, newmask, mask_bits); setmask = newmask; if (mask_bits) @@ -1092,13 +1208,21 @@ signal_exit (int sig, siginfo_t *si) case SIGTRAP: case SIGXCPU: case SIGXFSZ: + sig |= 0x80; /* Flag that we've "dumped core" */ if (try_to_debug ()) break; if (si->si_code != SI_USER && si->si_cyg) ((cygwin_exception *) si->si_cyg)->dumpstack (); else { - cygwin_exception exc (_my_tls.thread_context.ebp); + CONTEXT c; + c.ContextFlags = CONTEXT_FULL; + RtlCaptureContext (&c); +#ifdef __x86_64__ + cygwin_exception exc ((PUINT_PTR) _my_tls.thread_context.rbp, &c); +#else + cygwin_exception exc ((PUINT_PTR) _my_tls.thread_context.ebp, &c); +#endif exc.dumpstack (); } break; @@ -1107,7 +1231,10 @@ signal_exit (int sig, siginfo_t *si) lock_process until_exit (true); if (have_execed || exit_state > ES_PROCESS_LOCKED) - myself.exit (sig); + { + debug_printf ("recursive exit?"); + myself.exit (sig); + } /* Starve other threads in a vain attempt to stop them from doing something stupid. */ @@ -1129,22 +1256,22 @@ _cygtls::handle_SIGCONT () int state = 0; /* Carefully tell sig_handle_tty_stop to wake up. */ while (state < 2) - { - lock (); - if (sig) - yield (); /* state <= 1 */ - else if (state) - state++; /* state == 2 */ - else - { - sig = SIGCONT; - SetEvent (signal_arrived); - state++; /* state == 1 */ - } - unlock (); - } + { + lock (); + if (sig) + yield (); /* state <= 1 */ + else if (state) + state++; /* state == 2 */ + else + { + sig = SIGCONT; + SetEvent (signal_arrived); + state++; /* state == 1 */ + } + unlock (); + } /* Tell wait_sig to handle any queued signals now that we're alive - again. */ + again. */ sig_dispatch_pending (false); } /* Clear pending stop signals */ @@ -1154,7 +1281,7 @@ _cygtls::handle_SIGCONT () sig_clear (SIGTTOU); } -int __stdcall +int __reg1 sigpacket::process () { int rc = 1; @@ -1200,7 +1327,7 @@ sigpacket::process () else tls = NULL; } - + /* !tls means no threads available to catch a signal. */ if (!tls) { @@ -1350,16 +1477,24 @@ _cygtls::signal_debugger (siginfo_t& si) else goto out; if (incyg) +#ifdef __x86_64__ + c.Rip = retaddr (); +#else c.Eip = retaddr (); +#endif + memcpy (&thread_context, pc, (&thread_context._internal - + (unsigned char *) &thread_context)); } - memcpy (&thread_context, pc, (&thread_context._internal - - (unsigned char *) &thread_context)); +#ifdef __x86_64__ + char sigmsg[2 * sizeof (_CYGWIN_SIGNAL_STRING " ffffffff ffffffffffffffff")]; +#else char sigmsg[2 * sizeof (_CYGWIN_SIGNAL_STRING " ffffffff ffffffff")]; - __small_sprintf (sigmsg, _CYGWIN_SIGNAL_STRING " %d %p %p", si.si_signo, +#endif + __small_sprintf (sigmsg, _CYGWIN_SIGNAL_STRING " %d %y %p", si.si_signo, thread_id, &thread_context); OutputDebugString (sigmsg); } out: - if (th) - ResumeThread (th); + if (th) + ResumeThread (th); } |