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

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

revision 4 by dpavlin, Mon Oct 8 16:18:00 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.h,v 1.22 2005/04/15 21:56:25 debug Exp $   *  $Id: cpu.h,v 1.51 2005/10/27 14:01:15 debug Exp $
32   *   *
33   *  See cpu.c.   *  See cpu.c.
34   */   */
# Line 42  Line 42 
42  #include "../../config.h"  #include "../../config.h"
43    
44  #include "cpu_alpha.h"  #include "cpu_alpha.h"
45    #include "cpu_arm.h"
46    #include "cpu_avr.h"
47  #include "cpu_hppa.h"  #include "cpu_hppa.h"
48    #include "cpu_i960.h"
49    #include "cpu_ia64.h"
50    #include "cpu_m68k.h"
51  #include "cpu_mips.h"  #include "cpu_mips.h"
52  #include "cpu_ppc.h"  #include "cpu_ppc.h"
53    #include "cpu_sh.h"
54  #include "cpu_sparc.h"  #include "cpu_sparc.h"
 #include "cpu_urisc.h"  
55  #include "cpu_x86.h"  #include "cpu_x86.h"
56    
57  struct cpu;  struct cpu;
# Line 61  struct cpu_family { Line 66  struct cpu_family {
66    
67          /*  These are filled in by each CPU family's init function:  */          /*  These are filled in by each CPU family's init function:  */
68          char                    *name;          char                    *name;
69          struct cpu              *(*cpu_new)(struct memory *mem,          int                     (*cpu_new)(struct cpu *cpu, struct memory *mem,
70                                      struct machine *machine,                                      struct machine *machine,
71                                      int cpu_id, char *cpu_type_name);                                      int cpu_id, char *cpu_type_name);
72          void                    (*list_available_types)(void);          void                    (*list_available_types)(void);
# Line 82  struct cpu_family { Line 87  struct cpu_family {
87          int                     (*interrupt)(struct cpu *cpu, uint64_t irq_nr);          int                     (*interrupt)(struct cpu *cpu, uint64_t irq_nr);
88          int                     (*interrupt_ack)(struct cpu *cpu,          int                     (*interrupt_ack)(struct cpu *cpu,
89                                      uint64_t irq_nr);                                      uint64_t irq_nr);
90            void                    (*functioncall_trace)(struct cpu *,
91                                        uint64_t f, int n_args);
92  };  };
93    
94    #ifdef TRACE_NULL_CRASHES
95    #define TRACE_NULL_N_ENTRIES            16
96    #endif
97    
98    
99    /*
100     *  Dynamic translation definitions:
101     *
102     *  The translation cache begins with N_BASE_TABLE_ENTRIES uint32_t offsets
103     *  into the cache, for possible translation cache structs for physical pages.
104     */
105    
106    /*  Physpage flags:  */
107    #define TRANSLATIONS                    1
108    #define COMBINATIONS                    2
109    
110    #define DYNTRANS_CACHE_SIZE             (20*1048576)
111    #define DYNTRANS_CACHE_MARGIN           300000
112    
113    #define N_BASE_TABLE_ENTRIES            32768
114    #define PAGENR_TO_TABLE_INDEX(a)        ((a) & (N_BASE_TABLE_ENTRIES-1))
115    
116    
117    /*
118     *  The generic CPU struct:
119     */
120    
121  struct cpu {  struct cpu {
122          /*  Pointer back to the machine this CPU is in:  */          /*  Pointer back to the machine this CPU is in:  */
# Line 94  struct cpu { Line 127  struct cpu {
127          int             dead;          int             dead;
128          int             bootstrap_cpu_flag;          int             bootstrap_cpu_flag;
129          int             cpu_id;          int             cpu_id;
130            int             is_32bit;       /*  0 for 64-bit, 1 for 32-bit  */
131          char            *name;          char            *name;
132    
133          struct memory   *mem;          struct memory   *mem;
# Line 103  struct cpu { Line 137  struct cpu {
137                              int writeflag, int cache_flags);                              int writeflag, int cache_flags);
138          int             (*translate_address)(struct cpu *, uint64_t vaddr,          int             (*translate_address)(struct cpu *, uint64_t vaddr,
139                              uint64_t *return_addr, int flags);                              uint64_t *return_addr, int flags);
140          void            (*useremul_syscall)(struct cpu *cpu,          void            (*update_translation_table)(struct cpu *,
141                              uint32_t code);                              uint64_t vaddr_page, unsigned char *host_page,
142                                int writeflag, uint64_t paddr_page);
143            void            (*invalidate_translation_caches)(struct cpu *,
144                                uint64_t paddr, int flags);
145            void            (*invalidate_code_translation)(struct cpu *,
146                                uint64_t paddr, int flags);
147            void            (*useremul_syscall)(struct cpu *cpu, uint32_t code);
148    
         /*  Things that all CPU families have:  */  
149          uint64_t        pc;          uint64_t        pc;
150    
151          /*  CPU-family dependant:  */  #ifdef TRACE_NULL_CRASHES
152            /*  TODO: remove this, it's MIPS only  */
153            int             trace_null_index;
154            uint64_t        trace_null_addr[TRACE_NULL_N_ENTRIES];
155    #endif  
156    
157            int             trace_tree_depth;
158    
159            /*
160             *  Dynamic translation:
161             */
162            int             running_translated;
163            int             n_translated_instrs;
164            unsigned char   *translation_cache;
165            size_t          translation_cache_cur_ofs;
166            void            (*combination_check)(struct cpu *,
167                                void * /* instr call ptr */, int low_addr);
168    
169            /*
170             *  CPU-family dependent:
171             */
172          union {          union {
173                  struct alpha_cpu   alpha;                  struct alpha_cpu   alpha;
174                    struct arm_cpu     arm;
175                    struct avr_cpu     avr;
176                  struct hppa_cpu    hppa;                  struct hppa_cpu    hppa;
177                    struct i960_cpu    i960;
178                    struct ia64_cpu    ia64;
179                    struct m68k_cpu    m68k;
180                  struct mips_cpu    mips;                  struct mips_cpu    mips;
181                  struct ppc_cpu     ppc;                  struct ppc_cpu     ppc;
182                    struct sh_cpu      sh;
183                  struct sparc_cpu   sparc;                  struct sparc_cpu   sparc;
                 struct urisc_cpu   urisc;  
184                  struct x86_cpu     x86;                  struct x86_cpu     x86;
185          } cd;          } cd;
186  };  };
# Line 135  int cpu_disassemble_instr(struct machine Line 199  int cpu_disassemble_instr(struct machine
199          unsigned char *instr, int running, uint64_t addr, int bintrans);          unsigned char *instr, int running, uint64_t addr, int bintrans);
200  int cpu_interrupt(struct cpu *cpu, uint64_t irq_nr);  int cpu_interrupt(struct cpu *cpu, uint64_t irq_nr);
201  int cpu_interrupt_ack(struct cpu *cpu, uint64_t irq_nr);  int cpu_interrupt_ack(struct cpu *cpu, uint64_t irq_nr);
202  void cpu_run_init(struct emul *emul, struct machine *machine);  void cpu_functioncall_trace(struct cpu *cpu, uint64_t f);
203    void cpu_functioncall_trace_return(struct cpu *cpu);
204    void cpu_create_or_reset_tc(struct cpu *cpu);
205    void cpu_run_init(struct machine *machine);
206  int cpu_run(struct emul *emul, struct machine *machine);  int cpu_run(struct emul *emul, struct machine *machine);
207  void cpu_run_deinit(struct emul *emul, struct machine *machine);  void cpu_run_deinit(struct machine *machine);
208  void cpu_dumpinfo(struct machine *m, struct cpu *cpu);  void cpu_dumpinfo(struct machine *m, struct cpu *cpu);
209  void cpu_list_available_types(void);  void cpu_list_available_types(void);
210  void cpu_show_cycles(struct machine *machine,  void cpu_show_cycles(struct machine *machine, int forced);
         struct timeval *starttime, int64_t ncycles, int forced);  
211  struct cpu_family *cpu_family_ptr_by_number(int arch);  struct cpu_family *cpu_family_ptr_by_number(int arch);
212  void cpu_init(void);  void cpu_init(void);
213    
214    
215    #define JUST_MARK_AS_NON_WRITABLE       1
216    #define INVALIDATE_ALL                  2
217    #define INVALIDATE_PADDR                4
218    #define INVALIDATE_VADDR                8
219    
220    #define TLB_CODE                        0x02
221    
222    
223    #define CPU_FAMILY_INIT(n,s)    int n ## _cpu_family_init(              \
224            struct cpu_family *fp) {                                        \
225            /*  Fill in the cpu_family struct with valid data for this arch.  */ \
226            fp->name = s;                                                   \
227            fp->cpu_new = n ## _cpu_new;                                    \
228            fp->list_available_types = n ## _cpu_list_available_types;      \
229            fp->register_match = n ## _cpu_register_match;                  \
230            fp->disassemble_instr = n ## _cpu_disassemble_instr;            \
231            fp->register_dump = n ## _cpu_register_dump;                    \
232            fp->run = n ## _cpu_run;                                        \
233            fp->dumpinfo = n ## _cpu_dumpinfo;                              \
234            fp->show_full_statistics = n ## _cpu_show_full_statistics;      \
235            fp->tlbdump = n ## _cpu_tlbdump;                                \
236            fp->interrupt = n ## _cpu_interrupt;                            \
237            fp->interrupt_ack = n ## _cpu_interrupt_ack;                    \
238            fp->functioncall_trace = n ## _cpu_functioncall_trace;          \
239            return 1;                                                       \
240            }
241    
242    
243  #endif  /*  CPU_H  */  #endif  /*  CPU_H  */

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

  ViewVC Help
Powered by ViewVC 1.1.26