/[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 12 by dpavlin, Mon Oct 8 16:18:38 2007 UTC revision 18 by dpavlin, Mon Oct 8 16:19:11 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.53 2005/10/27 14:01:15 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 73  struct arm_instr_call { Line 85  struct arm_instr_call {
85    
86  /*  Translation cache struct for each physical page:  */  /*  Translation cache struct for each physical page:  */
87  struct arm_tc_physpage {  struct arm_tc_physpage {
88            struct arm_instr_call ics[ARM_IC_ENTRIES_PER_PAGE + 1];
89          uint32_t        next_ofs;       /*  or 0 for end of chain  */          uint32_t        next_ofs;       /*  or 0 for end of chain  */
90          uint32_t        physaddr;          uint32_t        physaddr;
91          int             flags;          int             flags;
         struct arm_instr_call ics[ARM_IC_ENTRIES_PER_PAGE + 1];  
92  };  };
93    
94    
# 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         128
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            /*  For caching the host address of the L1 translation table:  */
196            unsigned char           *translation_table;
197            uint32_t                last_ttb;
198    
199    
200            /*
201             *  Interrupts:
202             */
203            int                     irq_asserted;
204    
205    
206          /*          /*
207           *  Instruction translation cache:           *  Instruction translation cache:
# Line 162  struct arm_cpu { Line 228  struct arm_cpu {
228          unsigned char                   *host_store[ARM_N_VPH_ENTRIES];          unsigned char                   *host_store[ARM_N_VPH_ENTRIES];
229          uint32_t                        phys_addr[ARM_N_VPH_ENTRIES];          uint32_t                        phys_addr[ARM_N_VPH_ENTRIES];
230          struct arm_tc_physpage          *phys_page[ARM_N_VPH_ENTRIES];          struct arm_tc_physpage          *phys_page[ARM_N_VPH_ENTRIES];
231    
232            uint32_t                        phystranslation[ARM_N_VPH_ENTRIES/32];
233            int16_t                         vaddr_to_tlbindex[ARM_N_VPH_ENTRIES];
234    
235            /*  ARM specific: */
236            unsigned char                   is_userpage[ARM_N_VPH_ENTRIES/8];
237  };  };
238    
239    
240    /*  System Control Coprocessor, control bits:  */
241    #define ARM_CONTROL_MMU         0x0001
242    #define ARM_CONTROL_ALIGN       0x0002
243    #define ARM_CONTROL_CACHE       0x0004
244    #define ARM_CONTROL_WBUFFER     0x0008
245    #define ARM_CONTROL_PROG32      0x0010
246    #define ARM_CONTROL_DATA32      0x0020
247    #define ARM_CONTROL_BIG         0x0080
248    #define ARM_CONTROL_S           0x0100
249    #define ARM_CONTROL_R           0x0200
250    #define ARM_CONTROL_F           0x0400
251    #define ARM_CONTROL_Z           0x0800
252    #define ARM_CONTROL_ICACHE      0x1000
253    #define ARM_CONTROL_V           0x2000
254    #define ARM_CONTROL_RR          0x4000
255    #define ARM_CONTROL_L4          0x8000
256    
257  /*  cpu_arm.c:  */  /*  cpu_arm.c:  */
258    void arm_setup_initial_translation_table(struct cpu *cpu, uint32_t ttb_addr);
259    void arm_translation_table_set_l1(struct cpu *cpu, uint32_t vaddr,
260            uint32_t paddr);
261    void arm_translation_table_set_l1_b(struct cpu *cpu, uint32_t vaddr,
262            uint32_t paddr);
263    void arm_exception(struct cpu *, int);
264  void arm_update_translation_table(struct cpu *cpu, uint64_t vaddr_page,  void arm_update_translation_table(struct cpu *cpu, uint64_t vaddr_page,
265          unsigned char *host_page, int writeflag, uint64_t paddr_page);          unsigned char *host_page, int writeflag, uint64_t paddr_page);
266  void arm_invalidate_translation_caches_paddr(struct cpu *cpu, uint64_t paddr);  void arm_invalidate_translation_caches(struct cpu *cpu, uint64_t, int);
267  void arm_invalidate_code_translation_caches(struct cpu *cpu);  void arm_invalidate_code_translation(struct cpu *cpu, uint64_t, int);
268    void arm_load_register_bank(struct cpu *cpu);
269    void arm_save_register_bank(struct cpu *cpu);
270  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,
271          unsigned char *data, size_t len, int writeflag, int cache_flags);          unsigned char *data, size_t len, int writeflag, int cache_flags);
272  int arm_cpu_family_init(struct cpu_family *);  int arm_cpu_family_init(struct cpu_family *);
273    
274    /*  cpu_arm_coproc.c:  */
275    void arm_coproc_15(struct cpu *cpu, int opcode1, int opcode2, int l_bit,
276            int crn, int crm, int rd);
277    void arm_coproc_i80321(struct cpu *cpu, int opcode1, int opcode2, int l_bit,
278            int crn, int crm, int rd);
279    void arm_coproc_i80321_14(struct cpu *cpu, int opcode1, int opcode2, int l_bit,
280            int crn, int crm, int rd);
281    
282    /*  memory_arm.c:  */
283    int arm_translate_address(struct cpu *cpu, uint64_t vaddr,
284            uint64_t *return_addr, int flags);
285    int arm_translate_address_mmu(struct cpu *cpu, uint64_t vaddr,
286            uint64_t *return_addr, int flags);
287    
288  #endif  /*  CPU_ARM_H  */  #endif  /*  CPU_ARM_H  */

Legend:
Removed from v.12  
changed lines
  Added in v.18

  ViewVC Help
Powered by ViewVC 1.1.26