1/* $NetBSD: reg.h,v 1.4 2000/06/04 09:30:44 tsubai Exp $	*/
2/* $FreeBSD$	*/
3
4#ifndef _POWERPC_REG_H_
5#define	_POWERPC_REG_H_
6
7#if defined(_KERNEL) && !defined(KLD_MODULE) && !defined(_STANDALONE)
8#include "opt_compat.h"
9#endif
10
11/* Must match struct trapframe */
12struct reg {
13	register_t fixreg[32];
14	register_t lr;
15	register_t cr;
16	register_t xer;
17	register_t ctr;
18	register_t pc;
19};
20
21struct fpreg {
22	double fpreg[32];
23	double fpscr;
24};
25
26/* Must match pcb.pcb_vec */
27struct vmxreg {
28	uint32_t vr[32][4];
29	uint32_t pad[2];
30	uint32_t vrsave;
31	uint32_t vscr;
32};
33
34struct dbreg {
35	unsigned int	junk;
36};
37
38#ifdef __LP64__
39/* Must match struct trapframe */
40struct reg32 {
41	int32_t fixreg[32];
42	int32_t lr;
43	int32_t cr;
44	int32_t xer;
45	int32_t ctr;
46	int32_t pc;
47};
48
49struct fpreg32 {
50	struct fpreg data;
51};
52
53struct vmxreg32 {
54	struct vmxreg data;
55};
56
57struct dbreg32 {
58	struct dbreg data;
59};
60
61#define __HAVE_REG32
62#endif
63
64#ifdef _KERNEL
65/*
66 * XXX these interfaces are MI, so they should be declared in a MI place.
67 */
68int	fill_regs(struct thread *, struct reg *);
69int	set_regs(struct thread *, struct reg *);
70int	fill_fpregs(struct thread *, struct fpreg *);
71int	set_fpregs(struct thread *, struct fpreg *);
72int	fill_dbregs(struct thread *, struct dbreg *);
73int	set_dbregs(struct thread *, struct dbreg *);
74
75#ifdef COMPAT_FREEBSD32
76struct image_params;
77
78int	fill_regs32(struct thread *, struct reg32 *);
79int	set_regs32(struct thread *, struct reg32 *);
80void	ppc32_setregs(struct thread *, struct image_params *, u_long);
81
82#define	fill_fpregs32(td, reg)	fill_fpregs(td,(struct fpreg *)reg)
83#define	set_fpregs32(td, reg)	set_fpregs(td,(struct fpreg *)reg)
84#define	fill_dbregs32(td, reg)	fill_dbregs(td,(struct dbreg *)reg)
85#define	set_dbregs32(td, reg)	set_dbregs(td,(struct dbreg *)reg)
86#endif
87
88#endif
89
90#endif /* _POWERPC_REG_H_ */
91