summaryrefslogtreecommitdiff
path: root/gdb/nlm/ppc.h
blob: 84cee6b11a38b2b14c982e2f495f358ec30b1475 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
typedef long Long;

/* The following enum is used to access the special registers in 
   the saved machine state.  */

typedef enum
{
  kDc_SavedPC =	0,		/* really SRR0 */
  kDc_SavedMSR = 1,		/* really SRR1 */
  kDc_SavedCR =	2,
  kDc_SavedLR =	3,
  kDc_SavedDSISR = 4,
  kDc_SavedDAR = 5,
  kDc_SavedXER = 6,
  kDc_SavedCTR = 7,
  kDc_SavedSDR1 = 8,
  kDc_SavedRTCU = 9,
  kDc_SavedRTCL = 10,
  kDc_SavedDEC = 11,
  kDc_SavedSR00 = 12,		/* The Segement Registers are consecutive */
  kDc_SavedSR01 = 13,		/* kDc_SavedSR00 + n is supported */
  kDc_SavedSR02 = 14,
  kDc_SavedSR03 = 15,
  kDc_SavedSR04 = 16,
  kDc_SavedSR05 = 17,
  kDc_SavedSR06 = 18,
  kDc_SavedSR07 = 19,
  kDc_SavedSR08 = 20,
  kDc_SavedSR09 = 21,
  kDc_SavedSR10 = 22,
  kDc_SavedSR11 = 23,
  kDc_SavedSR12 = 24,
  kDc_SavedSR13 = 25,
  kDc_SavedSR14 = 26,
  kDc_SavedSR15 = 27,
  kDc_SavedFPSCR = 29,
  kDc_SavedMQ = 30,
  kDc_SavedBAT0U = 31,
  kDc_SavedBAT0L = 32,
  kDc_SavedBAT1U = 33,
  kDc_SavedBAT1L = 34,
  kDc_SavedBAT2U = 35,
  kDc_SavedBAT2L = 36,
  kDc_SavedBAT3U = 37,
  kDc_SavedBAT3L = 38,

  kNumberSpecialRegisters = 39
} Dc_SavedRegisterName;

/* Access to floating points is not very easy.  This allows the number to be
   accessed both as a floating number and as a pair of Longs.  */

typedef union
{
  double asfloat;		/* access the variable as a floating number */
  struct
    {
      Long high;
      Long low;
    }
  asLONG;			/* access the variable as two Longs */
} FloatingPoints;

/* The following is the standard record for Saving a machine state */

struct SavedMachineState
{
  FloatingPoints CSavedFPRegs[32]; /* The floating point registers [0->31] */
				/* ***32bit assumption*** */
  Long CsavedRegs[32];		/* space to save the General Registers */
				/* These are saved 0->31 */
  Long CexReason;
  Long SavedDomainID;
  union
    {				/* must be 8-byte aligned, so doubleFPSCR is 8-byte aligned */
      struct
	{
	  Long CsavedSRR0;	/* Index 0 - The saved PC */
	  Long CsavedSRR1;	/* 1 saved MSR */
	  Long CsavedCR;	/* 2 */
	  Long CsavedLR;	/* 3 */
	  Long CsavedDSISR;	/* 4 */
	  Long CsavedDAR;	/* 5 */

	  Long CsavedXER;	/* 6 */
	  Long CsavedCTR;	/* 7 */
	  Long CsavedSDR1;	/* 8 */
	  Long CsavedRTCU;	/* 9 */
	  Long CsavedRTCL;	/* 10 */
	  Long CsavedDEC;	/* 11 */
	  Long CsavedSR0;	/* 12 */
	  Long CsavedSR1;	/* 13 */
	  Long CsavedSR2;	/* 14 */
	  Long CsavedSR3;	/* 15 */
	  Long CsavedSR4;	/* 16 */
	  Long CsavedSR5;	/* 17 */
	  Long CsavedSR6;	/* 18 */
	  Long CsavedSR7;	/* 19 */
	  Long CsavedSR8;	/* 20 */
	  Long CsavedSR9;	/* 21 */
	  Long CsavedSR10;	/* 22 */
	  Long CsavedSR11;	/* 23 */
	  Long CsavedSR12;	/* 24 */
	  Long CsavedSR13;	/* 25 */
	  Long CsavedSR14;	/* 26 */
	  Long CsavedSR15;	/* 27 */
				/* CdoubleFPSCR must be double word aligned */
	  Long CdoubleFPSCR;	/* 28 this is the upper part of the store and has
				      no meaning */
	  Long CsavedFPSCR;	/* 29 */
	  Long CsavedMQ;	/* 30 */
	  Long CsavedBAT0U;	/* 31 */
	  Long CsavedBAT0L;	/* 32 */
	  Long CsavedBAT1U;	/* 33 */
	  Long CsavedBAT1L;	/* 34 */
	  Long CsavedBAT2U;	/* 35 */
	  Long CsavedBAT2L;	/* 36 */
	  Long CsavedBAT3U;	/* 37 */
	  Long CsavedBAT3L;	/* 38 */
	}
      SpecialRegistersEnumerated;

      Long SpecialRegistersIndexed[kNumberSpecialRegisters];
    } u;

  Long Padding[3];		/* Needed for quad-word alignment */
};

struct StackFrame
{
  LONG *ExceptionDomainID;
  /*ProcessorStructure*/ int *ExceptionProcessorID;
  BYTE *ExceptionDescription;
  LONG ExceptionFlags;
  LONG ExceptionErrorCode;
  LONG ExceptionNumber;
  struct SavedMachineState ExceptionState;
};

/* Register values.  All of these values *MUST* agree with tm.h */
#define	GP0_REGNUM 0		/* GPR register 0 */
#define SP_REGNUM 1		/* Contains address of top of stack */
#define FP0_REGNUM 32		/* FPR (Floating point) register 0 */
#define PC_REGNUM 64		/* Contains program counter */
#define PS_REGNUM 65		/* Processor (or machine) status (%msr) */
#define	CR_REGNUM 66		/* Condition register */
#define	LR_REGNUM 67		/* Link register */
#define	CTR_REGNUM 68		/* Count register */
#define	XER_REGNUM 69		/* Fixed point exception registers */
#define	MQ_REGNUM 70		/* Multiply/quotient register */
#define NUM_REGS 71		/* Number of machine registers */
#define REGISTER_BYTES (420)	/* Total size of registers array */

#define ExceptionPC ExceptionState.u.SpecialRegistersEnumerated.CsavedSRR0
#define DECR_PC_AFTER_BREAK 0	/* PPCs get this right! */
#define BREAKPOINT {0x7d, 0x82, 0x10, 0x08}
extern unsigned char breakpoint_insn[];
#define BREAKPOINT_SIZE 4

#if 0
#define ALTERNATE_MEM_FUNCS	/* We need our own get_char/set_char */
#endif

extern int get_char (char *addr);
extern void set_char (char *addr, int val);