__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