/[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 20 by dpavlin, Mon Oct 8 16:19:23 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.57 2005/11/16 21:15:19 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    
95    #define ARM_F_N         8       /*  Same as ARM_FLAG_*, but        */
96    #define ARM_F_Z         4       /*  for the 'flags' field instead  */
97    #define ARM_F_C         2       /*  of cpsr.                       */
98    #define ARM_F_V         1
99    
100  #define ARM_FLAG_N      0x80000000      /*  Negative flag  */  #define ARM_FLAG_N      0x80000000      /*  Negative flag  */
101  #define ARM_FLAG_Z      0x40000000      /*  Zero flag  */  #define ARM_FLAG_Z      0x40000000      /*  Zero flag  */
102  #define ARM_FLAG_C      0x20000000      /*  Carry flag  */  #define ARM_FLAG_C      0x20000000      /*  Carry flag  */
103  #define ARM_FLAG_V      0x10000000      /*  Overflow flag  */  #define ARM_FLAG_V      0x10000000      /*  Overflow flag  */
104    #define ARM_FLAG_Q      0x08000000      /*  DSP saturation overflow  */
105  #define ARM_FLAG_I      0x00000080      /*  Interrupt disable  */  #define ARM_FLAG_I      0x00000080      /*  Interrupt disable  */
106  #define ARM_FLAG_F      0x00000040      /*  Fast Interrupt disable  */  #define ARM_FLAG_F      0x00000040      /*  Fast Interrupt disable  */
107    #define ARM_FLAG_T      0x00000020      /*  Thumb mode  */
108    
109  #define ARM_FLAG_MODE   0x0000001f  #define ARM_FLAG_MODE   0x0000001f
110  #define ARM_MODE_USR26        0x00  #define ARM_MODE_USR26        0x00
# Line 98  struct arm_tc_physpage { Line 117  struct arm_tc_physpage {
117  #define ARM_MODE_SVC32        0x13  #define ARM_MODE_SVC32        0x13
118  #define ARM_MODE_ABT32        0x17  #define ARM_MODE_ABT32        0x17
119  #define ARM_MODE_UND32        0x1b  #define ARM_MODE_UND32        0x1b
120    #define ARM_MODE_SYS32        0x1f
121    
122    #define ARM_EXCEPTION_TO_MODE   {       \
123            ARM_MODE_SVC32, ARM_MODE_UND32, ARM_MODE_SVC32, ARM_MODE_ABT32, \
124            ARM_MODE_ABT32, 0,              ARM_MODE_IRQ32, ARM_MODE_FIQ32  }
125    
126    #define N_ARM_EXCEPTIONS        8
127    
128    #define ARM_EXCEPTION_RESET     0
129    #define ARM_EXCEPTION_UND       1
130    #define ARM_EXCEPTION_SWI       2
131    #define ARM_EXCEPTION_PREF_ABT  3
132    #define ARM_EXCEPTION_DATA_ABT  4
133    /*  5 was address exception in 26-bit ARM  */
134    #define ARM_EXCEPTION_IRQ       6
135    #define ARM_EXCEPTION_FIQ       7
136    
137    
138  #define ARM_N_VPH_ENTRIES       1048576  #define ARM_N_VPH_ENTRIES       1048576
139    
140  #define ARM_MAX_VPH_TLB_ENTRIES         256  #define ARM_MAX_VPH_TLB_ENTRIES         128
141  struct arm_vpg_tlb_entry {  struct arm_vpg_tlb_entry {
142          int             valid;          unsigned char   valid;
143          int             writeflag;          unsigned char   writeflag;
         int64_t         timestamp;  
         unsigned char   *host_page;  
144          uint32_t        vaddr_page;          uint32_t        vaddr_page;
145          uint32_t        paddr_page;          uint32_t        paddr_page;
146            unsigned char   *host_page;
147  };  };
148    
149    
# Line 117  struct arm_cpu { Line 151  struct arm_cpu {
151          /*          /*
152           *  Misc.:           *  Misc.:
153           */           */
154          uint32_t                flags;          struct arm_cpu_type_def cpu_type;
155            uint32_t                of_emul_addr;
156    
157            void                    (*coproc[16])(struct cpu *, int opcode1,
158                                        int opcode2, int l_bit, int crn, int crm,
159                                        int rd);
160    
161          /*          /*
162           *  General Purpose Registers (including the program counter):           *  General Purpose Registers (including the program counter):
# Line 129  struct arm_cpu { Line 167  struct arm_cpu {
167           */           */
168    
169          uint32_t                r[N_ARM_REGS];          uint32_t                r[N_ARM_REGS];
170          uint32_t                usr_r8_r14[7];  
171            uint32_t                default_r8_r14[7];      /*  usr and sys  */
172          uint32_t                fiq_r8_r14[7];          uint32_t                fiq_r8_r14[7];
173          uint32_t                irq_r13_r14[2];          uint32_t                irq_r13_r14[2];
174          uint32_t                svc_r13_r14[2];          uint32_t                svc_r13_r14[2];
175          uint32_t                abt_r13_r14[2];          uint32_t                abt_r13_r14[2];
176          uint32_t                und_r13_r14[2];          uint32_t                und_r13_r14[2];
177    
178            uint32_t                tmp_pc;         /*  Used for load/stores  */
179    
180            /*
181             *  Flag/status registers:
182             *
183             *  NOTE: 'flags' just contains the 4 flag bits. When cpsr is read,
184             *  the flags should be copied from 'flags', and when cpsr is written
185             *  to, 'flags' should be updated as well.
186             */
187            size_t                  flags;
188            uint32_t                cpsr;
189            uint32_t                spsr_svc;
190            uint32_t                spsr_abt;
191            uint32_t                spsr_und;
192            uint32_t                spsr_irq;
193            uint32_t                spsr_fiq;
194    
195    
196            /*
197             *  System Control Coprocessor registers:
198             */
199            uint32_t                control;
200            uint32_t                ttb;            /*  Translation Table Base  */
201            uint32_t                dacr;           /*  Domain Access Control  */
202            uint32_t                fsr;            /*  Fault Status Register  */
203            uint32_t                far;            /*  Fault Address Register  */
204            uint32_t                pid;            /*  Process Id Register  */
205    
206            /*  For caching the host address of the L1 translation table:  */
207            unsigned char           *translation_table;
208            uint32_t                last_ttb;
209    
210    
211            /*
212             *  Interrupts:
213             */
214            int                     irq_asserted;
215    
216    
217          /*          /*
218           *  Instruction translation cache:           *  Instruction translation cache:
# Line 148  struct arm_cpu { Line 225  struct arm_cpu {
225          struct arm_instr_call   *cur_ic_page;          struct arm_instr_call   *cur_ic_page;
226          struct arm_instr_call   *next_ic;          struct arm_instr_call   *next_ic;
227    
228            void                    (*combination_check)(struct cpu *,
229                                        struct arm_instr_call *, int low_addr);
230    
231          /*          /*
232           *  Virtual -> physical -> host address translation:           *  Virtual -> physical -> host address translation:
# Line 162  struct arm_cpu { Line 241  struct arm_cpu {
241          unsigned char                   *host_store[ARM_N_VPH_ENTRIES];          unsigned char                   *host_store[ARM_N_VPH_ENTRIES];
242          uint32_t                        phys_addr[ARM_N_VPH_ENTRIES];          uint32_t                        phys_addr[ARM_N_VPH_ENTRIES];
243          struct arm_tc_physpage          *phys_page[ARM_N_VPH_ENTRIES];          struct arm_tc_physpage          *phys_page[ARM_N_VPH_ENTRIES];
244    
245            uint32_t                        phystranslation[ARM_N_VPH_ENTRIES/32];
246            uint8_t                         vaddr_to_tlbindex[ARM_N_VPH_ENTRIES];
247    
248            /*  ARM specific: */
249            uint32_t                        is_userpage[ARM_N_VPH_ENTRIES/32];
250  };  };
251    
252    
253    /*  System Control Coprocessor, control bits:  */
254    #define ARM_CONTROL_MMU         0x0001
255    #define ARM_CONTROL_ALIGN       0x0002
256    #define ARM_CONTROL_CACHE       0x0004
257    #define ARM_CONTROL_WBUFFER     0x0008
258    #define ARM_CONTROL_PROG32      0x0010
259    #define ARM_CONTROL_DATA32      0x0020
260    #define ARM_CONTROL_BIG         0x0080
261    #define ARM_CONTROL_S           0x0100
262    #define ARM_CONTROL_R           0x0200
263    #define ARM_CONTROL_F           0x0400
264    #define ARM_CONTROL_Z           0x0800
265    #define ARM_CONTROL_ICACHE      0x1000
266    #define ARM_CONTROL_V           0x2000
267    #define ARM_CONTROL_RR          0x4000
268    #define ARM_CONTROL_L4          0x8000
269    
270  /*  cpu_arm.c:  */  /*  cpu_arm.c:  */
271    void arm_setup_initial_translation_table(struct cpu *cpu, uint32_t ttb_addr);
272    void arm_translation_table_set_l1(struct cpu *cpu, uint32_t vaddr,
273            uint32_t paddr);
274    void arm_translation_table_set_l1_b(struct cpu *cpu, uint32_t vaddr,
275            uint32_t paddr);
276    void arm_exception(struct cpu *, int);
277  void arm_update_translation_table(struct cpu *cpu, uint64_t vaddr_page,  void arm_update_translation_table(struct cpu *cpu, uint64_t vaddr_page,
278          unsigned char *host_page, int writeflag, uint64_t paddr_page);          unsigned char *host_page, int writeflag, uint64_t paddr_page);
279  void arm_invalidate_translation_caches_paddr(struct cpu *cpu, uint64_t paddr);  void arm_invalidate_translation_caches(struct cpu *cpu, uint64_t, int);
280  void arm_invalidate_code_translation_caches(struct cpu *cpu);  void arm_invalidate_code_translation(struct cpu *cpu, uint64_t, int);
281    void arm_load_register_bank(struct cpu *cpu);
282    void arm_save_register_bank(struct cpu *cpu);
283  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,
284          unsigned char *data, size_t len, int writeflag, int cache_flags);          unsigned char *data, size_t len, int writeflag, int cache_flags);
285  int arm_cpu_family_init(struct cpu_family *);  int arm_cpu_family_init(struct cpu_family *);
286    
287    /*  cpu_arm_coproc.c:  */
288    void arm_coproc_15(struct cpu *cpu, int opcode1, int opcode2, int l_bit,
289            int crn, int crm, int rd);
290    void arm_coproc_i80321(struct cpu *cpu, int opcode1, int opcode2, int l_bit,
291            int crn, int crm, int rd);
292    void arm_coproc_i80321_14(struct cpu *cpu, int opcode1, int opcode2, int l_bit,
293            int crn, int crm, int rd);
294    
295    /*  memory_arm.c:  */
296    int arm_translate_address(struct cpu *cpu, uint64_t vaddr,
297            uint64_t *return_addr, int flags);
298    int arm_translate_address_mmu(struct cpu *cpu, uint64_t vaddr,
299            uint64_t *return_addr, int flags);
300    
301  #endif  /*  CPU_ARM_H  */  #endif  /*  CPU_ARM_H  */

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

  ViewVC Help
Powered by ViewVC 1.1.26