__sparc_utrap.c revision 124722
1132718Skan/*- 2132718Skan * Copyright (c) 2001 Jake Burkholder. 3132718Skan * All rights reserved. 4132718Skan * 5132718Skan * Redistribution and use in source and binary forms, with or without 6132718Skan * modification, are permitted provided that the following conditions 7132718Skan * are met: 8132718Skan * 1. Redistributions of source code must retain the above copyright 9132718Skan * notice, this list of conditions and the following disclaimer. 10132718Skan * 2. Redistributions in binary form must reproduce the above copyright 11132718Skan * notice, this list of conditions and the following disclaimer in the 12132718Skan * documentation and/or other materials provided with the distribution. 13132718Skan * 14132718Skan * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 15132718Skan * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16132718Skan * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17132718Skan * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 18132718Skan * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19132718Skan * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20132718Skan * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21132718Skan * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22132718Skan * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23132718Skan * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24132718Skan * SUCH DAMAGE. 25132718Skan */ 26132718Skan 27132718Skan#include <sys/cdefs.h> 28132718Skan__FBSDID("$FreeBSD: head/lib/libc/sparc64/sys/__sparc_utrap.c 124722 2004-01-19 16:14:58Z nectar $"); 29132718Skan 30132718Skan#include <sys/types.h> 31132718Skan 32132718Skan#include <machine/utrap.h> 33132718Skan#include <machine/sysarch.h> 34132718Skan 35132718Skan#include <errno.h> 36132718Skan#include <signal.h> 37132718Skan#include <stdio.h> 38132718Skan#include <stdlib.h> 39132718Skan#include <string.h> 40132718Skan#include <unistd.h> 41132718Skan 42132718Skan#include "fpu_extern.h" 43132718Skan#include "__sparc_utrap_private.h" 44132718Skan 45132718Skanextern ssize_t __sys_write(int, const void *, size_t); 46132718Skanextern int __sys_kill(pid_t, int); 47132718Skanextern pid_t __sys_getpid(void); 48132718Skan 49132718Skanstatic const char *utrap_msg[] = { 50132718Skan "reserved", 51132718Skan "instruction access exception", 52132718Skan "instruction access error", 53132718Skan "instruction access protection", 54132718Skan "illtrap instruction", 55132718Skan "illegal instruction", 56132718Skan "privileged opcode", 57132718Skan "floating point disabled", 58132718Skan "floating point exception ieee 754", 59132718Skan "floating point exception other", 60132718Skan "tag overflow", 61132718Skan "division by zero", 62132811Skan "data access exception", 63132811Skan "data access error", 64132718Skan "data access protection", 65132718Skan "memory address not aligned", 66132718Skan "privileged action", 67132718Skan "async data error", 68132718Skan "trap instruction 16", 69132718Skan "trap instruction 17", 70132718Skan "trap instruction 18", 71132718Skan "trap instruction 19", 72132718Skan "trap instruction 20", 73132718Skan "trap instruction 21", 74132718Skan "trap instruction 22", 75132718Skan "trap instruction 23", 76132718Skan "trap instruction 24", 77132718Skan "trap instruction 25", 78132718Skan "trap instruction 26", 79132718Skan "trap instruction 27", 80132718Skan "trap instruction 28", 81132718Skan "trap instruction 29", 82132718Skan "trap instruction 30", 83132718Skan "trap instruction 31", 84132718Skan}; 85132718Skan 86132718Skanvoid 87132718Skan__sparc_utrap(struct utrapframe *uf) 88132718Skan{ 89132718Skan int sig; 90132718Skan 91132718Skan switch (uf->uf_type) { 92132718Skan case UT_FP_EXCEPTION_IEEE_754: 93132718Skan case UT_FP_EXCEPTION_OTHER: 94132718Skan sig = __fpu_exception(uf); 95132718Skan break; 96132718Skan case UT_ILLEGAL_INSTRUCTION: 97132718Skan sig = __emul_insn(uf); 98132718Skan break; 99132718Skan case UT_MEM_ADDRESS_NOT_ALIGNED: 100132718Skan sig = __unaligned_fixup(uf); 101132718Skan break; 102132718Skan default: 103132718Skan break; 104132718Skan } 105132718Skan if (sig) { 106132718Skan __utrap_write("__sparc_utrap: fatal "); 107132718Skan __utrap_write(utrap_msg[uf->uf_type]); 108132718Skan __utrap_write("\n"); 109132718Skan __utrap_kill_self(sig); 110132718Skan } 111132718Skan UF_DONE(uf); 112132718Skan} 113132718Skan 114132718Skanvoid 115132718Skan__utrap_write(const char *str) 116132718Skan{ 117132718Skan int berrno; 118132718Skan 119132718Skan berrno = errno; 120132718Skan __sys_write(STDERR_FILENO, str, strlen(str)); 121132718Skan errno = berrno; 122132718Skan} 123132718Skan 124132718Skanvoid 125132718Skan__utrap_kill_self(sig) 126132718Skan{ 127132718Skan int berrno; 128132718Skan 129132718Skan berrno = errno; 130132718Skan __sys_kill(__sys_getpid(), sig); 131132718Skan errno = berrno; 132132718Skan} 133132718Skan 134132718Skanvoid 135132718Skan__utrap_panic(const char *msg) 136132718Skan{ 137132718Skan 138132718Skan __utrap_write(msg); 139132718Skan __utrap_write("\n"); 140132718Skan __utrap_kill_self(SIGKILL); 141132718Skan} 142132718Skan