xref: /netbsd-src/sys/arch/powerpc/include/reg.h (revision ebbc7028d31885fd6b60923c2d5c0e3d7663c21a)
1 /*	$NetBSD: reg.h,v 1.14 2021/08/13 20:47:55 andvar Exp $	*/
2 
3 #ifndef _POWERPC_REG_H_
4 #define _POWERPC_REG_H_
5 
6 /*
7  *  Register Usage according the SVR4 ABI for PPC.
8  *
9  *  Register	Usage
10  *  r0		Volatile register which may be modified during function linkage
11  *  r1		Stack frame pointer, always valid
12  *  r2		System-reserved register
13  *  r3-r4	Volatile registers used for parameter passing and return values
14  *  r5-r10	Volatile registers used for parameter passing
15  *  r11-r12	Volatile register which may be modified during function linkage
16  *  r13		Small data area pointer register
17  *  f0		Volatile register
18  *  f1		Volatile registers used for parameter passing and return values
19  *  f2-f8	Volatile registers used for parameter passing
20  *  f9-f13	Volatile registers
21  *
22  *  [Start of callee-saved registers]
23  *  r14-r30	Registers used for local variables
24  *  r31		Used for local variable or "environment pointers"
25  *  f14-f31	Registers used for local variables
26  *
27  *
28  *  Register Usage according the ELF64 ABI (PowerOpen/AIX) for PPC.
29  *
30  *  Register	Usage
31  *  r0		Volatile register which may be modified during function linkage
32  *  r1		Stack frame pointer, always valid
33  *  r2		TOC pointer
34  *  r3		Volatile register used for parameter passing and return value
35  *  r4-r10	Volatile registers used for parameter passing
36  *  r11		Volatile register used in calls by pointer and as an
37  *		environment pointer for languages which require one
38  *  r12		Volatile register used for exception handling and glink code
39  *  r13		Reserved for use as system thread ID
40  *
41  *  f0		Volatile register
42  *  f1-f4	Volatile registers used for parameter passing and return values
43  *  f5-f13	Volatile registers used for parameter passing
44 
45  *  [Start of callee-saved registers]
46  *  r14-r31	Registers used for local variables
47  *  f14-f31	Registers used for local variables
48  *
49  */
50 
51 struct reg {				/* base registers */
52 	__register_t fixreg[32];
53 	__register_t lr;			/* Link Register */
54 	int cr;				/* Condition Register */
55 	int xer;			/* SPR 1 */
56 	__register_t ctr;			/* Count Register */
57 	__register_t pc;			/* Program Counter */
58 };
59 
60 struct fpreg {				/* Floating Point registers */
61 #ifdef _KERNEL
62 	uint64_t fpreg[32];
63 	uint64_t fpscr;			/* Status and Control Register */
64 #else
65 	double fpreg[32];
66 	double fpscr;			/* Status and Control Register */
67 #endif
68 };
69 
70 struct vreg {				/* Vector registers */
71 	uint32_t vreg[32][4];
72 	__register_t vrsave;		/* SPR 256 */
73 	__register_t spare[2];		/* filler */
74 	__register_t vscr;		/* Vector Status And Control Register */
75 };
76 
77 #endif /* _POWERPC_REG_H_ */
78