source: rtems/c/src/exec/score/cpu/hppa1.1/hppa.h @ bf61e45c

4.104.114.84.95
Last change on this file since bf61e45c was ac7d5ef0, checked in by Joel Sherrill <joel.sherrill@…>, on 05/11/95 at 17:39:37

Initial revision

  • Property mode set to 100644
File size: 28.6 KB
Line 
1/*
2 *      @(#)hppa.h      1.5 - 95/04/25
3 *     
4 *
5 *  File:       $RCSfile$
6 *  Project:    PixelFlow
7 *  Created:    94/10/4
8 *  RespEngr:   tony bennett
9 *  Revision:   $Revision$
10 *  Last Mod:   $Date$
11 *
12 *  Description:
13 *             
14 * Definitions for HP PA Risc
15 * ref: PA RISC 1.1 Architecture and Instruction Set Reference Manual
16 *     
17 *  COPYRIGHT (c) 1994 by Division Incorporated
18 *
19 *  To anyone who acknowledges that this file is provided "AS IS"
20 *  without any express or implied warranty:
21 *      permission to use, copy, modify, and distribute this file
22 *      for any purpose is hereby granted without fee, provided that
23 *      the above copyright notice and this notice appears in all
24 *      copies, and that the name of Division Incorporated not be
25 *      used in advertising or publicity pertaining to distribution
26 *      of the software without specific, written prior permission.
27 *      Division Incorporated makes no representations about the
28 *      suitability of this software for any purpose.
29 *
30 *
31 * Note:
32 *      This file is included by both C and assembler code ( -DASM )
33 *
34 *  $Id$
35 */
36
37#ifndef _INCLUDE_HPPA_H
38#define _INCLUDE_HPPA_H
39
40#if defined(__cplusplus)
41extern "C" {
42#endif
43
44/*
45 *  The following define the CPU Family and Model within the family
46 *
47 *  NOTE: The string "REPLACE_THIS_WITH_THE_CPU_MODEL" is replaced
48 *        with the name of the appropriate macro for this target CPU.
49 */
50 
51#define hppa1_1
52#define REPLACE_THIS_WITH_THE_CPU_MODEL
53#define REPLACE_THIS_WITH_THE_BSP
54
55/*
56 *  This section contains the information required to build
57 *  RTEMS for a particular member of the Hewlett Packard
58 *  PA-RISC family.  It does this by setting variables to
59 *  indicate which implementation dependent features are
60 *  present in a particular member of the family.
61 */
62
63#if defined(hppa7100)
64
65#define RTEMS_MODEL_NAME  "hppa 7100"
66
67#elif defined(hppa7200)
68
69#define RTEMS_MODEL_NAME  "hppa 7200"
70
71#else
72
73#error "Unsupported CPU Model"
74
75#endif
76 
77/*
78 *  Define the name of the CPU family.
79 */
80
81#define CPU_NAME "HP PA-RISC 1.1"
82
83#ifndef ASM
84/*
85 *  This section defines the basic types for this processor.
86 */
87
88typedef unsigned char      unsigned8;  /* 8-bit  unsigned integer */
89typedef unsigned short     unsigned16; /* 16-bit unsigned integer */
90typedef unsigned int       unsigned32; /* 32-bit unsigned integer */
91typedef unsigned long long unsigned64; /* 64-bit unsigned integer */
92
93typedef unsigned16 Priority_Bit_map_control;
94
95typedef char      signed8;      /* 8-bit  signed integer */
96typedef short     signed16;     /* 16-bit signed integer */
97typedef int       signed32;     /* 32-bit signed integer */
98typedef long long signed64;     /* 64 bit signed integer */
99
100typedef unsigned32 boolean;     /* Boolean value   */
101
102typedef float     single_precision;     /* single precision float */
103typedef double    double_precision;     /* double precision float */
104
105#endif  /* !ASM */
106
107
108/*
109 * Processor Status Word (PSW) Masks
110 */
111
112#define HPPA_PSW_Y      0x80000000    /* Data Debug Trap Disable */
113#define HPPA_PSW_Z      0x40000000    /* Instruction Debug Trap Disable */
114#define HPPA_PSW_r2     0x20000000    /* reserved */
115#define HPPA_PSW_r3     0x10000000    /* reserved */
116#define HPPA_PSW_r4     0x08000000    /* reserved */
117#define HPPA_PSW_E      0x04000000    /* Little Endian on Memory References */
118#define HPPA_PSW_S      0x02000000    /* Secure Interval Timer */
119#define HPPA_PSW_T      0x01000000    /* Taken Branch Trap Enable */
120#define HPPA_PSW_H      0x00800000    /* Higher-Privilege Transfer Trap Enable*/
121#define HPPA_PSW_L      0x00400000    /* Lower-Privilege Transfer Trap Enable */
122#define HPPA_PSW_N      0x00200000    /* PC Queue Front Instruction Nullified */
123#define HPPA_PSW_X      0x00100000    /* Data Memory Break Disable */
124#define HPPA_PSW_B      0x00080000    /* Taken Branch in Previous Cycle */
125#define HPPA_PSW_C      0x00040000    /* Code Address Translation Enable */
126#define HPPA_PSW_V      0x00020000    /* Divide Step Correction */
127#define HPPA_PSW_M      0x00010000    /* High-Priority Machine Check Disable */
128#define HPPA_PSW_CB     0x0000ff00    /* Carry/Borrow Bits */
129#define HPPA_PSW_r24    0x00000080    /* reserved */
130#define HPPA_PSW_G      0x00000040    /* Debug trap Enable */
131#define HPPA_PSW_F      0x00000020    /* Performance monitor interrupt unmask */
132#define HPPA_PSW_R      0x00000010    /* Recovery Counter Enable */
133#define HPPA_PSW_Q      0x00000008    /* Interruption State Collection Enable */
134#define HPPA_PSW_P      0x00000004    /* Protection ID Validation Enable */
135#define HPPA_PSW_D      0x00000002    /* Data Address Translation Enable */
136#define HPPA_PSW_I      0x00000001    /* External, Power Failure, */
137                                      /*   Low-Priority Machine Check */
138                                      /*   Interruption Enable */
139
140/*
141 * HPPA traps and interrupts
142 * basic layout.  Note numbers do not denote priority
143 *
144 *      0-31    basic traps and interrupts defined by HPPA architecture
145 *     32-63    32 external interrupts
146 *     64-...   bsp defined
147 */
148
149#define HPPA_INTERRUPT_NON_EXISTENT                     0
150/* group 1 */
151#define HPPA_INTERRUPT_HIGH_PRIORITY_MACHINE_CHECK      1
152/* group 2 */
153#define HPPA_INTERRUPT_POWER_FAIL                       2
154#define HPPA_INTERRUPT_RECOVERY_COUNTER                 3
155#define HPPA_INTERRUPT_EXTERNAL_INTERRUPT               4
156#define HPPA_INTERRUPT_LOW_PRIORITY_MACHINE_CHECK       5
157#define HPPA_INTERRUPT_PERFORMANCE_MONITOR             29
158/* group 3 */
159#define HPPA_INTERRUPT_INSTRUCTION_TLB_MISS             6
160#define HPPA_INTERRUPT_INSTRUCTION_MEMORY_PROTECTION    7
161#define HPPA_INTERRUPT_INSTRUCTION_DEBUG               30
162#define HPPA_INTERRUPT_ILLEGAL_INSTRUCTION              8
163#define HPPA_INTERRUPT_BREAK_INSTRUCTION                9
164#define HPPA_INTERRUPT_PRIVILEGED_OPERATION            10
165#define HPPA_INTERRUPT_PRIVILEGED_REGISTER             11
166#define HPPA_INTERRUPT_OVERFLOW                        12
167#define HPPA_INTERRUPT_CONDITIONAL                     13
168#define HPPA_INTERRUPT_ASSIST_EXCEPTION                14
169#define HPPA_INTERRUPT_DATA_TLB_MISS                   15
170#define HPPA_INTERRUPT_NON_ACCESS_INSTRUCTION_TLB_MISS 16
171#define HPPA_INTERRUPT_NON_ACCESS_DATA_TLB_MISS        17
172#define HPPA_INTERRUPT_DATA_MEMORY_ACCESS_RIGHTS       26
173#define HPPA_INTERRUPT_DATA_MEMORY_PROTECTION_ID       27
174#define HPPA_INTERRUPT_UNALIGNED_DATA_REFERENCE        28
175#define HPPA_INTERRUPT_DATA_MEMORY_PROTECTION          18
176#define HPPA_INTERRUPT_DATA_MEMORY_BREAK               19
177#define HPPA_INTERRUPT_TLB_DIRTY_BIT                   20
178#define HPPA_INTERRUPT_PAGE_REFERENCE                  21
179#define HPPA_INTERRUPT_DATA_DEBUG                      31
180#define HPPA_INTERRUPT_ASSIST_EMULATION                22
181/* group 4 */
182#define HPPA_INTERRUPT_HIGHER_PRIVILEGE_TRANSFER       23
183#define HPPA_INTERRUPT_LOWER_PRIVILEGE_TRANSFER        24
184#define HPPA_INTERRUPT_TAKEN_BRANCH                    25
185
186#define HPPA_INTERRUPT_ON_CHIP_MAX                     31
187
188/* External Interrupts via interrupt 4 */
189
190#define HPPA_INTERRUPT_EXTERNAL_BASE                   32
191
192#define HPPA_INTERRUPT_EXTERNAL_0                      32
193#define HPPA_INTERRUPT_EXTERNAL_1                      33
194#define HPPA_INTERRUPT_EXTERNAL_2                      34
195#define HPPA_INTERRUPT_EXTERNAL_3                      35
196#define HPPA_INTERRUPT_EXTERNAL_4                      36
197#define HPPA_INTERRUPT_EXTERNAL_5                      37
198#define HPPA_INTERRUPT_EXTERNAL_6                      38
199#define HPPA_INTERRUPT_EXTERNAL_7                      39
200#define HPPA_INTERRUPT_EXTERNAL_8                      40
201#define HPPA_INTERRUPT_EXTERNAL_9                      41
202#define HPPA_INTERRUPT_EXTERNAL_10                     42
203#define HPPA_INTERRUPT_EXTERNAL_11                     43
204#define HPPA_INTERRUPT_EXTERNAL_12                     44
205#define HPPA_INTERRUPT_EXTERNAL_13                     45
206#define HPPA_INTERRUPT_EXTERNAL_14                     46
207#define HPPA_INTERRUPT_EXTERNAL_15                     47
208#define HPPA_INTERRUPT_EXTERNAL_16                     48
209#define HPPA_INTERRUPT_EXTERNAL_17                     49
210#define HPPA_INTERRUPT_EXTERNAL_18                     50
211#define HPPA_INTERRUPT_EXTERNAL_19                     51
212#define HPPA_INTERRUPT_EXTERNAL_20                     52
213#define HPPA_INTERRUPT_EXTERNAL_21                     53
214#define HPPA_INTERRUPT_EXTERNAL_22                     54
215#define HPPA_INTERRUPT_EXTERNAL_23                     55
216#define HPPA_INTERRUPT_EXTERNAL_24                     56
217#define HPPA_INTERRUPT_EXTERNAL_25                     57
218#define HPPA_INTERRUPT_EXTERNAL_26                     58
219#define HPPA_INTERRUPT_EXTERNAL_27                     59
220#define HPPA_INTERRUPT_EXTERNAL_28                     60
221#define HPPA_INTERRUPT_EXTERNAL_29                     61
222#define HPPA_INTERRUPT_EXTERNAL_30                     62
223#define HPPA_INTERRUPT_EXTERNAL_31                     63
224
225#define HPPA_INTERRUPT_EXTERNAL_INTERVAL_TIMER         HPPA_INTERRUPT_EXTERNAL_0
226#define HPPA_EXTERNAL_INTERRUPTS                       32
227
228/* BSP defined interrupts begin here */
229
230#define HPPA_INTERRUPT_MAX  64
231
232/*
233 * Inline macros for misc. interesting opcodes
234 */
235
236/* generate a global label */
237#define HPPA_ASM_LABEL(label) \
238    asm(".export " label ", ! .label " label);
239
240/* Return From Interrupt                RFI */
241#define HPPA_ASM_RFI()                  asm volatile ("rfi")
242
243/* Set System Mask                      SSM i,t */
244#define HPPA_ASM_SSM(i,gr)              asm volatile ("ssm %1, %0" \
245                                                      : "=r" (gr)   \
246                                                      : "i"  (i))
247/* Reset System Mask                    RSM i,t */
248#define HPPA_ASM_RSM(i,gr)              asm volatile ("rsm %1, %0" \
249                                                      : "=r" (gr)   \
250                                                      : "i"  (i))
251/* Move To System Mask                  MTSM r */
252#define HPPA_ASM_MTSM(gr)               asm volatile ("mtsm %0" \
253                                                      : : "r" (gr))
254
255/* Load Space Identifier                LDSID (s,b),t */
256#define HPPA_ASM_LDSID(sr,grb,grt)      asm volatile ("ldsid (%1,%2),%0" \
257                                                      : "=r" (grt)  \
258                                                      : "i"  (sr), \
259                                                        "r"  (grb))
260
261/*
262 * Gcc extended asm doesn't really allow for treatment of space registers
263 * as "registers", so we have to use "i" format.
264 * Unfortunately this means that the "=" constraint is not available.
265 */
266
267/* Move To Space Register               MTSP r,sr */
268#define HPPA_ASM_MTSP(gr,sr)            asm volatile ("mtsp %1,%0" \
269                                                      : : "i"  (sr),  \
270                                                          "r"  (gr))
271
272/* Move From Space Register             MFSP sr,t */
273#define HPPA_ASM_MFSP(sr,gr)            asm volatile ("mfsp %1,%0" \
274                                                      : "=r" (gr)  \
275                                                      : "i"  (sr))
276
277/* Move To Control register             MTCTL r,t */
278#define HPPA_ASM_MTCTL(gr,cr)           asm volatile ("mtctl %1,%0" \
279                                                      : : "i" (cr), \
280                                                          "r" (gr))
281
282/* Move From Control register           MFCTL r,t */
283#define HPPA_ASM_MFCTL(cr,gr)           asm volatile ("mfctl %1,%0" \
284                                                      : "=r" (gr) \
285                                                      : "i" (cr))
286
287/* Synchronize caches                   SYNC */
288#define HPPA_ASM_SYNC()                 asm volatile ("sync")
289
290/* Probe Read Access                    PROBER (s,b),r,t */
291#define HPPA_ASM_PROBER(sr,groff,gracc,grt) \
292                                        asm volatile ("prober (%1,%2),%3,%0" \
293                                                      : "=r" (grt) \
294                                                      : "i"  (sr), \
295                                                        "r"  (groff), \
296                                                        "r"  (gracc))
297
298/* Probe Read Access Immediate          PROBERI (s,b),i,t*/
299#define HPPA_ASM_PROBERI(sr,groff,iacc,grt) \
300                                        asm volatile ("proberi (%1,%2),%3,%0" \
301                                                      : "=r" (grt) \
302                                                      : "i"  (sr), \
303                                                        "r"  (groff), \
304                                                        "i"  (iacc))
305
306/* Probe Write Access                   PROBEW (s,b),r,t */
307#define HPPA_ASM_PROBEW(sr,groff,gracc,grt) \
308                                        asm volatile ("probew (%1,%2),%3,%0" \
309                                                      : "=r" (grt) \
310                                                      : "i"  (sr), \
311                                                        "r"  (groff), \
312                                                        "r"  (gracc))
313
314/* Probe Write Access Immediate         PROBEWI (s,b),i,t */
315#define HPPA_ASM_PROBEWI(sr,groff,iacc,grt) \
316                                        asm volatile ("probewi (%1,%2),%3,%0" \
317                                                      : "=r" (grt) \
318                                                      : "i"  (sr), \
319                                                        "r"  (groff), \
320                                                        "i"  (iacc))
321
322/* Load Physical Address                LPA x(s,b),t */
323#define HPPA_ASM_LPA(sr,grb,grt)        asm volatile ("lpa %%r0(%1,%2),%0" \
324                                                      : "=r" (grt) \
325                                                      : "i"  (sr), \
326                                                        "r"  (grb))
327
328/* Load Coherence Index                 LCI x(s,b),t */
329/* AKA: Load Hash Address               LHA x(s,b),t */
330#define HPPA_ASM_LCI(grx,sr,grb,grt)    asm volatile ("lha %1(%2,%3),%0" \
331                                                      : "=r" (grt) \
332                                                      : "r"  (grx),\
333                                                        "i"  (sr), \
334                                                        "r"  (grb))
335#define HPPA_ASM_LHA(grx,sr,grb,grt)    HPPA_ASM_LCI(grx,sr,grb,grt)
336
337/* Purge Data Tlb                       PDTLB  x(s,b) */
338#define HPPA_ASM_PDTLB(grx,sr,grb)      asm volatile ("pdtlb %0(%1,%2)" \
339                                                      : : "r"  (grx), \
340                                                          "i"  (sr),  \
341                                                          "r"  (grb))
342
343/* Purge Instruction Tlb                PITLB  x(s,b) */
344#define HPPA_ASM_PITLB(grx,sr,grb)      asm volatile ("pitlb %0(%1,%2)" \
345                                                      : : "r"  (grx), \
346                                                          "i"  (sr),  \
347                                                          "r"  (grb))
348
349/* Purge Data Tlb Entry                 PDTLBE  x(s,b) */
350#define HPPA_ASM_PDTLBE(grx,sr,grb)     asm volatile ("pdtlbe %0(%1,%2)" \
351                                                      : : "r"  (grx), \
352                                                          "i"  (sr),  \
353                                                          "r"  (grb))
354
355/* Purge Instruction Tlb Entry          PITLBE  x(s,b) */
356#define HPPA_ASM_PITLBE(grx,sr,grb)     asm volatile ("pitlbe %0(%1,%2)" \
357                                                      : : "r"  (grx), \
358                                                          "i"  (sr),  \
359                                                          "r"  (grb))
360
361
362/* Insert Data TLB Address              IDTLBA r,(s,b) */
363#define HPPA_ASM_IDTLBA(gr,sr,grb)      asm volatile ("idtlba %0,(%1,%2)" \
364                                                      : : "r"  (gr),  \
365                                                          "i"  (sr),  \
366                                                          "r"  (grb))
367
368/* Insert Instruction TLB Address       IITLBA r,(s,b) */
369#define HPPA_ASM_IITLBA(gr,sr,grb)      asm volatile ("iitlba %0,(%1,%2)" \
370                                                      : : "r"  (gr),  \
371                                                          "i"  (sr),  \
372                                                          "r"  (grb))
373
374/* Insert Data TLB Protection           IDTLBP r,(s,b) */
375#define HPPA_ASM_IDTLBP(gr,sr,grb)      asm volatile ("idtlbp %0,(%1,%2)" \
376                                                      : : "r"  (gr),  \
377                                                          "i"  (sr),  \
378                                                          "r"  (grb))
379
380/* Insert Instruction TLB Protection    IITLBP r,(s,b) */
381#define HPPA_ASM_IITLBP(gr,sr,grb)      asm volatile ("iitlbp %0,(%1,%2)" \
382                                                      : : "r"  (gr),  \
383                                                          "i"  (sr),  \
384                                                          "r"  (grb))
385
386/* Purge Data Cache                     PDC x(s,b) */
387#define HPPA_ASM_PDC(grx,sr,grb)        asm volatile ("pdc %0(%1,%2)" \
388                                                      : : "r"  (grx), \
389                                                          "i"  (sr),  \
390                                                          "r"  (grb))
391
392/* Flush Data Cache                     FDC x(s,b) */
393#define HPPA_ASM_FDC(grx,sr,grb)        asm volatile ("fdc %0(%1,%2)" \
394                                                      : : "r"  (grx), \
395                                                          "i"  (sr),  \
396                                                          "r"  (grb))
397
398/* Flush Instruction Cache              FDC x(s,b) */
399#define HPPA_ASM_FIC(grx,sr,grb)        asm volatile ("fic %0(%1,%2)" \
400                                                      : : "r"  (grx), \
401                                                          "i"  (sr),  \
402                                                          "r"  (grb))
403
404/* Flush Data Cache Entry               FDCE x(s,b) */
405#define HPPA_ASM_FDCE(grx,sr,grb)       asm volatile ("fdce %0(%1,%2)" \
406                                                      : : "r"  (grx), \
407                                                          "i"  (sr),  \
408                                                          "r"  (grb))
409
410/* Flush Instruction Cache Entry        FICE x(s,b) */
411#define HPPA_ASM_FICE(grx,sr,grb)       asm volatile ("fice %0(%1,%2)" \
412                                                      : : "r"  (grx), \
413                                                          "i"  (sr),  \
414                                                          "r"  (grb))
415
416/* Break                                BREAK i5,i13 */
417#define HPPA_ASM_BREAK(i5,i13)          asm volatile ("break %0,%1" \
418                                                      : : "i" (i5), \
419                                                          "i" (i13))
420
421/* Load and Clear Word Short            LDCWS d(s,b),t */
422#define HPPA_ASM_LDCWS(i,sr,grb,grt)    asm volatile ("ldcws %1(%2,%3),%0" \
423                                                      : "=r" (grt) \
424                                                      : "i"  (i),  \
425                                                        "i"  (sr), \
426                                                        "r"  (grb))
427
428/* Load and Clear Word Indexed          LDCWX x(s,b),t */
429#define HPPA_ASM_LDCWX(grx,sr,grb,grt)  asm volatile ("ldcwx %1(%2,%3),%0" \
430                                                      : "=r" (grt)  \
431                                                      : "r"  (grx), \
432                                                        "i"  (sr),  \
433                                                        "r"  (grb))
434
435/* Load Word Absolute Short             LDWAS d(b),t */
436/* NOTE: "short" here means "short displacement"     */
437#define HPPA_ASM_LDWAS(disp,grbase,gr)  asm volatile("ldwas %1(%2),%0" \
438                                                     : "=r" (gr)    \
439                                                     : "i"  (disp), \
440                                                       "r"  (grbase))
441
442/* Store Word Absolute Short            STWAS r,d(b) */
443/* NOTE: "short" here means "short displacement"     */
444#define HPPA_ASM_STWAS(gr,disp,grbase)  asm volatile("stwas %0,%1(%2)" \
445                                                     : : "r" (gr),   \
446                                                         "i" (disp), \
447                                                         "r" (grbase))
448
449/*
450 * Swap bytes
451 * REFERENCE:  PA72000 TRM -- Appendix C
452 */
453#define HPPA_ASM_SWAPBYTES(value, swapped)  asm volatile( \
454    " shd    %1,%1,16,%0  \n\
455      dep    %0,15,8,%0   \n\
456      shd    %1,%0,8,%0"    \
457    : "=r" (swapped)        \
458    : "r" (value)           \
459  )
460
461
462/* 72000 Diagnose instructions follow
463 * These macros assume gas knows about these instructions.
464 * gas2.2.u1 did not.
465 * I added them to my copy and installed it locally.
466 *
467 * There are *very* special requirements for these guys
468 *   ref: TRM 6.1.3 Programming Constraints
469 *
470 * The macros below handle the following rules
471 *
472 *   Except for WIT, WDT, WDD, WIDO, WIDE, all DIAGNOSE must be doubled.
473 *   Must never be nullified (hence the leading nop)
474 *   NOP must preced every RDD,RDT,WDD,WDT,RDTLB
475 *   Instruction preceeding GR_SHDW must not set any of the GR's saved
476 *
477 * The macros do *NOT* deal with the following problems
478 *   doubled DIAGNOSE instructions must not straddle a page boundary
479 *       if code translation enabled.  (since 2nd could trap on ITLB)
480 *   If you care about DHIT and DPE bits of DR0, then
481 *       No store instruction in the 2 insn window before RDD
482 */
483
484
485/* Move To CPU/DIAG register            MTCPU r,t */
486#define HPPA_ASM_MTCPU(gr,dr)           asm volatile (" nop \n"          \
487                                                      " mtcpu %1,%0 \n"  \
488                                                      " mtcpu %1,%0"     \
489                                                      : : "i" (dr), \
490                                                          "r" (gr))
491
492/* Move From CPU/DIAG register          MFCPU r,t */
493#define HPPA_ASM_MFCPU(dr,gr)           asm volatile (" nop \n"          \
494                                                      " mfcpu %1,%0\n"   \
495                                                      " mfcpu %1,%0"     \
496                                                      : "=r" (gr) \
497                                                      : "i" (dr))
498
499/* Transfer of Control Enable           TOC_EN */
500#define HPPA_ASM_TOC_EN()               asm volatile (" tocen \n" \
501                                                      " tocen")
502
503/* Transfer of Control Disable          TOC_DIS */
504#define HPPA_ASM_TOC_DIS()              asm volatile (" tocdis \n" \
505                                                      " tocdis")
506
507/* Shadow Registers to General Register SHDW_GR */
508#define HPPA_ASM_SHDW_GR()              asm volatile (" shdwgr \n" \
509                                                      " shdwgr"    \
510                                                ::: "r1" "r8" "r9" "r16" \
511                                                    "r17" "r24" "r25")
512
513/* General Registers to Shadow Register GR_SHDW */
514#define HPPA_ASM_GR_SHDW()              asm volatile (" nop \n" \
515                                                      " grshdw \n" \
516                                                      " grshdw")
517
518/*
519 * Definitions of special registers for use by the above macros.
520 */
521
522/* Hardware Space Registers */
523#define SR0     0
524#define SR1     1
525#define SR2     2
526#define SR3     3
527#define SR4     4
528#define SR5     5
529#define SR6     6
530#define SR7     7
531
532/* Hardware Control Registers */
533#define CR0     0
534#define RCTR    0               /* Recovery Counter Register */
535
536#define CR8     8               /* Protection ID 1 */
537#define PIDR1   8
538
539#define CR9     9               /* Protection ID 2 */
540#define PIDR2   9
541
542#define CR10    10
543#define CCR     10              /* Coprocessor Confiquration Register */
544
545#define CR11    11
546#define SAR     11              /* Shift Amount Register */
547
548#define CR12    12
549#define PIDR3   12              /* Protection ID 3 */
550
551#define CR13    13
552#define PIDR4   13              /* Protection ID 4 */
553
554#define CR14    14
555#define IVA     14              /* Interrupt Vector Address */
556
557#define CR15    15
558#define EIEM    15              /* External Interrupt Enable Mask */
559
560#define CR16    16
561#define ITMR    16              /* Interval Timer */
562
563#define CR17    17
564#define PCSQ    17              /* Program Counter Space queue */
565
566#define CR18    18
567#define PCOQ    18              /* Program Counter Offset queue */
568
569#define CR19    19
570#define IIR     19              /* Interruption Instruction Register */
571
572#define CR20    20
573#define ISR     20              /* Interruption Space Register */
574
575#define CR21    21
576#define IOR     21              /* Interruption Offset Register */
577
578#define CR22    22
579#define IPSW    22              /* Interrpution Processor Status Word */
580
581#define CR23    23
582#define EIRR    23              /* External Interrupt Request */
583
584#define CR24    24
585#define PPDA    24              /* Physcial Page Directory Address */
586#define TR0     24              /* Temporary register 0 */
587
588#define CR25    25
589#define HTA     25              /* Hash Table Address */
590#define TR1     25              /* Temporary register 1 */
591
592#define CR26    26
593#define TR2     26              /* Temporary register 2 */
594
595#define CR27    27
596#define TR3     27              /* Temporary register 3 */
597
598#define CR28    28
599#define TR4     28              /* Temporary register 4 */
600
601#define CR29    29
602#define TR5     29              /* Temporary register 5 */
603
604#define CR30    30
605#define TR6     30              /* Temporary register 6 */
606
607#define CR31    31
608#define CPUID   31              /* MP identifier */
609
610/*
611 * Diagnose registers
612 */
613
614#define DR0      0
615#define DR1      1
616#define DR8      8
617#define DR24    24
618#define DR25    25
619
620/*
621 * Tear apart a break instruction to find its type.
622 */
623#define HPPA_BREAK5(x)          ((x) & 0x1F)
624#define HPPA_BREAK13(x)         (((x) >> 13) & 0x1FFF)
625
626/* assemble a break instruction */
627#define HPPA_BREAK(i5,i13)      (((i5) & 0x1F) | (((i13) & 0x1FFF) << 13))
628
629
630#ifndef ASM
631
632/*
633 * static inline utility functions to get at control registers
634 */
635
636#define EMIT_GET_CONTROL(name, reg)            \
637static __inline__ unsigned int                 \
638get_ ## name (void)                            \
639{                                              \
640    unsigned int value;                        \
641    HPPA_ASM_MFCTL(reg, value);                \
642    return value;                              \
643}
644
645#define EMIT_SET_CONTROL(name, reg)            \
646static __inline__ unsigned int                 \
647set_ ## name (unsigned int new_value)          \
648{                                              \
649    HPPA_ASM_MTCTL(new_value, reg);            \
650}
651
652#define EMIT_CONTROLS(name, reg)               \
653    EMIT_GET_CONTROL(name, reg)                \
654    EMIT_SET_CONTROL(name, reg)
655
656EMIT_CONTROLS(recovery, RCTR);          /* CR0  */
657EMIT_CONTROLS(pid1, PIDR1);             /* CR8  */
658EMIT_CONTROLS(pid2, PIDR2);             /* CR9  */
659EMIT_CONTROLS(ccr, CCR);                /* CR10; CCR and SCR share CR10 */
660EMIT_CONTROLS(scr, CCR);                /* CR10; CCR and SCR share CR10 */
661EMIT_CONTROLS(sar, SAR);                /* CR11 */
662EMIT_CONTROLS(pid3, PIDR3);             /* CR12 */
663EMIT_CONTROLS(pid4, PIDR4);             /* CR13 */
664EMIT_CONTROLS(iva, IVA);                /* CR14 */
665EMIT_CONTROLS(eiem, EIEM);              /* CR15 */
666EMIT_CONTROLS(itimer, ITMR);            /* CR16 */
667EMIT_CONTROLS(pcsq, PCSQ);              /* CR17 */
668EMIT_CONTROLS(pcoq, PCOQ);              /* CR18 */
669EMIT_CONTROLS(iir, IIR);                /* CR19 */
670EMIT_CONTROLS(isr, ISR);                /* CR20 */
671EMIT_CONTROLS(ior, IOR);                /* CR21 */
672EMIT_CONTROLS(ipsw, IPSW);              /* CR22 */
673EMIT_CONTROLS(eirr, EIRR);              /* CR23 */
674EMIT_CONTROLS(tr0, TR0);                /* CR24 */
675EMIT_CONTROLS(tr1, TR1);                /* CR25 */
676EMIT_CONTROLS(tr2, TR2);                /* CR26 */
677EMIT_CONTROLS(tr3, TR3);                /* CR27 */
678EMIT_CONTROLS(tr4, TR4);                /* CR28 */
679EMIT_CONTROLS(tr5, TR5);                /* CR29 */
680EMIT_CONTROLS(tr6, TR6);                /* CR30 */
681EMIT_CONTROLS(tr7, CR31);               /* CR31 */
682
683/*
684 * If and How to invoke the debugger (a ROM debugger generally)
685 */
686
687#ifdef SIMHPPA_ROM
688/* invoke the pflow debugger */
689#define CPU_INVOKE_DEBUGGER  \
690    do { \
691        extern void debugger_break(void); \
692        debugger_break(); \
693    } while (0)
694#endif
695
696
697#endif /* ASM */
698
699#ifdef __cplusplus
700}
701#endif
702
703#endif /* ! _INCLUDE_HPPA_H */
704
Note: See TracBrowser for help on using the repository browser.