Annotation of src/sys/arch/pc532/fpu/ieee_handler.h, Revision 1.7
1.7 ! chs 1: /* $NetBSD: ieee_handler.h,v 1.6 2004/01/23 04:12:39 simonb Exp $ */
1.1 phil 2:
1.6 simonb 3: /*
1.1 phil 4: * IEEE floating point support for NS32081 and NS32381 fpus.
5: * Copyright (c) 1995 Ian Dall
6: * All Rights Reserved.
1.6 simonb 7: *
1.1 phil 8: * Permission to use, copy, modify and distribute this software and its
9: * documentation is hereby granted, provided that both the copyright
10: * notice and this permission notice appear in all copies of the
11: * software, derivative works or modified versions, and any portions
12: * thereof, and that both notices appear in supporting documentation.
1.6 simonb 13: *
1.1 phil 14: * IAN DALL ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" CONDITION.
15: * IAN DALL DISCLAIMS ANY LIABILITY OF ANY KIND FOR ANY DAMAGES
16: * WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
17: */
1.6 simonb 18: /*
1.1 phil 19: * File: ieee_handler.h
20: * Author: Ian Dall
21: * Date: November 1995
22: *
23: * Prototypes for entry points. Customization for in kernel version
24: * or unix signal handler version.
25: *
26: * HISTORY
1.2 phil 27: * 02-Apr-96 Matthias Pfaller <leo@dachau.marco.de>)
28: * Add NetBSD kernel support.
29: *
1.1 phil 30: * 14-Dec-95 Ian Dall (Ian.Dall@dsto.defence.gov.au)
31: * First release.
32: *
33: */
34: #ifndef _IEEE_HANDLER_H_
35: #define _IEEE_HANDLER_H_
36:
37: #if defined(KERNEL) || defined(_KERNEL)
38: #ifdef MACH
39:
40: #include <ns532/thread.h>
41: #include <mach/vm_param.h>
42: #include "mach_kdb.h"
43: #if MACH_KDB
44: #define DEBUG
45: #endif
46:
47: typedef struct {
48: struct ns532_saved_state *regs;
49: struct ns532_fp_state *fps;
50: } state;
51:
1.4 matthias 52: #define LREGBASE(s) ((vaddr_t) (s)->fps)
1.1 phil 53: #define LREGOFFSET(n) offsetof(struct ns532_fp_state, regs.l.l ## n)
1.4 matthias 54: #define FREGBASE(s) ((vaddr_t) (s)->fps)
1.1 phil 55: #define FREGOFFSET(n) offsetof(struct ns532_fp_state, regs.f.f ## n)
1.4 matthias 56: #define REGBASE(s) ((vaddr_t) (s)->regs)
1.1 phil 57: #define REGOFFSET(n) offsetof(struct ns532_saved_state, r ## n)
58:
59: #define FSR fps->fsr
60: #define FP regs->fp
61: #define SP regs->usp
62: #define SB regs->sb
63: #define PC regs->pc
64: #define PSR regs->psr
65:
66: #elif defined(__NetBSD__) /* MACH */
67: #include <sys/param.h>
68: #include <sys/kernel.h>
69: #include <sys/proc.h>
70: #include <sys/user.h>
71:
1.5 thorpej 72: typedef struct lwp state;
1.1 phil 73:
1.5 thorpej 74: #define LREGBASE(s) ((vaddr_t) (s)->l_addr->u_pcb.pcb_freg)
1.1 phil 75: #define LREGOFFSET(n) (n * sizeof(double))
1.5 thorpej 76: #define FREGBASE(s) ((vaddr_t) (s)->l_addr->u_pcb.pcb_freg)
1.1 phil 77: #define FREGOFFSET(n) ((n & ~1) * sizeof(double) + (n & 1) * sizeof(float))
1.5 thorpej 78: #define REGBASE(s) ((vaddr_t) (s)->l_md.md_regs)
1.1 phil 79: #define REGOFFSET(n) offsetof(struct reg, r_r ## n)
80:
1.5 thorpej 81: #define FSR l_addr->u_pcb.pcb_fsr
82: #define FP l_md.md_regs->r_fp
83: #define SP l_md.md_regs->r_sp
84: #define SB l_md.md_regs->r_sb
85: #define PC l_md.md_regs->r_pc
86: #define PSR l_md.md_regs->r_psr
1.1 phil 87:
88: #define PSR_N PSL_N
89: #define PSR_Z PSL_Z
90: #define PSR_L PSL_L
91:
92: #else /* __NetBSD__ */
93: #error OS unsupported
94: #endif /* __NetBSD__ */
95: #else /* KERNEL || _KERNEL */
96: #include <signal.h>
97:
98: struct fstate {
99: unsigned int fsr;
100: union {
101: struct { double l0, l2, l4, l6, l1, l3, l5, l7;} l;
102: struct { float f0, f1, f2, f3, f4, f5, f6, f7;} f;
103: } regs;
104: };
105:
106: struct ns532_combined_state {
107: struct sigcontext *scp;
108: struct fstate fs;
109: };
110:
111: typedef struct ns532_combined_state state;
112:
113: #define LREG(REG) fs.regs.l.l ## REG
1.4 matthias 114: #define LREGBASE(s) ((vaddr_t) &(s)->fs)
1.1 phil 115: #define LREGOFFSET(n) offsetof(struct fstate, regs.l.l ## n)
1.4 matthias 116: #define FREGBASE(s) ((vaddr_t) &(s)->fs)
1.1 phil 117: #define FREGOFFSET(n) offsetof(struct fstate, regs.f.f ## n)
1.4 matthias 118: #define REGBASE(s) ((vaddr_t) (s)->scp)
1.1 phil 119: #define REGOFFSET(n) offsetof(struct sigcontext, sc_reg[n])
120: #define FSR fs.fsr
121: #define FP scp->sc_fp
122: #define SP scp->sc_sp
123: #define SB scp->sc_sb
124: #define PC scp->sc_pc
125: #define PSR scp->sc_ps
126:
1.7 ! chs 127: int ieee_sig(int, int, struct sigcontext *);
1.3 matthias 128:
129: #ifdef __NetBSD__
130: #define PSR_N PSL_N
131: #define PSR_Z PSL_Z
132: #define PSR_L PSL_L
133: #endif /* __NetBSD */
134:
1.1 phil 135: #endif /* KERNEL */
136:
1.7 ! chs 137: int ieee_handle_exception(state *);
1.1 phil 138:
139: #endif /* _IEEE_HANDLER_H_ */
CVSweb <webmaster@jp.NetBSD.org>