|
|
1.1 ! root 1: /* @(#)reg.h 1.1 86/02/03 SMI */ ! 2: ! 3: /* ! 4: * Copyright (c) 1985 by Sun Microsystems, Inc. ! 5: */ ! 6: ! 7: #ifndef _REG_ ! 8: #define _REG_ ! 9: ! 10: /* ! 11: * Location of the users' stored ! 12: * registers relative to R0. ! 13: * Usage is u.u_ar0[XX]. ! 14: */ ! 15: #define R0 (0) ! 16: #define R1 (1) ! 17: #define R2 (2) ! 18: #define R3 (3) ! 19: #define R4 (4) ! 20: #define R5 (5) ! 21: #define R6 (6) ! 22: #define R7 (7) ! 23: #define AR0 (8) ! 24: #define AR1 (9) ! 25: #define AR2 (10) ! 26: #define AR3 (11) ! 27: #define AR4 (12) ! 28: #define AR5 (13) ! 29: #define AR6 (14) ! 30: #define AR7 (15) ! 31: #define SP (15) ! 32: #define PS (16) ! 33: #define PC (17) ! 34: ! 35: /* ! 36: * And now for something completely the same... ! 37: */ ! 38: #ifndef LOCORE ! 39: struct regs { ! 40: int r_dreg[8]; /* data registers */ ! 41: #define r_r0 r_dreg[0] /* r0 for portability */ ! 42: int r_areg[8]; /* address registers */ ! 43: #define r_sp r_areg[7] /* user stack pointer */ ! 44: int r_sr; /* status register (actually a short) */ ! 45: #define r_ps r_sr ! 46: int r_pc; /* program counter */ ! 47: }; ! 48: ! 49: struct stkfmt { ! 50: int f_stkfmt : 4; /* stack format */ ! 51: int : 2; ! 52: int f_vector : 10; /* vector offset */ ! 53: short f_beibase; /* start of bus error info (if any) */ ! 54: }; ! 55: ! 56: ! 57: /* ! 58: * Struct for floating point registers and general state ! 59: * for the MC68881 (the sky fpp has no user visible state). ! 60: * If fps_flags == FPS_UNUSED, the other 68881 fields have no meaning. ! 61: * fps_code and fps_flags are software implemented fields. ! 62: * fps_flags is not used when set by user level programs, ! 63: * but changing fps_code has the side effect of changing u.u_code. ! 64: */ ! 65: ! 66: typedef struct ext_fp { ! 67: int fp[3]; ! 68: } ext_fp; /* extended 96-bit 68881 fp registers */ ! 69: ! 70: struct fp_status { ! 71: ext_fp fps_regs[8]; /* 68881 floating point regs */ ! 72: int fps_control; /* 68881 control reg */ ! 73: int fps_status; /* 68881 status reg */ ! 74: int fps_iaddr; /* 68881 instruction address reg */ ! 75: int fps_code; /* additional word for signals */ ! 76: int fps_flags; /* r/o - unused, idle or busy */ ! 77: }; ! 78: #endif !LOCORE ! 79: ! 80: /* ! 81: * Values defined for `fps_flags'. ! 82: */ ! 83: #define FPS_UNUSED 0 /* 68881 never used yet */ ! 84: #define FPS_IDLE 1 /* 68881 instruction completed */ ! 85: #define FPS_BUSY 2 /* 68881 instruction interrupted */ ! 86: ! 87: #ifndef LOCORE ! 88: /* ! 89: * Struct for the internal state of the MC68881 ! 90: * Although the MC68881 can have a smaller maximum for ! 91: * internal state, we allow for more to allow for expansion. ! 92: * A fpis_vers and fpis_bufsize of zero means NULL state. ! 93: */ ! 94: #define FPIS_BUFSIZ 192 ! 95: ! 96: struct fp_istate { ! 97: unsigned char fpis_vers; /* version number */ ! 98: unsigned char fpis_bufsiz; /* size of info in fpis_buf */ ! 99: unsigned short fpis_reserved; /* reserved word */ ! 100: unsigned char fpis_buf[FPIS_BUFSIZ]; /* fpp internal state buffer */ ! 101: }; ! 102: ! 103: /* ! 104: * Known values for fpis_bufsiz when null/idle, otherwize we have ! 105: * to assume it's busy. The EXT_FPS_FLAGS() macro is used to ! 106: * convert a pointer to an fp_istate into a value to be used ! 107: * for the user visible state found in fps_flags. As a speed ! 108: * optimization, this convertion is only done is required (e.g. ! 109: * the PTRACE_GETFPREGS ptrace call or when dumping core) instead ! 110: * of on each context switch. ! 111: */ ! 112: #define FPIS_NULLSZ 0 ! 113: #define FPIS_IDLESZ 24 ! 114: ! 115: #define EXT_FPS_FLAGS(istatep) \ ! 116: ((istatep)->fpis_bufsiz == FPIS_NULLSZ ? FPS_UNUSED : \ ! 117: (istatep)->fpis_bufsiz == FPIS_IDLESZ ? FPS_IDLE : FPS_BUSY) ! 118: ! 119: /* ! 120: * Structures for the status and data registers are defined here. ! 121: * If fpais_context == FPA_NO_CONTEXT, the other FPA fields have ! 122: * no meaning. Struct fpa_istate and fpa_status are included in the ! 123: * u area. Struct fpa_regs is included in struct core. ! 124: */ ! 125: ! 126: struct fpa_istate { ! 127: unsigned int fpais_context; /* 0-31, 32 means FPA not used */ ! 128: unsigned int fpais_state; /* FPA STATE register */ ! 129: }; ! 130: ! 131: #define FPA_NO_CONTEXT 32 ! 132: ! 133: struct fpa_status { ! 134: unsigned int fpas_status[3]; /* IMASK, LOAD_PTR, IERR */ ! 135: unsigned short fpas_opcode[4]; /* pipe instruction halves */ ! 136: unsigned int fpas_operand[4];/* pipe data halves */ ! 137: unsigned int fpas_mode; /* FPA MODE3_0 register */ ! 138: }; ! 139: ! 140: /* ! 141: * Since there are 64 8-byte data registers, save/restore them during ! 142: * context switch both consumes time and occupies 512 bytes in the u area. ! 143: * Also, there are 32 contexts supported by the fpa hardware. ! 144: * Therefore, when we do context switch on the fpa, we don't save/restore ! 145: * the data registers between the fpa and the u area. To protect ! 146: * data registers from being overwritten, if there are already 32 ! 147: * processes using the fpa concurrently, we give an error message to ! 148: * the 33rd process trying to use the fpa. (Hopefully there will not ! 149: * be this many processes using fpa concurrently.) ! 150: */ ! 151: ! 152: /* ! 153: * There are 64 64-bit data registers. Since the data path between cpu ! 154: * and fpa is 32 bit wide, we view FPA data registers as 128 unsigned int's. ! 155: */ ! 156: #define FPA_NLONG_WORDS 128 ! 157: ! 158: struct fpa_data { ! 159: unsigned int fpad_data[FPA_NLONG_WORDS]; /* FPA data registers */ ! 160: unsigned int fpad_wstatus; /* FPA WSTATUS register */ ! 161: }; ! 162: ! 163: struct fpa_regs { ! 164: struct fpa_istate fpar_istate; ! 165: struct fpa_status fpar_status; ! 166: struct fpa_data fpar_data; ! 167: }; ! 168: ! 169: #endif !LOCORE ! 170: ! 171: #endif !_REG_
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.