/[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 10 by dpavlin, Mon Oct 8 16:18:27 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.h,v 1.27 2005/06/27 10:43:17 debug Exp $   *  $Id: cpu.h,v 1.54 2005/11/16 21:15:19 debug Exp $
32   *   *
33   *  See cpu.c.   *  See cpu.c.
34   */   */
# Line 41  Line 41 
41  /*  This is needed for undefining 'mips' or 'ppc', on weird systems:  */  /*  This is needed for undefining 'mips' or 'ppc', on weird systems:  */
42  #include "../../config.h"  #include "../../config.h"
43    
44    #include "cpu_alpha.h"
45  #include "cpu_arm.h"  #include "cpu_arm.h"
46    #include "cpu_avr.h"
47    #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_newmips.h"
53  #include "cpu_ppc.h"  #include "cpu_ppc.h"
54  #include "cpu_urisc.h"  #include "cpu_sh.h"
55    #include "cpu_sparc.h"
56  #include "cpu_x86.h"  #include "cpu_x86.h"
57    
58  struct cpu;  struct cpu;
# Line 80  struct cpu_family { Line 88  struct cpu_family {
88          int                     (*interrupt)(struct cpu *cpu, uint64_t irq_nr);          int                     (*interrupt)(struct cpu *cpu, uint64_t irq_nr);
89          int                     (*interrupt_ack)(struct cpu *cpu,          int                     (*interrupt_ack)(struct cpu *cpu,
90                                      uint64_t irq_nr);                                      uint64_t irq_nr);
91            void                    (*functioncall_trace)(struct cpu *,
92                                        uint64_t f, int n_args);
93  };  };
94    
95  #ifdef TRACE_NULL_CRASHES  #ifdef TRACE_NULL_CRASHES
96  #define TRACE_NULL_N_ENTRIES            16  #define TRACE_NULL_N_ENTRIES            16
97  #endif  #endif
98    
99    
100    /*
101     *  Dynamic translation definitions:
102     *
103     *  The translation cache begins with N_BASE_TABLE_ENTRIES uint32_t offsets
104     *  into the cache, for possible translation cache structs for physical pages.
105     */
106    
107    /*  Physpage flags:  */
108    #define TRANSLATIONS                    1
109    #define COMBINATIONS                    2
110    
111    #define DYNTRANS_CACHE_SIZE             (20*1048576)
112    #define DYNTRANS_CACHE_MARGIN           300000
113    
114    #define N_BASE_TABLE_ENTRIES            32768
115    #define PAGENR_TO_TABLE_INDEX(a)        ((a) & (N_BASE_TABLE_ENTRIES-1))
116    
117    
118    /*
119     *  The generic CPU struct:
120     */
121    
122  struct cpu {  struct cpu {
123          /*  Pointer back to the machine this CPU is in:  */          /*  Pointer back to the machine this CPU is in:  */
124          struct machine  *machine;          struct machine  *machine;
# Line 95  struct cpu { Line 128  struct cpu {
128          int             dead;          int             dead;
129          int             bootstrap_cpu_flag;          int             bootstrap_cpu_flag;
130          int             cpu_id;          int             cpu_id;
131            int             is_32bit;       /*  0 for 64-bit, 1 for 32-bit  */
132          char            *name;          char            *name;
133    
134          struct memory   *mem;          struct memory   *mem;
# Line 104  struct cpu { Line 138  struct cpu {
138                              int writeflag, int cache_flags);                              int writeflag, int cache_flags);
139          int             (*translate_address)(struct cpu *, uint64_t vaddr,          int             (*translate_address)(struct cpu *, uint64_t vaddr,
140                              uint64_t *return_addr, int flags);                              uint64_t *return_addr, int flags);
141          void            (*useremul_syscall)(struct cpu *cpu,          void            (*update_translation_table)(struct cpu *,
142                              uint32_t code);                              uint64_t vaddr_page, unsigned char *host_page,
143                                int writeflag, uint64_t paddr_page);
144            void            (*invalidate_translation_caches)(struct cpu *,
145                                uint64_t paddr, int flags);
146            void            (*invalidate_code_translation)(struct cpu *,
147                                uint64_t paddr, int flags);
148            void            (*useremul_syscall)(struct cpu *cpu, uint32_t code);
149    
         /*  Things that all CPU families have:  */  
150          uint64_t        pc;          uint64_t        pc;
151    
152  #ifdef TRACE_NULL_CRASHES  #ifdef TRACE_NULL_CRASHES
153          uint64_t        trace_null_addr[TRACE_NULL_N_ENTRIES];          /*  TODO: remove this, it's MIPS only  */
154          int             trace_null_index;          int             trace_null_index;
155            uint64_t        trace_null_addr[TRACE_NULL_N_ENTRIES];
156  #endif    #endif  
157    
158          /*  CPU-family dependant:  */          int             trace_tree_depth;
159    
160            /*
161             *  Dynamic translation:
162             */
163            int             running_translated;
164            int             n_translated_instrs;
165            unsigned char   *translation_cache;
166            size_t          translation_cache_cur_ofs;
167    
168            /*
169             *  CPU-family dependent:
170             */
171          union {          union {
172                    struct alpha_cpu   alpha;
173                  struct arm_cpu     arm;                  struct arm_cpu     arm;
174                    struct avr_cpu     avr;
175                    struct hppa_cpu    hppa;
176                    struct i960_cpu    i960;
177                    struct ia64_cpu    ia64;
178                    struct m68k_cpu    m68k;
179                  struct mips_cpu    mips;                  struct mips_cpu    mips;
180                    struct newmips_cpu newmips;
181                  struct ppc_cpu     ppc;                  struct ppc_cpu     ppc;
182                  struct urisc_cpu   urisc;                  struct sh_cpu      sh;
183                    struct sparc_cpu   sparc;
184                  struct x86_cpu     x86;                  struct x86_cpu     x86;
185          } cd;          } cd;
186  };  };
# Line 139  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, int forced);  void cpu_show_cycles(struct machine *machine, int forced);
# Line 149  struct cpu_family *cpu_family_ptr_by_num Line 212  struct cpu_family *cpu_family_ptr_by_num
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->interrupt = n ## _cpu_interrupt;                            \
235            fp->interrupt_ack = n ## _cpu_interrupt_ack;                    \
236            fp->functioncall_trace = n ## _cpu_functioncall_trace;          \
237            return 1;                                                       \
238            }
239    
240    #define CPU_OLD_FAMILY_INIT(n,s)        int n ## _cpu_family_init(      \
241            struct cpu_family *fp) {                                        \
242            /*  Fill in the cpu_family struct with valid data for this arch.  */ \
243            fp->name = s;                                                   \
244            fp->cpu_new = n ## _cpu_new;                                    \
245            fp->list_available_types = n ## _cpu_list_available_types;      \
246            fp->register_match = n ## _cpu_register_match;                  \
247            fp->disassemble_instr = n ## _cpu_disassemble_instr;            \
248            fp->register_dump = n ## _cpu_register_dump;                    \
249            fp->run = n ## _cpu_run;                                        \
250            fp->dumpinfo = n ## _cpu_dumpinfo;                              \
251            fp->show_full_statistics = n ## _cpu_show_full_statistics;      \
252            fp->tlbdump = n ## _cpu_tlbdump;                                \
253            fp->interrupt = n ## _cpu_interrupt;                            \
254            fp->interrupt_ack = n ## _cpu_interrupt_ack;                    \
255            fp->functioncall_trace = n ## _cpu_functioncall_trace;          \
256            return 1;                                                       \
257            }
258    
259    
260  #endif  /*  CPU_H  */  #endif  /*  CPU_H  */

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

  ViewVC Help
Powered by ViewVC 1.1.26