OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [rtos/] [rtems/] [c/] [src/] [exec/] [score/] [cpu/] [hppa1.1/] [rtems/] [score/] [hppa.h] - Blame information for rev 578

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 30 unneback
/*
2
 *  Description:
3
 *
4
 * Definitions for HP PA Risc
5
 * ref: PA RISC 1.1 Architecture and Instruction Set Reference Manual
6
 *
7
 *  COPYRIGHT (c) 1994 by Division Incorporated
8
 *
9
 *  The license and distribution terms for this file may be
10
 *  found in the file LICENSE in this distribution or at
11
 *  http://www.OARcorp.com/rtems/license.html.
12
 *
13
 * Note:
14
 *      This file is included by both C and assembler code ( -DASM )
15
 *
16
 *  $Id: hppa.h,v 1.2 2001-09-27 11:59:24 chris Exp $
17
 */
18
 
19
#ifndef _INCLUDE_HPPA_H
20
#define _INCLUDE_HPPA_H
21
 
22
#ifdef ASM
23
#include <rtems/score/targopts.h>
24
#endif
25
 
26
#if defined(__cplusplus)
27
extern "C" {
28
#endif
29
 
30
/*
31
 *  This section contains the information required to build
32
 *  RTEMS for a particular member of the Hewlett Packard
33
 *  PA-RISC family.  It does this by setting variables to
34
 *  indicate which implementation dependent features are
35
 *  present in a particular member of the family.
36
 */
37
 
38
#if defined(rtems_multilib)
39
/*
40
 *  Figure out all CPU Model Feature Flags based upon compiler
41
 *  predefines.
42
 */
43
 
44
#define CPU_MODEL_NAME  "rtems_multilib"
45
 
46
#elif defined(hppa7100)
47
 
48
#define CPU_MODEL_NAME  "hppa 7100"
49
 
50
#elif defined(hppa7200)
51
 
52
#define CPU_MODEL_NAME  "hppa 7200"
53
 
54
#else
55
 
56
#error "Unsupported CPU Model"
57
 
58
#endif
59
 
60
/*
61
 *  Define the name of the CPU family.
62
 */
63
 
64
#if !defined(CPU_NAME)
65
#define CPU_NAME "HP PA-RISC 1.1"
66
#endif
67
 
68
/*
69
 * Processor Status Word (PSW) Masks
70
 */
71
 
72
 
73
#define HPPA_PSW_Y      0x80000000    /* Data Debug Trap Disable */
74
#define HPPA_PSW_Z      0x40000000    /* Instruction Debug Trap Disable */
75
#define HPPA_PSW_r2     0x20000000    /* reserved */
76
#define HPPA_PSW_r3     0x10000000    /* reserved */
77
#define HPPA_PSW_r4     0x08000000    /* reserved */
78
#define HPPA_PSW_E      0x04000000    /* Little Endian on Memory References */
79
#define HPPA_PSW_S      0x02000000    /* Secure Interval Timer */
80
#define HPPA_PSW_T      0x01000000    /* Taken Branch Trap Enable */
81
#define HPPA_PSW_H      0x00800000    /* Higher-Privilege Transfer Trap Enable*/
82
#define HPPA_PSW_L      0x00400000    /* Lower-Privilege Transfer Trap Enable */
83
#define HPPA_PSW_N      0x00200000    /* PC Queue Front Instruction Nullified */
84
#define HPPA_PSW_X      0x00100000    /* Data Memory Break Disable */
85
#define HPPA_PSW_B      0x00080000    /* Taken Branch in Previous Cycle */
86
#define HPPA_PSW_C      0x00040000    /* Code Address Translation Enable */
87
#define HPPA_PSW_V      0x00020000    /* Divide Step Correction */
88
#define HPPA_PSW_M      0x00010000    /* High-Priority Machine Check Disable */
89
#define HPPA_PSW_CB     0x0000ff00    /* Carry/Borrow Bits */
90
#define HPPA_PSW_r24    0x00000080    /* reserved */
91
#define HPPA_PSW_G      0x00000040    /* Debug trap Enable */
92
#define HPPA_PSW_F      0x00000020    /* Performance monitor interrupt unmask */
93
#define HPPA_PSW_R      0x00000010    /* Recovery Counter Enable */
94
#define HPPA_PSW_Q      0x00000008    /* Interruption State Collection Enable */
95
#define HPPA_PSW_P      0x00000004    /* Protection ID Validation Enable */
96
#define HPPA_PSW_D      0x00000002    /* Data Address Translation Enable */
97
#define HPPA_PSW_I      0x00000001    /* External, Power Failure, */
98
                                      /*   Low-Priority Machine Check */
99
                                      /*   Interruption Enable */
100
 
101
/*
102
 * HPPA traps and interrupts
103
 * basic layout.  Note numbers do not denote priority
104
 *
105
 *      0-31    basic traps and interrupts defined by HPPA architecture
106
 *      0-31    32 external interrupts
107
 *     32-...   bsp defined
108
 */
109
 
110
#define HPPA_TRAP_NON_EXISTENT                     0
111
/* group 1 */
112
#define HPPA_TRAP_HIGH_PRIORITY_MACHINE_CHECK      1
113
/* group 2 */
114
#define HPPA_TRAP_POWER_FAIL                       2
115
#define HPPA_TRAP_RECOVERY_COUNTER                 3
116
#define HPPA_TRAP_EXTERNAL_INTERRUPT               4
117
#define HPPA_TRAP_LOW_PRIORITY_MACHINE_CHECK       5
118
#define HPPA_TRAP_PERFORMANCE_MONITOR             29
119
/* group 3 */
120
#define HPPA_TRAP_INSTRUCTION_TLB_MISS             6
121
#define HPPA_TRAP_INSTRUCTION_MEMORY_PROTECTION    7
122
#define HPPA_TRAP_INSTRUCTION_DEBUG               30
123
#define HPPA_TRAP_ILLEGAL_INSTRUCTION              8
124
#define HPPA_TRAP_BREAK_INSTRUCTION                9
125
#define HPPA_TRAP_PRIVILEGED_OPERATION            10
126
#define HPPA_TRAP_PRIVILEGED_REGISTER             11
127
#define HPPA_TRAP_OVERFLOW                        12
128
#define HPPA_TRAP_CONDITIONAL                     13
129
#define HPPA_TRAP_ASSIST_EXCEPTION                14
130
#define HPPA_TRAP_DATA_TLB_MISS                   15
131
#define HPPA_TRAP_NON_ACCESS_INSTRUCTION_TLB_MISS 16
132
#define HPPA_TRAP_NON_ACCESS_DATA_TLB_MISS        17
133
#define HPPA_TRAP_DATA_MEMORY_ACCESS_RIGHTS       26
134
#define HPPA_TRAP_DATA_MEMORY_PROTECTION_ID       27
135
#define HPPA_TRAP_UNALIGNED_DATA_REFERENCE        28
136
#define HPPA_TRAP_DATA_MEMORY_PROTECTION          18
137
#define HPPA_TRAP_DATA_MEMORY_BREAK               19
138
#define HPPA_TRAP_TLB_DIRTY_BIT                   20
139
#define HPPA_TRAP_PAGE_REFERENCE                  21
140
#define HPPA_TRAP_DATA_DEBUG                      31
141
#define HPPA_TRAP_ASSIST_EMULATION                22
142
/* group 4 */
143
#define HPPA_TRAP_HIGHER_PRIVILEGE_TRANSFER       23
144
#define HPPA_TRAP_LOWER_PRIVILEGE_TRANSFER        24
145
#define HPPA_TRAP_TAKEN_BRANCH                    25
146
 
147
#define HPPA_INTERNAL_TRAPS                       32
148
 
149
/* External Interrupts via interrupt 4 */
150
 
151
#define HPPA_INTERRUPT_EXTERNAL_0                  0
152
#define HPPA_INTERRUPT_EXTERNAL_1                  1
153
#define HPPA_INTERRUPT_EXTERNAL_2                  2
154
#define HPPA_INTERRUPT_EXTERNAL_3                  3
155
#define HPPA_INTERRUPT_EXTERNAL_4                  4
156
#define HPPA_INTERRUPT_EXTERNAL_5                  5
157
#define HPPA_INTERRUPT_EXTERNAL_6                  6
158
#define HPPA_INTERRUPT_EXTERNAL_7                  7
159
#define HPPA_INTERRUPT_EXTERNAL_8                  8
160
#define HPPA_INTERRUPT_EXTERNAL_9                  9
161
#define HPPA_INTERRUPT_EXTERNAL_10                10
162
#define HPPA_INTERRUPT_EXTERNAL_11                11
163
#define HPPA_INTERRUPT_EXTERNAL_12                12
164
#define HPPA_INTERRUPT_EXTERNAL_13                13
165
#define HPPA_INTERRUPT_EXTERNAL_14                14
166
#define HPPA_INTERRUPT_EXTERNAL_15                15
167
#define HPPA_INTERRUPT_EXTERNAL_16                16
168
#define HPPA_INTERRUPT_EXTERNAL_17                17
169
#define HPPA_INTERRUPT_EXTERNAL_18                18
170
#define HPPA_INTERRUPT_EXTERNAL_19                19
171
#define HPPA_INTERRUPT_EXTERNAL_20                20
172
#define HPPA_INTERRUPT_EXTERNAL_21                21
173
#define HPPA_INTERRUPT_EXTERNAL_22                22
174
#define HPPA_INTERRUPT_EXTERNAL_23                23
175
#define HPPA_INTERRUPT_EXTERNAL_24                24
176
#define HPPA_INTERRUPT_EXTERNAL_25                25
177
#define HPPA_INTERRUPT_EXTERNAL_26                26
178
#define HPPA_INTERRUPT_EXTERNAL_27                27
179
#define HPPA_INTERRUPT_EXTERNAL_28                28
180
#define HPPA_INTERRUPT_EXTERNAL_29                29
181
#define HPPA_INTERRUPT_EXTERNAL_30                30
182
#define HPPA_INTERRUPT_EXTERNAL_31                31
183
 
184
#define HPPA_INTERRUPT_EXTERNAL_INTERVAL_TIMER    HPPA_INTERRUPT_EXTERNAL_0
185
#define HPPA_EXTERNAL_INTERRUPTS                  32
186
 
187
/* BSP defined interrupts begin here */
188
 
189
#define HPPA_INTERRUPT_MAX  32
190
 
191
/*
192
 * Cache characteristics
193
 */
194
 
195
#define HPPA_CACHELINE_SIZE     32
196
#define HPPA_CACHELINE_MASK     (HPPA_CACHELINE_SIZE - 1)
197
 
198
/*
199
 * page size characteristics
200
 */
201
 
202
#define HPPA_PAGE_SIZE          4096
203
#define HPPA_PAGE_MASK          (0xfffff000)
204
 
205
 
206
/*
207
 * TLB characteristics
208
 *
209
 * Flags and Access Control layout for using TLB protection insertion
210
 *
211
 *                      1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 3 3
212
 *  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
213
 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
214
 * |?|?|T|D|B|type |PL1|Pl2|U|           access id               |?|
215
 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
216
 *
217
 */
218
 
219
/*
220
 * Access rights (type + PL1 + PL2)
221
 */
222
#define HPPA_PROT_R    0x00c00000   /* Read Only, no Write, no Execute */
223
#define HPPA_PROT_RW   0x01c00000   /* Read & Write Only, no Execute */
224
#define HPPA_PROT_RX   0x02c00000   /* Read & Execute Only, no Write */
225
#define HPPA_PROT_RWX  0x03c00000   /* Read, Write, Execute */
226
#define HPPA_PROT_X0   0x04c00000   /* Execute Only, Promote to Level 0 */
227
#define HPPA_PROT_X1   0x05c00000   /* Execute Only, Promote to Level 1 */
228
#define HPPA_PROT_X2   0x06c00000   /* Execute Only, Promote to Level 2 */
229
#define HPPA_PROT_X3   0x07c00000   /* Execute Only, Promote to Level 3 */
230
 
231
/*
232
 * Floating point status register definitions
233
 */
234
 
235
#define HPPA_FPSTATUS_ENABLE_I    0x00000001    /* inexact operation */
236
#define HPPA_FPSTATUS_ENABLE_U    0x00000002    /* underflow */
237
#define HPPA_FPSTATUS_ENABLE_O    0x00000004    /* overflow */
238
#define HPPA_FPSTATUS_ENABLE_Z    0x00000008    /* division by zero */
239
#define HPPA_FPSTATUS_ENABLE_V    0x00000010    /* invalid operation */
240
#define HPPA_FPSTATUS_D           0x00000020    /* denormalize as zero */
241
#define HPPA_FPSTATUS_T           0x00000040    /* delayed trap */
242
#define HPPA_FPSTATUS_RM_MASK     0x00000600    /* rounding mode */
243
#define HPPA_FPSTATUS_RM_SHIFT    9
244
#define HPPA_FPSTATUS_CQ_MASK     0x001FFC00    /* compare queue */
245
#define HPPA_FPSTATUS_CQ_SHIFT    13
246
#define HPPA_FPSTATUS_C           0x04000000    /* most recent ompare bit */
247
#define HPPA_FPSTATUS_FLAG_I      0x08000000    /* inexact */
248
#define HPPA_FPSTATUS_FLAG_U      0x10000000    /* underflow */
249
#define HPPA_FPSTATUS_FLAG_O      0x20000000    /* overflow */
250
#define HPPA_FPSTATUS_FLAG_Z      0x40000000    /* division by zero */
251
#define HPPA_FPSTATUS_FLAG_V      0x80000000    /* invalid operation */
252
 
253
 
254
/*
255
 * Inline macros for misc. interesting opcodes
256
 */
257
 
258
/* generate a global label */
259
#define HPPA_ASM_LABEL(label) \
260
    asm(".export " label ", ! .label " label);
261
 
262
/* Return From Interrupt                RFI */
263
#define HPPA_ASM_RFI()                  asm volatile ("rfi")
264
 
265
/* Set System Mask                      SSM i,t */
266
#define HPPA_ASM_SSM(i,gr)              asm volatile ("ssm %1, %0" \
267
                                                      : "=r" (gr)   \
268
                                                      : "i"  (i))
269
/* Reset System Mask                    RSM i,t */
270
#define HPPA_ASM_RSM(i,gr)              asm volatile ("rsm %1, %0" \
271
                                                      : "=r" (gr)   \
272
                                                      : "i"  (i))
273
/* Move To System Mask                  MTSM r */
274
#define HPPA_ASM_MTSM(gr)               asm volatile ("mtsm %0" \
275
                                                      : : "r" (gr))
276
 
277
/* Load Space Identifier                LDSID (s,b),t */
278
#define HPPA_ASM_LDSID(sr,grb,grt)      asm volatile ("ldsid (%1,%2),%0" \
279
                                                      : "=r" (grt)  \
280
                                                      : "i"  (sr), \
281
                                                        "r"  (grb))
282
 
283
/*
284
 * Gcc extended asm doesn't really allow for treatment of space registers
285
 * as "registers", so we have to use "i" format.
286
 * Unfortunately this means that the "=" constraint is not available.
287
 */
288
 
289
/* Move To Space Register               MTSP r,sr */
290
#define HPPA_ASM_MTSP(gr,sr)            asm volatile ("mtsp %1,%0" \
291
                                                      : : "i"  (sr),  \
292
                                                          "r"  (gr))
293
 
294
/* Move From Space Register             MFSP sr,t */
295
#define HPPA_ASM_MFSP(sr,gr)            asm volatile ("mfsp %1,%0" \
296
                                                      : "=r" (gr)  \
297
                                                      : "i"  (sr))
298
 
299
/* Move To Control register             MTCTL r,t */
300
#define HPPA_ASM_MTCTL(gr,cr)           asm volatile ("mtctl %1,%0" \
301
                                                      : : "i" (cr), \
302
                                                          "r" (gr))
303
 
304
/* Move From Control register           MFCTL r,t */
305
#define HPPA_ASM_MFCTL(cr,gr)           asm volatile ("mfctl %1,%0" \
306
                                                      : "=r" (gr) \
307
                                                      : "i" (cr))
308
 
309
/* Synchronize caches                   SYNC */
310
#define HPPA_ASM_SYNC()                 asm volatile ("sync")
311
 
312
/* Probe Read Access                    PROBER (s,b),r,t */
313
#define HPPA_ASM_PROBER(sr,groff,gracc,grt) \
314
                                        asm volatile ("prober (%1,%2),%3,%0" \
315
                                                      : "=r" (grt) \
316
                                                      : "i"  (sr), \
317
                                                        "r"  (groff), \
318
                                                        "r"  (gracc))
319
 
320
/* Probe Read Access Immediate          PROBERI (s,b),i,t*/
321
#define HPPA_ASM_PROBERI(sr,groff,iacc,grt) \
322
                                        asm volatile ("proberi (%1,%2),%3,%0" \
323
                                                      : "=r" (grt) \
324
                                                      : "i"  (sr), \
325
                                                        "r"  (groff), \
326
                                                        "i"  (iacc))
327
 
328
/* Probe Write Access                   PROBEW (s,b),r,t */
329
#define HPPA_ASM_PROBEW(sr,groff,gracc,grt) \
330
                                        asm volatile ("probew (%1,%2),%3,%0" \
331
                                                      : "=r" (grt) \
332
                                                      : "i"  (sr), \
333
                                                        "r"  (groff), \
334
                                                        "r"  (gracc))
335
 
336
/* Probe Write Access Immediate         PROBEWI (s,b),i,t */
337
#define HPPA_ASM_PROBEWI(sr,groff,iacc,grt) \
338
                                        asm volatile ("probewi (%1,%2),%3,%0" \
339
                                                      : "=r" (grt) \
340
                                                      : "i"  (sr), \
341
                                                        "r"  (groff), \
342
                                                        "i"  (iacc))
343
 
344
/* Load Physical Address                LPA x(s,b),t */
345
#define HPPA_ASM_LPA(sr,grb,grt)        asm volatile ("lpa %%r0(%1,%2),%0" \
346
                                                      : "=r" (grt) \
347
                                                      : "i"  (sr), \
348
                                                        "r"  (grb))
349
 
350
/* Load Coherence Index                 LCI x(s,b),t */
351
/* AKA: Load Hash Address               LHA x(s,b),t */
352
#define HPPA_ASM_LCI(grx,sr,grb,grt)    asm volatile ("lha %1(%2,%3),%0" \
353
                                                      : "=r" (grt) \
354
                                                      : "r"  (grx),\
355
                                                        "i"  (sr), \
356
                                                        "r"  (grb))
357
#define HPPA_ASM_LHA(grx,sr,grb,grt)    HPPA_ASM_LCI(grx,sr,grb,grt)
358
 
359
/* Purge Data Tlb                       PDTLB  x(s,b) */
360
#define HPPA_ASM_PDTLB(grx,sr,grb)      asm volatile ("pdtlb %0(%1,%2)" \
361
                                                      : : "r"  (grx), \
362
                                                          "i"  (sr),  \
363
                                                          "r"  (grb))
364
 
365
/* Purge Instruction Tlb                PITLB  x(s,b) */
366
#define HPPA_ASM_PITLB(grx,sr,grb)      asm volatile ("pitlb %0(%1,%2)" \
367
                                                      : : "r"  (grx), \
368
                                                          "i"  (sr),  \
369
                                                          "r"  (grb))
370
 
371
/* Purge Data Tlb Entry                 PDTLBE  x(s,b) */
372
#define HPPA_ASM_PDTLBE(grx,sr,grb)     asm volatile ("pdtlbe %0(%1,%2)" \
373
                                                      : : "r"  (grx), \
374
                                                          "i"  (sr),  \
375
                                                          "r"  (grb))
376
 
377
/* Purge Instruction Tlb Entry          PITLBE  x(s,b) */
378
#define HPPA_ASM_PITLBE(grx,sr,grb)     asm volatile ("pitlbe %0(%1,%2)" \
379
                                                      : : "r"  (grx), \
380
                                                          "i"  (sr),  \
381
                                                          "r"  (grb))
382
 
383
 
384
/* Insert Data TLB Address              IDTLBA r,(s,b) */
385
#define HPPA_ASM_IDTLBA(gr,sr,grb)      asm volatile ("idtlba %0,(%1,%2)" \
386
                                                      : : "r"  (gr),  \
387
                                                          "i"  (sr),  \
388
                                                          "r"  (grb))
389
 
390
/* Insert Instruction TLB Address       IITLBA r,(s,b) */
391
#define HPPA_ASM_IITLBA(gr,sr,grb)      asm volatile ("iitlba %0,(%1,%2)" \
392
                                                      : : "r"  (gr),  \
393
                                                          "i"  (sr),  \
394
                                                          "r"  (grb))
395
 
396
/* Insert Data TLB Protection           IDTLBP r,(s,b) */
397
#define HPPA_ASM_IDTLBP(gr,sr,grb)      asm volatile ("idtlbp %0,(%1,%2)" \
398
                                                      : : "r"  (gr),  \
399
                                                          "i"  (sr),  \
400
                                                          "r"  (grb))
401
 
402
/* Insert Instruction TLB Protection    IITLBP r,(s,b) */
403
#define HPPA_ASM_IITLBP(gr,sr,grb)      asm volatile ("iitlbp %0,(%1,%2)" \
404
                                                      : : "r"  (gr),  \
405
                                                          "i"  (sr),  \
406
                                                          "r"  (grb))
407
 
408
/* Purge Data Cache                     PDC x(s,b) */
409
#define HPPA_ASM_PDC(grx,sr,grb)        asm volatile ("pdc %0(%1,%2)" \
410
                                                      : : "r"  (grx), \
411
                                                          "i"  (sr),  \
412
                                                          "r"  (grb))
413
 
414
/* Flush Data Cache                     FDC x(s,b) */
415
#define HPPA_ASM_FDC(grx,sr,grb)        asm volatile ("fdc %0(%1,%2)" \
416
                                                      : : "r"  (grx), \
417
                                                          "i"  (sr),  \
418
                                                          "r"  (grb))
419
 
420
/* Flush Instruction Cache              FDC x(s,b) */
421
#define HPPA_ASM_FIC(grx,sr,grb)        asm volatile ("fic %0(%1,%2)" \
422
                                                      : : "r"  (grx), \
423
                                                          "i"  (sr),  \
424
                                                          "r"  (grb))
425
 
426
/* Flush Data Cache Entry               FDCE x(s,b) */
427
#define HPPA_ASM_FDCE(grx,sr,grb)       asm volatile ("fdce %0(%1,%2)" \
428
                                                      : : "r"  (grx), \
429
                                                          "i"  (sr),  \
430
                                                          "r"  (grb))
431
 
432
/* Flush Instruction Cache Entry        FICE x(s,b) */
433
#define HPPA_ASM_FICE(grx,sr,grb)       asm volatile ("fice %0(%1,%2)" \
434
                                                      : : "r"  (grx), \
435
                                                          "i"  (sr),  \
436
                                                          "r"  (grb))
437
 
438
/* Break                                BREAK i5,i13 */
439
#define HPPA_ASM_BREAK(i5,i13)          asm volatile ("break %0,%1" \
440
                                                      : : "i" (i5), \
441
                                                          "i" (i13))
442
 
443
/* Load and Clear Word Short            LDCWS d(s,b),t */
444
#define HPPA_ASM_LDCWS(i,sr,grb,grt)    asm volatile ("ldcws %1(%2,%3),%0" \
445
                                                      : "=r" (grt) \
446
                                                      : "i"  (i),  \
447
                                                        "i"  (sr), \
448
                                                        "r"  (grb))
449
 
450
/* Load and Clear Word Indexed          LDCWX x(s,b),t */
451
#define HPPA_ASM_LDCWX(grx,sr,grb,grt)  asm volatile ("ldcwx %1(%2,%3),%0" \
452
                                                      : "=r" (grt)  \
453
                                                      : "r"  (grx), \
454
                                                        "i"  (sr),  \
455
                                                        "r"  (grb))
456
 
457
/* Load Word Absolute Short             LDWAS d(b),t */
458
/* NOTE: "short" here means "short displacement"     */
459
#define HPPA_ASM_LDWAS(disp,grbase,gr)  asm volatile("ldwas %1(%2),%0" \
460
                                                     : "=r" (gr)    \
461
                                                     : "i"  (disp), \
462
                                                       "r"  (grbase))
463
 
464
/* Store Word Absolute Short            STWAS r,d(b) */
465
/* NOTE: "short" here means "short displacement"     */
466
#define HPPA_ASM_STWAS(gr,disp,grbase)  asm volatile("stwas %0,%1(%2)" \
467
                                                     : : "r" (gr),   \
468
                                                         "i" (disp), \
469
                                                         "r" (grbase))
470
 
471
/*
472
 * Swap bytes
473
 * REFERENCE:  PA72000 TRM -- Appendix C
474
 */
475
#define HPPA_ASM_SWAPBYTES(value, swapped)  asm volatile( \
476
    " shd    %1,%1,16,%0  \n\
477
      dep    %0,15,8,%0   \n\
478
      shd    %1,%0,8,%0"    \
479
    : "=r" (swapped)        \
480
    : "r" (value)           \
481
  )
482
 
483
 
484
/* 72000 Diagnose instructions follow
485
 * These macros assume gas knows about these instructions.
486
 * gas2.2.u1 did not.
487
 * I added them to my copy and installed it locally.
488
 *
489
 * There are *very* special requirements for these guys
490
 *   ref: TRM 6.1.3 Programming Constraints
491
 *
492
 * The macros below handle the following rules
493
 *
494
 *   Except for WIT, WDT, WDD, WIDO, WIDE, all DIAGNOSE must be doubled.
495
 *   Must never be nullified (hence the leading nop)
496
 *   NOP must preced every RDD,RDT,WDD,WDT,RDTLB
497
 *   Instruction preceeding GR_SHDW must not set any of the GR's saved
498
 *
499
 * The macros do *NOT* deal with the following problems
500
 *   doubled DIAGNOSE instructions must not straddle a page boundary
501
 *       if code translation enabled.  (since 2nd could trap on ITLB)
502
 *   If you care about DHIT and DPE bits of DR0, then
503
 *       No store instruction in the 2 insn window before RDD
504
 */
505
 
506
 
507
/* Move To CPU/DIAG register            MTCPU r,t */
508
#define HPPA_ASM_MTCPU(gr,dr)           asm volatile (" nop \n"          \
509
                                                      " mtcpu %1,%0 \n"  \
510
                                                      " mtcpu %1,%0"     \
511
                                                      : : "i" (dr), \
512
                                                          "r" (gr))
513
 
514
/* Move From CPU/DIAG register          MFCPU r,t */
515
#define HPPA_ASM_MFCPU(dr,gr)           asm volatile (" nop \n"          \
516
                                                      " mfcpu %1,%0\n"   \
517
                                                      " mfcpu %1,%0"     \
518
                                                      : "=r" (gr) \
519
                                                      : "i" (dr))
520
 
521
/* Transfer of Control Enable           TOC_EN */
522
#define HPPA_ASM_TOC_EN()               asm volatile (" tocen \n" \
523
                                                      " tocen")
524
 
525
/* Transfer of Control Disable          TOC_DIS */
526
#define HPPA_ASM_TOC_DIS()              asm volatile (" tocdis \n" \
527
                                                      " tocdis")
528
 
529
/* Shadow Registers to General Register SHDW_GR */
530
#define HPPA_ASM_SHDW_GR()              asm volatile (" shdwgr \n" \
531
                                                      " shdwgr"    \
532
                                                ::: "r1" "r8" "r9" "r16" \
533
                                                    "r17" "r24" "r25")
534
 
535
/* General Registers to Shadow Register GR_SHDW */
536
#define HPPA_ASM_GR_SHDW()              asm volatile (" nop \n" \
537
                                                      " grshdw \n" \
538
                                                      " grshdw")
539
 
540
/*
541
 * Definitions of special registers for use by the above macros.
542
 */
543
 
544
/* Hardware Space Registers */
545
#define HPPA_SR0     0
546
#define HPPA_SR1     1
547
#define HPPA_SR2     2
548
#define HPPA_SR3     3
549
#define HPPA_SR4     4
550
#define HPPA_SR5     5
551
#define HPPA_SR6     6
552
#define HPPA_SR7     7
553
 
554
/* Hardware Control Registers */
555
#define HPPA_CR0     0
556
#define HPPA_RCTR    0               /* Recovery Counter Register */
557
 
558
#define HPPA_CR8     8               /* Protection ID 1 */
559
#define HPPA_PIDR1   8
560
 
561
#define HPPA_CR9     9               /* Protection ID 2 */
562
#define HPPA_PIDR2   9
563
 
564
#define HPPA_CR10    10
565
#define HPPA_CCR     10              /* Coprocessor Confiquration Register */
566
 
567
#define HPPA_CR11    11
568
#define HPPA_SAR     11              /* Shift Amount Register */
569
 
570
#define HPPA_CR12    12
571
#define HPPA_PIDR3   12              /* Protection ID 3 */
572
 
573
#define HPPA_CR13    13
574
#define HPPA_PIDR4   13              /* Protection ID 4 */
575
 
576
#define HPPA_CR14    14
577
#define HPPA_IVA     14              /* Interrupt Vector Address */
578
 
579
#define HPPA_CR15    15
580
#define HPPA_EIEM    15              /* External Interrupt Enable Mask */
581
 
582
#define HPPA_CR16    16
583
#define HPPA_ITMR    16              /* Interval Timer */
584
 
585
#define HPPA_CR17    17
586
#define HPPA_PCSQ    17              /* Program Counter Space queue */
587
 
588
#define HPPA_CR18    18
589
#define HPPA_PCOQ    18              /* Program Counter Offset queue */
590
 
591
#define HPPA_CR19    19
592
#define HPPA_IIR     19              /* Interruption Instruction Register */
593
 
594
#define HPPA_CR20    20
595
#define HPPA_ISR     20              /* Interruption Space Register */
596
 
597
#define HPPA_CR21    21
598
#define HPPA_IOR     21              /* Interruption Offset Register */
599
 
600
#define HPPA_CR22    22
601
#define HPPA_IPSW    22              /* Interrpution Processor Status Word */
602
 
603
#define HPPA_CR23    23
604
#define HPPA_EIRR    23              /* External Interrupt Request */
605
 
606
#define HPPA_CR24    24
607
#define HPPA_PPDA    24              /* Physcial Page Directory Address */
608
#define HPPA_TR0     24              /* Temporary register 0 */
609
 
610
#define HPPA_CR25    25
611
#define HPPA_HTA     25              /* Hash Table Address */
612
#define HPPA_TR1     25              /* Temporary register 1 */
613
 
614
#define HPPA_CR26    26
615
#define HPPA_TR2     26              /* Temporary register 2 */
616
 
617
#define HPPA_CR27    27
618
#define HPPA_TR3     27              /* Temporary register 3 */
619
 
620
#define HPPA_CR28    28
621
#define HPPA_TR4     28              /* Temporary register 4 */
622
 
623
#define HPPA_CR29    29
624
#define HPPA_TR5     29              /* Temporary register 5 */
625
 
626
#define HPPA_CR30    30
627
#define HPPA_TR6     30              /* Temporary register 6 */
628
 
629
#define HPPA_CR31    31
630
#define HPPA_CPUID   31              /* MP identifier */
631
 
632
/*
633
 * Diagnose registers
634
 */
635
 
636
#define HPPA_DR0      0
637
#define HPPA_DR1      1
638
#define HPPA_DR8      8
639
#define HPPA_DR24    24
640
#define HPPA_DR25    25
641
 
642
/*
643
 * Tear apart a break instruction to find its type.
644
 */
645
#define HPPA_BREAK5(x)          ((x) & 0x1F)
646
#define HPPA_BREAK13(x)         (((x) >> 13) & 0x1FFF)
647
 
648
/* assemble a break instruction */
649
#define HPPA_BREAK(i5,i13)      (((i5) & 0x1F) | (((i13) & 0x1FFF) << 13))
650
 
651
 
652
/*
653
 * this won't work in ASM or non-GNU compilers
654
 */
655
 
656
#if !defined(ASM) && defined(__GNUC__)
657
 
658
/*
659
 * static inline utility functions to get at control registers
660
 */
661
 
662
#define EMIT_GET_CONTROL(name, reg)            \
663
static __inline__ unsigned int                 \
664
get_ ## name (void)                            \
665
{                                              \
666
    unsigned int value;                        \
667
    HPPA_ASM_MFCTL(reg, value);                \
668
    return value;                              \
669
}
670
 
671
#define EMIT_SET_CONTROL(name, reg)            \
672
static __inline__ void                         \
673
set_ ## name (unsigned int new_value)          \
674
{                                              \
675
    HPPA_ASM_MTCTL(new_value, reg);            \
676
}
677
 
678
#define EMIT_CONTROLS(name, reg)               \
679
    EMIT_GET_CONTROL(name, reg)                \
680
    EMIT_SET_CONTROL(name, reg)
681
 
682
EMIT_CONTROLS(recovery, HPPA_RCTR);          /* CR0  */
683
EMIT_CONTROLS(pid1, HPPA_PIDR1);             /* CR8  */
684
EMIT_CONTROLS(pid2, HPPA_PIDR2);             /* CR9  */
685
EMIT_CONTROLS(ccr, HPPA_CCR);                /* CR10; CCR and SCR share CR10 */
686
EMIT_CONTROLS(scr, HPPA_CCR);                /* CR10; CCR and SCR share CR10 */
687
EMIT_CONTROLS(sar, HPPA_SAR);                /* CR11 */
688
EMIT_CONTROLS(pid3, HPPA_PIDR3);             /* CR12 */
689
EMIT_CONTROLS(pid4, HPPA_PIDR4);             /* CR13 */
690
EMIT_CONTROLS(iva, HPPA_IVA);                /* CR14 */
691
EMIT_CONTROLS(eiem, HPPA_EIEM);              /* CR15 */
692
EMIT_CONTROLS(itimer, HPPA_ITMR);            /* CR16 */
693
EMIT_CONTROLS(pcsq, HPPA_PCSQ);              /* CR17 */
694
EMIT_CONTROLS(pcoq, HPPA_PCOQ);              /* CR18 */
695
EMIT_CONTROLS(iir, HPPA_IIR);                /* CR19 */
696
EMIT_CONTROLS(isr, HPPA_ISR);                /* CR20 */
697
EMIT_CONTROLS(ior, HPPA_IOR);                /* CR21 */
698
EMIT_CONTROLS(ipsw, HPPA_IPSW);              /* CR22 */
699
EMIT_CONTROLS(eirr, HPPA_EIRR);              /* CR23 */
700
EMIT_CONTROLS(tr0, HPPA_TR0);                /* CR24 */
701
EMIT_CONTROLS(tr1, HPPA_TR1);                /* CR25 */
702
EMIT_CONTROLS(tr2, HPPA_TR2);                /* CR26 */
703
EMIT_CONTROLS(tr3, HPPA_TR3);                /* CR27 */
704
EMIT_CONTROLS(tr4, HPPA_TR4);                /* CR28 */
705
EMIT_CONTROLS(tr5, HPPA_TR5);                /* CR29 */
706
EMIT_CONTROLS(tr6, HPPA_TR6);                /* CR30 */
707
EMIT_CONTROLS(tr7, HPPA_CR31);               /* CR31 */
708
 
709
#endif /* ASM and GNU */
710
 
711
/*
712
 * If and How to invoke the debugger (a ROM debugger generally)
713
 */
714
#define CPU_INVOKE_DEBUGGER \
715
    do { \
716
        HPPA_ASM_BREAK(1,1); \
717
    } while (0)
718
 
719
#ifdef __cplusplus
720
}
721
#endif
722
 
723
#endif /* ! _INCLUDE_HPPA_H */
724
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.