/[gxemul]/trunk/src/include/cpu_arm.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_arm.h

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

revision 13 by dpavlin, Mon Oct 8 16:18:38 2007 UTC revision 14 by dpavlin, Mon Oct 8 16:18:51 2007 UTC
# Line 28  Line 28 
28   *  SUCH DAMAGE.   *  SUCH DAMAGE.
29   *   *
30   *   *
31   *  $Id: cpu_arm.h,v 1.26 2005/08/14 23:44:23 debug Exp $   *  $Id: cpu_arm.h,v 1.43 2005/10/07 22:10:53 debug Exp $
32   */   */
33    
34  #include "misc.h"  #include "misc.h"
# Line 36  Line 36 
36    
37  struct cpu_family;  struct cpu_family;
38    
39    /*  ARM CPU types:  */
40    struct arm_cpu_type_def {
41            char            *name;
42            uint32_t        cpu_id;
43            int             flags;
44            int             icache_shift;
45            int             iway;
46            int             dcache_shift;
47            int             dway;
48    };
49    
50    
51  #define ARM_SL                  10  #define ARM_SL                  10
52  #define ARM_FP                  11  #define ARM_FP                  11
53  #define ARM_IP                  12  #define ARM_IP                  12
# Line 84  struct arm_tc_physpage { Line 96  struct arm_tc_physpage {
96  #define ARM_FLAG_Z      0x40000000      /*  Zero flag  */  #define ARM_FLAG_Z      0x40000000      /*  Zero flag  */
97  #define ARM_FLAG_C      0x20000000      /*  Carry flag  */  #define ARM_FLAG_C      0x20000000      /*  Carry flag  */
98  #define ARM_FLAG_V      0x10000000      /*  Overflow flag  */  #define ARM_FLAG_V      0x10000000      /*  Overflow flag  */
99    #define ARM_FLAG_Q      0x08000000      /*  DSP saturation overflow  */
100  #define ARM_FLAG_I      0x00000080      /*  Interrupt disable  */  #define ARM_FLAG_I      0x00000080      /*  Interrupt disable  */
101  #define ARM_FLAG_F      0x00000040      /*  Fast Interrupt disable  */  #define ARM_FLAG_F      0x00000040      /*  Fast Interrupt disable  */
102    #define ARM_FLAG_T      0x00000020      /*  Thumb mode  */
103    
104  #define ARM_FLAG_MODE   0x0000001f  #define ARM_FLAG_MODE   0x0000001f
105  #define ARM_MODE_USR26        0x00  #define ARM_MODE_USR26        0x00
# Line 98  struct arm_tc_physpage { Line 112  struct arm_tc_physpage {
112  #define ARM_MODE_SVC32        0x13  #define ARM_MODE_SVC32        0x13
113  #define ARM_MODE_ABT32        0x17  #define ARM_MODE_ABT32        0x17
114  #define ARM_MODE_UND32        0x1b  #define ARM_MODE_UND32        0x1b
115    #define ARM_MODE_SYS32        0x1f
116    
117    #define ARM_EXCEPTION_TO_MODE   {       \
118            ARM_MODE_SVC32, ARM_MODE_UND32, ARM_MODE_SVC32, ARM_MODE_ABT32, \
119            ARM_MODE_ABT32, 0,              ARM_MODE_IRQ32, ARM_MODE_FIQ32  }
120    
121    #define N_ARM_EXCEPTIONS        8
122    
123    #define ARM_EXCEPTION_RESET     0
124    #define ARM_EXCEPTION_UND       1
125    #define ARM_EXCEPTION_SWI       2
126    #define ARM_EXCEPTION_PREF_ABT  3
127    #define ARM_EXCEPTION_DATA_ABT  4
128    /*  5 was address exception in 26-bit ARM  */
129    #define ARM_EXCEPTION_IRQ       6
130    #define ARM_EXCEPTION_FIQ       7
131    
132    
133  #define ARM_N_VPH_ENTRIES       1048576  #define ARM_N_VPH_ENTRIES       1048576
134    
135  #define ARM_MAX_VPH_TLB_ENTRIES         256  #define ARM_MAX_VPH_TLB_ENTRIES         64
136  struct arm_vpg_tlb_entry {  struct arm_vpg_tlb_entry {
137          int             valid;          int             valid;
138          int             writeflag;          int             writeflag;
# Line 117  struct arm_cpu { Line 147  struct arm_cpu {
147          /*          /*
148           *  Misc.:           *  Misc.:
149           */           */
150          uint32_t                flags;          struct arm_cpu_type_def cpu_type;
151            uint32_t                of_emul_addr;
152    
153            void                    (*coproc[16])(struct cpu *, int opcode1,
154                                        int opcode2, int l_bit, int crn, int crm,
155                                        int rd);
156    
157          /*          /*
158           *  General Purpose Registers (including the program counter):           *  General Purpose Registers (including the program counter):
# Line 129  struct arm_cpu { Line 163  struct arm_cpu {
163           */           */
164    
165          uint32_t                r[N_ARM_REGS];          uint32_t                r[N_ARM_REGS];
166          uint32_t                usr_r8_r14[7];  
167            uint32_t                default_r8_r14[7];      /*  usr and sys  */
168          uint32_t                fiq_r8_r14[7];          uint32_t                fiq_r8_r14[7];
169          uint32_t                irq_r13_r14[2];          uint32_t                irq_r13_r14[2];
170          uint32_t                svc_r13_r14[2];          uint32_t                svc_r13_r14[2];
171          uint32_t                abt_r13_r14[2];          uint32_t                abt_r13_r14[2];
172          uint32_t                und_r13_r14[2];          uint32_t                und_r13_r14[2];
173    
174            uint32_t                tmp_pc;         /*  Used for load/stores  */
175    
176            /*  Flag/status registers:  */
177            uint32_t                cpsr;
178            uint32_t                spsr_svc;
179            uint32_t                spsr_abt;
180            uint32_t                spsr_und;
181            uint32_t                spsr_irq;
182            uint32_t                spsr_fiq;
183    
184    
185            /*
186             *  System Control Coprocessor registers:
187             */
188            uint32_t                control;
189            uint32_t                ttb;            /*  Translation Table Base  */
190            uint32_t                dacr;           /*  Domain Access Control  */
191            uint32_t                fsr;            /*  Fault Status Register  */
192            uint32_t                far;            /*  Fault Address Register  */
193            uint32_t                pid;            /*  Process Id Register  */
194    
195    
196            /*
197             *  Interrupts:
198             */
199            int                     irq_asserted;
200    
201    
202          /*          /*
203           *  Instruction translation cache:           *  Instruction translation cache:
# Line 165  struct arm_cpu { Line 227  struct arm_cpu {
227  };  };
228    
229    
230    /*  System Control Coprocessor, control bits:  */
231    #define ARM_CONTROL_MMU         0x0001
232    #define ARM_CONTROL_ALIGN       0x0002
233    #define ARM_CONTROL_CACHE       0x0004
234    #define ARM_CONTROL_WBUFFER     0x0008
235    #define ARM_CONTROL_PROG32      0x0010
236    #define ARM_CONTROL_DATA32      0x0020
237    #define ARM_CONTROL_BIG         0x0080
238    #define ARM_CONTROL_S           0x0100
239    #define ARM_CONTROL_R           0x0200
240    #define ARM_CONTROL_F           0x0400
241    #define ARM_CONTROL_Z           0x0800
242    #define ARM_CONTROL_ICACHE      0x1000
243    #define ARM_CONTROL_V           0x2000
244    #define ARM_CONTROL_RR          0x4000
245    #define ARM_CONTROL_L4          0x8000
246    
247  /*  cpu_arm.c:  */  /*  cpu_arm.c:  */
248    void arm_exception(struct cpu *, int);
249  void arm_update_translation_table(struct cpu *cpu, uint64_t vaddr_page,  void arm_update_translation_table(struct cpu *cpu, uint64_t vaddr_page,
250          unsigned char *host_page, int writeflag, uint64_t paddr_page);          unsigned char *host_page, int writeflag, uint64_t paddr_page);
251  void arm_invalidate_translation_caches_paddr(struct cpu *cpu, uint64_t paddr);  void arm_invalidate_translation_caches_paddr(struct cpu *cpu, uint64_t, int);
252  void arm_invalidate_code_translation_caches(struct cpu *cpu);  void arm_invalidate_code_translation(struct cpu *cpu, uint64_t, int);
253    void arm_setup_initial_translation_table(struct cpu *cpu, uint32_t ttb_addr);
254    void arm_load_register_bank(struct cpu *cpu);
255    void arm_save_register_bank(struct cpu *cpu);
256  int arm_memory_rw(struct cpu *cpu, struct memory *mem, uint64_t vaddr,  int arm_memory_rw(struct cpu *cpu, struct memory *mem, uint64_t vaddr,
257          unsigned char *data, size_t len, int writeflag, int cache_flags);          unsigned char *data, size_t len, int writeflag, int cache_flags);
258  int arm_cpu_family_init(struct cpu_family *);  int arm_cpu_family_init(struct cpu_family *);
259    
260    /*  cpu_arm_coproc.c:  */
261    void arm_coproc_15(struct cpu *cpu, int opcode1, int opcode2, int l_bit,
262            int crn, int crm, int rd);
263    void arm_coproc_i80321(struct cpu *cpu, int opcode1, int opcode2, int l_bit,
264            int crn, int crm, int rd);
265    void arm_coproc_i80321_14(struct cpu *cpu, int opcode1, int opcode2, int l_bit,
266            int crn, int crm, int rd);
267    
268    /*  memory_arm.c:  */
269    int arm_translate_address(struct cpu *cpu, uint64_t vaddr,
270            uint64_t *return_addr, int flags);
271    
272  #endif  /*  CPU_ARM_H  */  #endif  /*  CPU_ARM_H  */

Legend:
Removed from v.13  
changed lines
  Added in v.14

  ViewVC Help
Powered by ViewVC 1.1.26