root/sys/arch/powerpc/include/reg.h
/*      $NetBSD: reg.h,v 1.14 2021/08/13 20:47:55 andvar Exp $  */

#ifndef _POWERPC_REG_H_
#define _POWERPC_REG_H_

/*
 *  Register Usage according the SVR4 ABI for PPC.
 *
 *  Register    Usage
 *  r0          Volatile register which may be modified during function linkage
 *  r1          Stack frame pointer, always valid
 *  r2          System-reserved register
 *  r3-r4       Volatile registers used for parameter passing and return values
 *  r5-r10      Volatile registers used for parameter passing
 *  r11-r12     Volatile register which may be modified during function linkage
 *  r13         Small data area pointer register
 *  f0          Volatile register
 *  f1          Volatile registers used for parameter passing and return values
 *  f2-f8       Volatile registers used for parameter passing
 *  f9-f13      Volatile registers
 *
 *  [Start of callee-saved registers]
 *  r14-r30     Registers used for local variables
 *  r31         Used for local variable or "environment pointers"
 *  f14-f31     Registers used for local variables
 *
 *
 *  Register Usage according the ELF64 ABI (PowerOpen/AIX) for PPC.
 *
 *  Register    Usage
 *  r0          Volatile register which may be modified during function linkage
 *  r1          Stack frame pointer, always valid
 *  r2          TOC pointer
 *  r3          Volatile register used for parameter passing and return value
 *  r4-r10      Volatile registers used for parameter passing
 *  r11         Volatile register used in calls by pointer and as an
 *              environment pointer for languages which require one
 *  r12         Volatile register used for exception handling and glink code
 *  r13         Reserved for use as system thread ID
 *
 *  f0          Volatile register
 *  f1-f4       Volatile registers used for parameter passing and return values
 *  f5-f13      Volatile registers used for parameter passing

 *  [Start of callee-saved registers]
 *  r14-r31     Registers used for local variables
 *  f14-f31     Registers used for local variables
 *
 */

struct reg {                            /* base registers */
        __register_t fixreg[32];
        __register_t lr;                        /* Link Register */
        int cr;                         /* Condition Register */
        int xer;                        /* SPR 1 */
        __register_t ctr;                       /* Count Register */
        __register_t pc;                        /* Program Counter */
};

struct fpreg {                          /* Floating Point registers */
#ifdef _KERNEL
        uint64_t fpreg[32];
        uint64_t fpscr;                 /* Status and Control Register */
#else
        double fpreg[32];
        double fpscr;                   /* Status and Control Register */
#endif
};

struct vreg {                           /* Vector registers */
        uint32_t vreg[32][4];
        __register_t vrsave;            /* SPR 256 */
        __register_t spare[2];          /* filler */
        __register_t vscr;              /* Vector Status And Control Register */
};

#endif /* _POWERPC_REG_H_ */