Home | History | Annotate | Line # | Download | only in ppc
      1      1.1  christos /*  This file is part of the program psim.
      2      1.1  christos 
      3      1.1  christos     Copyright 1994, 1997, 2003 Andrew Cagney
      4      1.1  christos 
      5      1.1  christos     This program is free software; you can redistribute it and/or modify
      6      1.1  christos     it under the terms of the GNU General Public License as published by
      7  1.1.1.2  christos     the Free Software Foundation; either version 3 of the License, or
      8      1.1  christos     (at your option) any later version.
      9      1.1  christos 
     10      1.1  christos     This program is distributed in the hope that it will be useful,
     11      1.1  christos     but WITHOUT ANY WARRANTY; without even the implied warranty of
     12      1.1  christos     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     13      1.1  christos     GNU General Public License for more details.
     14      1.1  christos 
     15      1.1  christos     You should have received a copy of the GNU General Public License
     16  1.1.1.2  christos     along with this program; if not, see <http://www.gnu.org/licenses/>.
     17      1.1  christos 
     18      1.1  christos     */
     19      1.1  christos 
     20      1.1  christos 
     21      1.1  christos #ifndef _REGISTERS_H_
     22      1.1  christos #define _REGISTERS_H_
     23      1.1  christos 
     24      1.1  christos 
     25      1.1  christos /*
     26      1.1  christos  * The PowerPC registers
     27      1.1  christos  *
     28      1.1  christos  */
     29      1.1  christos 
     30      1.1  christos /* FIXME:
     31      1.1  christos 
     32      1.1  christos    For the moment use macro's to determine if the E500 or Altivec
     33      1.1  christos    registers should be included.  IGEN should instead of a :register:
     34      1.1  christos    field to facilitate the specification and generation of per ISA
     35      1.1  christos    registers.  */
     36      1.1  christos 
     37      1.1  christos #ifdef WITH_E500
     38      1.1  christos #include "e500_registers.h"
     39      1.1  christos #endif
     40      1.1  christos #if WITH_ALTIVEC
     41      1.1  christos #include "altivec_registers.h"
     42      1.1  christos #endif
     43      1.1  christos 
     44      1.1  christos /**
     45      1.1  christos  ** General Purpose Registers
     46      1.1  christos  **/
     47      1.1  christos 
     48      1.1  christos typedef signed_word gpreg;
     49      1.1  christos 
     50      1.1  christos 
     51      1.1  christos 
     52      1.1  christos /**
     53      1.1  christos  ** Floating Point Registers
     54      1.1  christos  **/
     55      1.1  christos 
     56  1.1.1.3  christos typedef uint64_t fpreg;
     57      1.1  christos 
     58      1.1  christos 
     59      1.1  christos 
     60      1.1  christos /**
     61      1.1  christos  ** The condition register
     62      1.1  christos  **
     63      1.1  christos  **/
     64      1.1  christos 
     65  1.1.1.3  christos typedef uint32_t creg;
     66      1.1  christos 
     67      1.1  christos /* The following sub bits are defined for the condition register */
     68      1.1  christos enum {
     69      1.1  christos   cr_i_negative = BIT4(0),
     70      1.1  christos   cr_i_positive = BIT4(1),
     71      1.1  christos   cr_i_zero = BIT4(2),
     72      1.1  christos   cr_i_summary_overflow = BIT4(3),
     73      1.1  christos #if 0
     74      1.1  christos   /* cr0 - integer status */
     75      1.1  christos   cr0_i_summary_overflow_bit = 3,
     76      1.1  christos   cr0_i_negative = BIT32(0),
     77      1.1  christos   cr0_i_positive = BIT32(1),
     78      1.1  christos   cr0_i_zero = BIT32(2),
     79      1.1  christos   cr0_i_summary_overflow = BIT32(3),
     80      1.1  christos   cr0_i_mask = MASK32(0,3),
     81      1.1  christos #endif
     82      1.1  christos   /* cr1 - floating-point status */
     83      1.1  christos   cr1_i_floating_point_exception_summary_bit = 4,
     84      1.1  christos   cr1_i_floating_point_enabled_exception_summary_bit = 5,
     85      1.1  christos   cr1_i_floating_point_invalid_operation_exception_summary_bit = 6,
     86      1.1  christos   cr1_i_floating_point_overflow_exception_bit = 7,
     87      1.1  christos   cr1_i_floating_point_exception_summary = BIT32(4),
     88      1.1  christos   cr1_i_floating_point_enabled_exception_summary = BIT32(5),
     89      1.1  christos   cr1_i_floating_point_invalid_operation_exception_summary = BIT32(6),
     90      1.1  christos   cr1_i_floating_point_overflow_exception = BIT32(7),
     91      1.1  christos   cr1_i_mask = MASK32(4,7),
     92      1.1  christos };
     93      1.1  christos 
     94      1.1  christos 
     95      1.1  christos /* Condition register 1 contains the result of floating point arithmetic */
     96      1.1  christos enum {
     97      1.1  christos   cr_fp_exception = BIT4(0),
     98      1.1  christos   cr_fp_enabled_exception = BIT4(1),
     99      1.1  christos   cr_fp_invalid_exception = BIT4(2),
    100      1.1  christos   cr_fp_overflow_exception = BIT4(3),
    101      1.1  christos };
    102      1.1  christos 
    103      1.1  christos 
    104      1.1  christos 
    105      1.1  christos /**
    106      1.1  christos  ** Floating-Point Status and Control Register
    107      1.1  christos  **/
    108      1.1  christos 
    109  1.1.1.3  christos typedef uint32_t fpscreg;
    110      1.1  christos enum {
    111      1.1  christos   fpscr_fx_bit = 0,
    112      1.1  christos   fpscr_fx = BIT32(0),
    113      1.1  christos   fpscr_fex_bit = 1,
    114      1.1  christos   fpscr_fex = BIT32(1),
    115      1.1  christos   fpscr_vx_bit = 2,
    116      1.1  christos   fpscr_vx = BIT32(2),
    117      1.1  christos   fpscr_ox_bit = 3,
    118      1.1  christos   fpscr_ox = BIT32(3),
    119      1.1  christos   fpscr_ux = BIT32(4),
    120      1.1  christos   fpscr_zx = BIT32(5),
    121      1.1  christos   fpscr_xx = BIT32(6),
    122      1.1  christos   fpscr_vxsnan = BIT32(7), /* SNAN */
    123      1.1  christos   fpscr_vxisi = BIT32(8), /* INF - INF */
    124      1.1  christos   fpscr_vxidi = BIT32(9), /* INF / INF */
    125      1.1  christos   fpscr_vxzdz = BIT32(10), /* 0 / 0 */
    126      1.1  christos   fpscr_vximz = BIT32(11), /* INF * 0 */
    127      1.1  christos   fpscr_vxvc = BIT32(12),
    128      1.1  christos   fpscr_fr = BIT32(13),
    129      1.1  christos   fpscr_fi = BIT32(14),
    130      1.1  christos   fpscr_fprf = MASK32(15, 19),
    131      1.1  christos   fpscr_c = BIT32(15),
    132      1.1  christos   fpscr_fpcc_bit = 16, /* well sort of */
    133      1.1  christos   fpscr_fpcc = MASK32(16, 19),
    134      1.1  christos   fpscr_fl = BIT32(16),
    135      1.1  christos   fpscr_fg = BIT32(17),
    136      1.1  christos   fpscr_fe = BIT32(18),
    137      1.1  christos   fpscr_fu = BIT32(19),
    138      1.1  christos   fpscr_rf_quiet_nan = fpscr_c | fpscr_fu,
    139      1.1  christos   fpscr_rf_neg_infinity = fpscr_fl | fpscr_fu,
    140      1.1  christos   fpscr_rf_neg_normal_number = fpscr_fl,
    141      1.1  christos   fpscr_rf_neg_denormalized_number = fpscr_c | fpscr_fl,
    142      1.1  christos   fpscr_rf_neg_zero = fpscr_c | fpscr_fe,
    143      1.1  christos   fpscr_rf_pos_zero = fpscr_fe,
    144      1.1  christos   fpscr_rf_pos_denormalized_number = fpscr_c | fpscr_fg,
    145      1.1  christos   fpscr_rf_pos_normal_number = fpscr_fg,
    146      1.1  christos   fpscr_rf_pos_infinity = fpscr_fg | fpscr_fu,
    147      1.1  christos   fpscr_reserved_20 = BIT32(20),
    148      1.1  christos   fpscr_vxsoft = BIT32(21),
    149      1.1  christos   fpscr_vxsqrt = BIT32(22),
    150      1.1  christos   fpscr_vxcvi = BIT32(23),
    151      1.1  christos   fpscr_ve = BIT32(24),
    152      1.1  christos   fpscr_oe = BIT32(25),
    153      1.1  christos   fpscr_ue = BIT32(26),
    154      1.1  christos   fpscr_ze = BIT32(27),
    155      1.1  christos   fpscr_xe = BIT32(28),
    156      1.1  christos   fpscr_ni = BIT32(29),
    157      1.1  christos   fpscr_rn = MASK32(30, 31),
    158      1.1  christos   fpscr_rn_round_to_nearest = 0,
    159      1.1  christos   fpscr_rn_round_towards_zero = MASK32(31,31),
    160      1.1  christos   fpscr_rn_round_towards_pos_infinity = MASK32(30,30),
    161      1.1  christos   fpscr_rn_round_towards_neg_infinity = MASK32(30,31),
    162      1.1  christos   fpscr_vx_bits = (fpscr_vxsnan | fpscr_vxisi | fpscr_vxidi
    163      1.1  christos 		   | fpscr_vxzdz | fpscr_vximz | fpscr_vxvc
    164      1.1  christos 		   | fpscr_vxsoft | fpscr_vxsqrt | fpscr_vxcvi),
    165      1.1  christos };
    166      1.1  christos 
    167      1.1  christos 
    168      1.1  christos 
    169      1.1  christos /**
    170      1.1  christos  ** XER Register
    171      1.1  christos  **/
    172      1.1  christos 
    173  1.1.1.3  christos typedef uint32_t xereg;
    174      1.1  christos 
    175      1.1  christos enum {
    176      1.1  christos   xer_summary_overflow = BIT32(0), xer_summary_overflow_bit = 0,
    177      1.1  christos   xer_carry = BIT32(2), xer_carry_bit = 2,
    178      1.1  christos   xer_overflow = BIT32(1),
    179      1.1  christos   xer_reserved_3_24 = MASK32(3,24),
    180      1.1  christos   xer_byte_count_mask = MASK32(25,31)
    181      1.1  christos };
    182      1.1  christos 
    183      1.1  christos 
    184      1.1  christos /**
    185      1.1  christos  ** SPR's
    186      1.1  christos  **/
    187      1.1  christos 
    188      1.1  christos #include "spreg.h"
    189      1.1  christos 
    190      1.1  christos 
    191      1.1  christos /**
    192      1.1  christos  ** Segment Registers
    193      1.1  christos  **/
    194      1.1  christos 
    195  1.1.1.3  christos typedef uint32_t sreg;
    196      1.1  christos enum {
    197      1.1  christos   nr_of_srs = 16
    198      1.1  christos };
    199      1.1  christos 
    200      1.1  christos 
    201      1.1  christos /**
    202      1.1  christos  ** Machine state register
    203      1.1  christos  **/
    204      1.1  christos typedef unsigned_word msreg; /* 32 or 64 bits */
    205      1.1  christos 
    206      1.1  christos enum {
    207      1.1  christos #if (WITH_TARGET_WORD_BITSIZE == 64)
    208      1.1  christos   msr_64bit_mode = BIT(0),
    209      1.1  christos #endif
    210      1.1  christos #if (WITH_TARGET_WORD_BITSIZE == 32)
    211      1.1  christos   msr_64bit_mode = 0,
    212      1.1  christos #endif
    213      1.1  christos   msr_power_management_enable = BIT(45),
    214      1.1  christos   msr_tempoary_gpr_remapping = BIT(46), /* 603 specific */
    215      1.1  christos   msr_interrupt_little_endian_mode = BIT(47),
    216      1.1  christos   msr_external_interrupt_enable = BIT(48),
    217      1.1  christos   msr_problem_state = BIT(49),
    218      1.1  christos   msr_floating_point_available = BIT(50),
    219      1.1  christos   msr_machine_check_enable = BIT(51),
    220      1.1  christos   msr_floating_point_exception_mode_0 = BIT(52),
    221      1.1  christos   msr_single_step_trace_enable = BIT(53),
    222      1.1  christos   msr_branch_trace_enable = BIT(54),
    223      1.1  christos   msr_floating_point_exception_mode_1 = BIT(55),
    224      1.1  christos   msr_interrupt_prefix = BIT(57),
    225      1.1  christos   msr_instruction_relocate = BIT(58),
    226      1.1  christos   msr_data_relocate = BIT(59),
    227      1.1  christos   msr_recoverable_interrupt = BIT(62),
    228      1.1  christos   msr_little_endian_mode = BIT(63)
    229      1.1  christos };
    230      1.1  christos 
    231      1.1  christos enum {
    232      1.1  christos   srr1_hash_table_or_ibat_miss = BIT(33),
    233      1.1  christos   srr1_direct_store_error_exception = BIT(35),
    234      1.1  christos   srr1_protection_violation = BIT(36),
    235      1.1  christos   srr1_segment_table_miss = BIT(42),
    236      1.1  christos   srr1_floating_point_enabled = BIT(43),
    237      1.1  christos   srr1_illegal_instruction = BIT(44),
    238      1.1  christos   srr1_priviliged_instruction = BIT(45),
    239      1.1  christos   srr1_trap = BIT(46),
    240      1.1  christos   srr1_subsequent_instruction = BIT(47)
    241      1.1  christos };
    242      1.1  christos 
    243      1.1  christos /**
    244      1.1  christos  ** storage interrupt registers
    245      1.1  christos  **/
    246      1.1  christos 
    247      1.1  christos typedef enum {
    248      1.1  christos   dsisr_direct_store_error_exception = BIT32(0),
    249      1.1  christos   dsisr_hash_table_or_dbat_miss = BIT32(1),
    250      1.1  christos   dsisr_protection_violation = BIT32(4),
    251      1.1  christos   dsisr_earwax_violation = BIT32(5),
    252      1.1  christos   dsisr_store_operation = BIT32(6),
    253      1.1  christos   dsisr_segment_table_miss = BIT32(10),
    254      1.1  christos   dsisr_earwax_disabled = BIT32(11)
    255      1.1  christos } dsisr_status;
    256      1.1  christos 
    257      1.1  christos 
    258      1.1  christos 
    259      1.1  christos /**
    260      1.1  christos  ** And the registers proper
    261      1.1  christos  **/
    262      1.1  christos typedef struct _registers {
    263      1.1  christos 
    264      1.1  christos   gpreg gpr[32];
    265      1.1  christos   fpreg fpr[32];
    266      1.1  christos   creg cr;
    267      1.1  christos   fpscreg fpscr;
    268      1.1  christos 
    269      1.1  christos   /* Machine state register */
    270      1.1  christos   msreg msr;
    271      1.1  christos 
    272      1.1  christos   /* Spr's */
    273      1.1  christos   spreg spr[nr_of_sprs];
    274      1.1  christos 
    275      1.1  christos   /* Segment Registers */
    276      1.1  christos   sreg sr[nr_of_srs];
    277      1.1  christos 
    278      1.1  christos #if WITH_ALTIVEC
    279      1.1  christos   struct altivec_regs altivec;
    280      1.1  christos #endif
    281      1.1  christos #if WITH_E500
    282      1.1  christos   struct e500_regs e500;
    283      1.1  christos #endif
    284      1.1  christos 
    285      1.1  christos } registers;
    286      1.1  christos 
    287      1.1  christos /* dump out all the registers */
    288      1.1  christos 
    289      1.1  christos INLINE_REGISTERS\
    290      1.1  christos (void) registers_dump
    291      1.1  christos (registers *regs);
    292      1.1  christos 
    293      1.1  christos 
    294      1.1  christos /* return information on a register based on name */
    295      1.1  christos 
    296      1.1  christos typedef enum {
    297      1.1  christos   reg_invalid,
    298      1.1  christos   reg_gpr, reg_fpr, reg_spr, reg_msr,
    299      1.1  christos   reg_cr, reg_fpscr, reg_pc, reg_sr,
    300      1.1  christos   reg_insns, reg_stalls, reg_cycles,
    301      1.1  christos #ifdef WITH_ALTIVEC
    302      1.1  christos   reg_vr, reg_vscr,
    303      1.1  christos #endif
    304      1.1  christos #ifdef WITH_E500
    305      1.1  christos   reg_acc, reg_gprh, reg_evr,
    306      1.1  christos #endif
    307      1.1  christos   nr_register_types
    308      1.1  christos } register_types;
    309      1.1  christos 
    310      1.1  christos typedef struct {
    311      1.1  christos   register_types type;
    312      1.1  christos   int index;
    313      1.1  christos   int size;
    314      1.1  christos } register_descriptions;
    315      1.1  christos 
    316      1.1  christos INLINE_REGISTERS\
    317      1.1  christos (register_descriptions) register_description
    318      1.1  christos (const char reg[]);
    319      1.1  christos 
    320      1.1  christos 
    321      1.1  christos /* Special purpose registers by their more common names */
    322      1.1  christos 
    323      1.1  christos #define SPREG(N)	cpu_registers(processor)->spr[N]
    324      1.1  christos #define XER             SPREG(spr_xer)
    325      1.1  christos #define LR              SPREG(spr_lr)
    326      1.1  christos #define CTR             SPREG(spr_ctr)
    327      1.1  christos #define SRR0		SPREG(spr_srr0)
    328      1.1  christos #define SRR1		SPREG(spr_srr1)
    329      1.1  christos #define DAR		SPREG(spr_dar)
    330      1.1  christos #define DSISR		SPREG(spr_dsisr)
    331      1.1  christos 
    332      1.1  christos /* general purpose registers - indexed access */
    333      1.1  christos #define GPR(N)          cpu_registers(processor)->gpr[N]
    334      1.1  christos 
    335      1.1  christos /* segment registers */
    336      1.1  christos #define SEGREG(N)       cpu_registers(processor)->sr[N]
    337      1.1  christos 
    338      1.1  christos /* condition register */
    339      1.1  christos #define CR              cpu_registers(processor)->cr
    340      1.1  christos 
    341      1.1  christos /* machine status register */
    342      1.1  christos #define MSR        	cpu_registers(processor)->msr
    343      1.1  christos 
    344      1.1  christos /* floating-point status condition register */
    345      1.1  christos #define FPSCR		cpu_registers(processor)->fpscr
    346      1.1  christos 
    347      1.1  christos #endif /* _REGISTERS_H_ */
    348