| // Copyright 2014 The Go Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| // +build darwin dragonfly freebsd linux netbsd openbsd solaris |
| |
| package runtime |
| |
| func signame(int32) *byte |
| |
| func sigpanic() { |
| g := getg() |
| if !canpanic(g) { |
| gothrow("unexpected signal during runtime execution") |
| } |
| |
| switch g.sig { |
| case _SIGBUS: |
| if g.sigcode0 == _BUS_ADRERR && g.sigcode1 < 0x1000 || g.paniconfault { |
| panicmem() |
| } |
| print("unexpected fault address ", hex(g.sigcode1), "\n") |
| gothrow("fault") |
| case _SIGSEGV: |
| if (g.sigcode0 == 0 || g.sigcode0 == _SEGV_MAPERR || g.sigcode0 == _SEGV_ACCERR) && g.sigcode1 < 0x1000 || g.paniconfault { |
| panicmem() |
| } |
| print("unexpected fault address ", hex(g.sigcode1), "\n") |
| gothrow("fault") |
| case _SIGFPE: |
| switch g.sigcode0 { |
| case _FPE_INTDIV: |
| panicdivide() |
| case _FPE_INTOVF: |
| panicoverflow() |
| } |
| panicfloat() |
| } |
| panic(errorString(gostringnocopy(signame(g.sig)))) |
| } |