/[gxemul]/trunk/src/include/cpu_sh.h
This is repository of my old source code which isn't updated any more. Go to git.rot13.org for current projects!
ViewVC logotype

Diff of /trunk/src/include/cpu_sh.h

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 30 by dpavlin, Mon Oct 8 16:20:40 2007 UTC revision 34 by dpavlin, Mon Oct 8 16:21:17 2007 UTC
# Line 2  Line 2 
2  #define CPU_SH_H  #define CPU_SH_H
3    
4  /*  /*
5   *  Copyright (C) 2005-2006  Anders Gavare.  All rights reserved.   *  Copyright (C) 2005-2007  Anders Gavare.  All rights reserved.
6   *   *
7   *  Redistribution and use in source and binary forms, with or without   *  Redistribution and use in source and binary forms, with or without
8   *  modification, are permitted provided that the following conditions are met:   *  modification, are permitted provided that the following conditions are met:
# Line 28  Line 28 
28   *  SUCH DAMAGE.   *  SUCH DAMAGE.
29   *   *
30   *   *
31   *  $Id: cpu_sh.h,v 1.21 2006/07/25 21:49:14 debug Exp $   *  $Id: cpu_sh.h,v 1.37 2006/12/30 13:31:00 debug Exp $
32     *
33     *  Note: Many things here are SH4-specific, so it probably doesn't work
34     *        for SH3 emulation.
35   */   */
36    
37    #include "interrupt.h"
38  #include "misc.h"  #include "misc.h"
39    #include "sh4_cpu.h"
40    
41    
42  struct cpu_family;  struct cpu_family;
# Line 40  struct cpu_family; Line 45  struct cpu_family;
45  struct sh_cpu_type_def {  struct sh_cpu_type_def {
46          char            *name;          char            *name;
47          int             bits;          int             bits;
48            int             arch;
49            uint32_t        pvr;
50            uint32_t        prr;
51  };  };
52    
53  #define SH_CPU_TYPE_DEFS        {       \  #define SH_CPU_TYPE_DEFS                {           \
54          { "SH3", 32 },                  \          { "SH7750", 32, 4, SH4_PVR_SH7750, 0     }, \
55          { "SH4", 32 },                  \          { "SH5",    64, 5, 0,              0     }, \
56          { "SH5", 64 },                  \          { NULL,      0, 0, 0,              0     }  }
         { NULL, 0 } }  
57    
58    
59  /*  /*
# Line 63  struct sh_cpu_type_def { Line 70  struct sh_cpu_type_def {
70  #define SH_ADDR_TO_PAGENR(a)            ((a) >> (SH_IC_ENTRIES_SHIFT \  #define SH_ADDR_TO_PAGENR(a)            ((a) >> (SH_IC_ENTRIES_SHIFT \
71                                          + SH_INSTR_ALIGNMENT_SHIFT))                                          + SH_INSTR_ALIGNMENT_SHIFT))
72    
73  #define SH_L2N          17  DYNTRANS_MISC_DECLARATIONS(sh,SH,uint32_t)
 #define SH_L3N          18  
   
 DYNTRANS_MISC_DECLARATIONS(sh,SH,uint64_t)  
 DYNTRANS_MISC64_DECLARATIONS(sh,SH,uint8_t)  
74    
75  #define SH_MAX_VPH_TLB_ENTRIES          128  #define SH_MAX_VPH_TLB_ENTRIES          128
76    
77    
78  #define SH_N_GPRS               64  #define SH_N_GPRS               16
79    #define SH_N_GPRS_BANKED        8
80    #define SH_N_FPRS               16
81    
82    #define SH_N_ITLB_ENTRIES       4
83    #define SH_N_UTLB_ENTRIES       64
84    
85    #define SH_INVALID_INSTR        0x00fb
86    
87    
88  struct sh_cpu {  struct sh_cpu {
# Line 81  struct sh_cpu { Line 91  struct sh_cpu {
91          /*  compact = 1 if currently executing 16-bit long opcodes  */          /*  compact = 1 if currently executing 16-bit long opcodes  */
92          int             compact;          int             compact;
93    
94          uint32_t        r_otherbank[8];          /*  General Purpose Registers:  */
95            uint32_t        r[SH_N_GPRS];
96          uint64_t        r[SH_N_GPRS];          uint32_t        r_bank[SH_N_GPRS_BANKED];
97    
98            /*  Floating-Point Registers:  */
99            uint32_t        fr[SH_N_FPRS];
100            uint32_t        xf[SH_N_FPRS];  /*  "Other bank."  */
101    
102          uint32_t        mach;           /*  Multiply-Accumulate High  */          uint32_t        mach;           /*  Multiply-Accumulate High  */
103          uint32_t        macl;           /*  Multiply-Accumulate Low  */          uint32_t        macl;           /*  Multiply-Accumulate Low  */
# Line 98  struct sh_cpu { Line 112  struct sh_cpu {
112          uint32_t        sgr;            /*  Saved General Register  */          uint32_t        sgr;            /*  Saved General Register  */
113          uint32_t        dbr;            /*  Debug Base Register  */          uint32_t        dbr;            /*  Debug Base Register  */
114    
115            /*  Cache control:  */
116            uint32_t        ccr;            /*  Cache Control Register  */
117            uint32_t        qacr0;          /*  Queue Address Control Register 0  */
118            uint32_t        qacr1;          /*  Queue Address Control Register 1  */
119    
120            /*  MMU/TLB registers:  */
121            uint32_t        pteh;           /*  Page Table Entry High  */
122            uint32_t        ptel;           /*  Page Table Entry Low  */
123            uint32_t        ptea;           /*  Page Table Entry A  */
124            uint32_t        ttb;            /*  Translation Table Base  */
125            uint32_t        tea;            /*  TLB Exception Address Register  */
126            uint32_t        mmucr;          /*  MMU Control Register  */
127            uint32_t        itlb_hi[SH_N_ITLB_ENTRIES];
128            uint32_t        itlb_lo[SH_N_ITLB_ENTRIES];
129            uint32_t        utlb_hi[SH_N_UTLB_ENTRIES];
130            uint32_t        utlb_lo[SH_N_UTLB_ENTRIES];
131    
132            /*  Exception handling:  */
133            uint32_t        tra;            /*  TRAPA Exception Register  */
134            uint32_t        expevt;         /*  Exception Event Register  */
135            uint32_t        intevt;         /*  Interrupt Event Register  */
136    
137            /*  Interrupt controller:  */
138            uint16_t        intc_ipra;      /*  Interrupt Priority Registers  */
139            uint16_t        intc_iprb;
140            uint16_t        intc_iprc;
141            uint16_t        intc_iprd;
142            int16_t         int_to_assert;  /*  Calculated int to assert  */
143            int             int_level;      /*  Calculated int level  */
144            uint32_t        int_pending[0x1000 / 0x20 / (sizeof(uint32_t)*8)];
145    
146            /*  Timer/clock functionality:  */
147            int             pclock;
148    
149            /*  DMA Controller: (4 channels)  */
150            uint32_t        dmac_sar[4];
151            uint32_t        dmac_dar[4];
152            uint32_t        dmac_tcr[4];
153            uint32_t        dmac_chcr[4];
154    
155    
156          /*          /*
157           *  Instruction translation cache and Virtual->Physical->Host           *  Instruction translation cache and Virtual->Physical->Host
# Line 106  struct sh_cpu { Line 160  struct sh_cpu {
160          DYNTRANS_ITC(sh)          DYNTRANS_ITC(sh)
161          VPH_TLBS(sh,SH)          VPH_TLBS(sh,SH)
162          VPH32(sh,SH,uint64_t,uint8_t)          VPH32(sh,SH,uint64_t,uint8_t)
         VPH64(sh,SH,uint8_t)  
163  };  };
164    
165    
# Line 122  struct sh_cpu { Line 175  struct sh_cpu {
175  #define SH_SR_RB                0x20000000      /*  Register Bank 0/1  */  #define SH_SR_RB                0x20000000      /*  Register Bank 0/1  */
176  #define SH_SR_MD                0x40000000      /*  Privileged Mode  */  #define SH_SR_MD                0x40000000      /*  Privileged Mode  */
177    
178    /*  Floating-point status/control register bits:  */
179    #define SH_FPSCR_RM_MASK        0x00000003      /*  Rounding Mode  */
180    #define    SH_FPSCR_RM_NEAREST         0x0      /*  Round to nearest  */
181    #define    SH_FPSCR_RM_ZERO            0x1      /*  Round to zero  */
182    #define SH_FPSCR_INEXACT        0x00000004      /*  Inexact exception  */
183    #define SH_FPSCR_UNDERFLOW      0x00000008      /*  Underflow exception  */
184    #define SH_FPSCR_OVERFLOW       0x00000010      /*  Overflow exception  */
185    #define SH_FPSCR_DIV_BY_ZERO    0x00000020      /*  Div by zero exception  */
186    #define SH_FPSCR_INVALID        0x00000040      /*  Invalid exception  */
187    #define SH_FPSCR_EN_INEXACT     0x00000080      /*  Inexact enable  */
188    #define SH_FPSCR_EN_UNDERFLOW   0x00000100      /*  Underflow enable  */
189    #define SH_FPSCR_EN_OVERFLOW    0x00000200      /*  Overflow enable  */
190    #define SH_FPSCR_EN_DIV_BY_ZERO 0x00000400      /*  Div by zero enable  */
191    #define SH_FPSCR_EN_INVALID     0x00000800      /*  Invalid enable  */
192    #define SH_FPSCR_CAUSE_INEXACT  0x00001000      /*  Cause Inexact  */
193    #define SH_FPSCR_CAUSE_UNDERFLOW 0x00002000     /*  Cause Underflow  */
194    #define SH_FPSCR_CAUSE_OVERFLOW 0x00004000      /*  Cause Overflow  */
195    #define SH_FPSCR_CAUSE_DIVBY0   0x00008000      /*  Cause Div by 0  */
196    #define SH_FPSCR_CAUSE_INVALID  0x00010000      /*  Cause Invalid  */
197    #define SH_FPSCR_CAUSE_ERROR    0x00020000      /*  Cause Error  */
198    #define SH_FPSCR_DN_ZERO        0x00040000      /*  Denormalization Mode  */
199    #define SH_FPSCR_PR             0x00080000      /*  Double-Precision Mode  */
200    #define SH_FPSCR_SZ             0x00100000      /*  Double-Precision Size  */
201    #define SH_FPSCR_FR             0x00200000      /*  Register Bank Select  */
202    
203    
204  /*  cpu_sh.c:  */  /*  cpu_sh.c:  */
205    void sh_cpu_interrupt_assert(struct interrupt *interrupt);
206    void sh_cpu_interrupt_deassert(struct interrupt *interrupt);
207    int sh_cpu_instruction_has_delayslot(struct cpu *cpu, unsigned char *ib);
208  int sh_run_instr(struct cpu *cpu);  int sh_run_instr(struct cpu *cpu);
209  void sh_update_translation_table(struct cpu *cpu, uint64_t vaddr_page,  void sh_update_translation_table(struct cpu *cpu, uint64_t vaddr_page,
210          unsigned char *host_page, int writeflag, uint64_t paddr_page);          unsigned char *host_page, int writeflag, uint64_t paddr_page);
# Line 140  int sh_memory_rw(struct cpu *cpu, struct Line 221  int sh_memory_rw(struct cpu *cpu, struct
221  int sh_cpu_family_init(struct cpu_family *);  int sh_cpu_family_init(struct cpu_family *);
222    
223  void sh_update_sr(struct cpu *cpu, uint32_t new_sr);  void sh_update_sr(struct cpu *cpu, uint32_t new_sr);
224    void sh_exception(struct cpu *cpu, int expevt, int intevt, uint32_t vaddr);
225    
226  /*  memory_sh.c:  */  /*  memory_sh.c:  */
227  int sh_translate_v2p(struct cpu *cpu, uint64_t vaddr,  int sh_translate_v2p(struct cpu *cpu, uint64_t vaddr,

Legend:
Removed from v.30  
changed lines
  Added in v.34

  ViewVC Help
Powered by ViewVC 1.1.26