/[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 26 by dpavlin, Mon Oct 8 16:20:10 2007 UTC revision 32 by dpavlin, Mon Oct 8 16:20:58 2007 UTC
# Line 28  Line 28 
28   *  SUCH DAMAGE.   *  SUCH DAMAGE.
29   *   *
30   *   *
31   *  $Id: cpu.h,v 1.79 2006/06/25 00:27:36 debug Exp $   *  $Id: cpu.h,v 1.100 2006/10/25 09:24:06 debug Exp $
32   *   *
33   *  CPU-related definitions.   *  CPU-related definitions.
34   */   */
# Line 54  Line 54 
54   *  instruction can "nullify" (skip) the delay-slot. If the end-of-page   *  instruction can "nullify" (skip) the delay-slot. If the end-of-page
55   *  slot is skipped, then we end up one step after that. That's where the   *  slot is skipped, then we end up one step after that. That's where the
56   *  end_of_page2 slot is. :)   *  end_of_page2 slot is. :)
57     *
58     *  next_ofs points to the next page in a chain of possible pages.
59     *  (several pages can be in the same chain, but only one matches the
60     *  specific physaddr.)
61     *
62     *  translations is a tiny bitmap indicating which parts of the page have
63     *  actual translations. Bit 0 corresponds to the lowest 1/32th of the page,
64     *  bit 1 to the second-lowest 1/32th, and so on.
65   */   */
66  #define DYNTRANS_MISC_DECLARATIONS(arch,ARCH,addrtype)  struct \  #define DYNTRANS_MISC_DECLARATIONS(arch,ARCH,addrtype)  struct \
67          arch ## _instr_call {                                   \          arch ## _instr_call {                                   \
# Line 65  Line 73 
73          struct arch ## _tc_physpage {                                   \          struct arch ## _tc_physpage {                                   \
74                  struct arch ## _instr_call ics[ARCH ## _IC_ENTRIES_PER_PAGE+2];\                  struct arch ## _instr_call ics[ARCH ## _IC_ENTRIES_PER_PAGE+2];\
75                  uint32_t        next_ofs;       /*  (0 for end of chain)  */ \                  uint32_t        next_ofs;       /*  (0 for end of chain)  */ \
76                  int             flags;                                  \                  uint32_t        translations;                           \
77                  addrtype        physaddr;                               \                  addrtype        physaddr;                               \
78          };                                                              \          };                                                              \
79                                                                          \                                                                          \
# Line 75  Line 83 
83                  addrtype        vaddr_page;                             \                  addrtype        vaddr_page;                             \
84                  addrtype        paddr_page;                             \                  addrtype        paddr_page;                             \
85                  unsigned char   *host_page;                             \                  unsigned char   *host_page;                             \
                 int64_t         timestamp;                              \  
86          };          };
87    
88  #define DYNTRANS_MISC64_DECLARATIONS(arch,ARCH,tlbindextype)            \  #define DYNTRANS_MISC64_DECLARATIONS(arch,ARCH,tlbindextype)            \
# Line 148  Line 155 
155   *   *
156   *  phys_page points to translation cache physpages.   *  phys_page points to translation cache physpages.
157   *   *
  *  phystranslation is a bitmap which tells us whether a physical page has  
  *  a code translation.  
  *  
158   *  vaddr_to_tlbindex is a virtual address to tlb index hint table.   *  vaddr_to_tlbindex is a virtual address to tlb index hint table.
159   *  The values in this array are the tlb index plus 1, so a value of, say,   *  The values in this array are the tlb index plus 1, so a value of, say,
160   *  3 means tlb index 2. A value of 0 would mean a tlb index of -1, which   *  3 means tlb index 2. A value of 0 would mean a tlb index of -1, which
# Line 162  Line 166 
166          unsigned char           *host_store[N_VPH32_ENTRIES];           \          unsigned char           *host_store[N_VPH32_ENTRIES];           \
167          paddrtype               phys_addr[N_VPH32_ENTRIES];             \          paddrtype               phys_addr[N_VPH32_ENTRIES];             \
168          struct arch ## _tc_physpage  *phys_page[N_VPH32_ENTRIES];       \          struct arch ## _tc_physpage  *phys_page[N_VPH32_ENTRIES];       \
         uint32_t                phystranslation[N_VPH32_ENTRIES/32];    \  
169          tlbindextype            vaddr_to_tlbindex[N_VPH32_ENTRIES];          tlbindextype            vaddr_to_tlbindex[N_VPH32_ENTRIES];
170    
171  /*  /*
# Line 191  Line 194 
194  #include "cpu_alpha.h"  #include "cpu_alpha.h"
195  #include "cpu_arm.h"  #include "cpu_arm.h"
196  #include "cpu_avr.h"  #include "cpu_avr.h"
197    #include "cpu_avr32.h"
198  #include "cpu_hppa.h"  #include "cpu_hppa.h"
199  #include "cpu_i960.h"  #include "cpu_i960.h"
200  #include "cpu_ia64.h"  #include "cpu_ia64.h"
201  #include "cpu_m68k.h"  #include "cpu_m68k.h"
202  #include "cpu_mips.h"  #include "cpu_mips.h"
203  #include "cpu_ppc.h"  #include "cpu_ppc.h"
204    #include "cpu_rca180x.h"
205  #include "cpu_sh.h"  #include "cpu_sh.h"
206  #include "cpu_sparc.h"  #include "cpu_sparc.h"
207    #include "cpu_transputer.h"
208  #include "cpu_x86.h"  #include "cpu_x86.h"
209    
210  struct cpu;  struct cpu;
211  struct emul;  struct emul;
212  struct machine;  struct machine;
213  struct memory;  struct memory;
214    struct settings;
215    
216    
217    /*
218     *  cpu_family
219     *  ----------
220     *
221     *  This structure consists of various pointers to functions, performing
222     *  architecture-specific functions.
223     *
224     *  Except for the next and arch fields at the top, all fields in the
225     *  cpu_family struct are filled in by ecah CPU family's init function.
226     */
227  struct cpu_family {  struct cpu_family {
228          struct cpu_family       *next;          struct cpu_family       *next;
229          int                     arch;          int                     arch;
230    
231          /*  These are filled in by each CPU family's init function:  */          /*  Familty name, e.g. "MIPS", "Alpha" etc.  */
232          char                    *name;          char                    *name;
233    
234            /*  Fill in architecture specific parts of a struct cpu.  */
235          int                     (*cpu_new)(struct cpu *cpu, struct memory *mem,          int                     (*cpu_new)(struct cpu *cpu, struct memory *mem,
236                                      struct machine *machine,                                      struct machine *machine,
237                                      int cpu_id, char *cpu_type_name);                                      int cpu_id, char *cpu_type_name);
238    
239            /*  Initialize various translation tables.  */
240            void                    (*init_tables)(struct cpu *cpu);
241    
242            /*  List available CPU types for this architecture.  */
243          void                    (*list_available_types)(void);          void                    (*list_available_types)(void);
244          void                    (*register_match)(struct machine *m,  
245                                      char *name, int writeflag,          /*  Disassemble an instruction.  */
                                     uint64_t *valuep, int *match_register);  
246          int                     (*disassemble_instr)(struct cpu *cpu,          int                     (*disassemble_instr)(struct cpu *cpu,
247                                      unsigned char *instr, int running,                                      unsigned char *instr, int running,
248                                      uint64_t dumpaddr);                                      uint64_t dumpaddr);
249    
250            /*  Dump CPU registers in readable format.  */
251          void                    (*register_dump)(struct cpu *cpu,          void                    (*register_dump)(struct cpu *cpu,
252                                      int gprs, int coprocs);                                      int gprs, int coprocs);
253          int                     (*run_instr)(struct emul *emul,  
254                                      struct cpu *cpu);          /*  Dump generic CPU info in readable format.  */
255          void                    (*dumpinfo)(struct cpu *cpu);          void                    (*dumpinfo)(struct cpu *cpu);
256    
257            /*  Dump TLB data for CPU id x.  */
258          void                    (*tlbdump)(struct machine *m, int x,          void                    (*tlbdump)(struct machine *m, int x,
259                                      int rawflag);                                      int rawflag);
260    
261            /*  Assert an interrupt.  */
262          int                     (*interrupt)(struct cpu *cpu, uint64_t irq_nr);          int                     (*interrupt)(struct cpu *cpu, uint64_t irq_nr);
263    
264            /*  De-assert an interrupt.  */
265          int                     (*interrupt_ack)(struct cpu *cpu,          int                     (*interrupt_ack)(struct cpu *cpu,
266                                      uint64_t irq_nr);                                      uint64_t irq_nr);
267    
268            /*  Print architecture-specific function call arguments.
269                (This is called for each function call, if running with -t.)  */
270          void                    (*functioncall_trace)(struct cpu *,          void                    (*functioncall_trace)(struct cpu *,
271                                      uint64_t f, int n_args);                                      uint64_t f, int n_args);
272    
273            /*  GDB command handler.  */
274          char                    *(*gdb_stub)(struct cpu *, char *cmd);          char                    *(*gdb_stub)(struct cpu *, char *cmd);
         void                    (*init_tables)(struct cpu *cpu);  
275  };  };
276    
277    
# Line 247  struct cpu_family { Line 282  struct cpu_family {
282   *  into the cache, for possible translation cache structs for physical pages.   *  into the cache, for possible translation cache structs for physical pages.
283   */   */
284    
 /*  Physpage flags:  */  
 #define TRANSLATIONS                    1  
 #define COMBINATIONS                    2  
   
285  /*  Meaning of delay_slot:  */  /*  Meaning of delay_slot:  */
286  #define NOT_DELAYED                     0  #define NOT_DELAYED                     0
287  #define DELAYED                         1  #define DELAYED                         1
288  #define TO_BE_DELAYED                   2  #define TO_BE_DELAYED                   2
289  #define EXCEPTION_IN_DELAY_SLOT         0x100  #define EXCEPTION_IN_DELAY_SLOT         8
290    
291  #define N_SAFE_DYNTRANS_LIMIT_SHIFT     14  #define N_SAFE_DYNTRANS_LIMIT_SHIFT     14
292  #define N_SAFE_DYNTRANS_LIMIT   ((1 << (N_SAFE_DYNTRANS_LIMIT_SHIFT - 1)) - 1)  #define N_SAFE_DYNTRANS_LIMIT   ((1 << (N_SAFE_DYNTRANS_LIMIT_SHIFT - 1)) - 1)
293    
294  #define DYNTRANS_CACHE_SIZE             (24*1048576)  #define DYNTRANS_CACHE_SIZE             (32*1048576)
295  #define DYNTRANS_CACHE_MARGIN           350000  #define DYNTRANS_CACHE_MARGIN           200000
296    
297  #define N_BASE_TABLE_ENTRIES            32768  #define N_BASE_TABLE_ENTRIES            32768
298  #define PAGENR_TO_TABLE_INDEX(a)        ((a) & (N_BASE_TABLE_ENTRIES-1))  #define PAGENR_TO_TABLE_INDEX(a)        ((a) & (N_BASE_TABLE_ENTRIES-1))
# Line 275  struct cpu { Line 306  struct cpu {
306          /*  Pointer back to the machine this CPU is in:  */          /*  Pointer back to the machine this CPU is in:  */
307          struct machine  *machine;          struct machine  *machine;
308    
309            /*  Settings:  */
310            struct settings *settings;
311    
312            /*  CPU-specific name, e.g. "R2000", "21164PC", etc.  */
313            char            *name;
314    
315            /*  EMUL_LITTLE_ENDIAN or EMUL_BIG_ENDIAN.  */
316          int             byte_order;          int             byte_order;
317          int             running;  
318          int             dead;          /*  0-based CPU id, in an emulated SMP system.  */
         int             bootstrap_cpu_flag;  
319          int             cpu_id;          int             cpu_id;
         int             is_32bit;       /*  0 for 64-bit, 1 for 32-bit  */  
         char            *name;  
320    
321            /*  0 for emulated 64-bit CPUs, 1 for 32-bit.  */
322            int             is_32bit;
323    
324            /*  1 while running, 0 when paused/stopped.  */
325            int             running;
326    
327            /*  A pointer to the main memory connected to this CPU.  */
328          struct memory   *mem;          struct memory   *mem;
329    
330            int             (*run_instr)(struct cpu *cpu);
331          int             (*memory_rw)(struct cpu *cpu,          int             (*memory_rw)(struct cpu *cpu,
332                              struct memory *mem, uint64_t vaddr,                              struct memory *mem, uint64_t vaddr,
333                              unsigned char *data, size_t len,                              unsigned char *data, size_t len,
# Line 301  struct cpu { Line 345  struct cpu {
345          int             (*instruction_has_delayslot)(struct cpu *cpu,          int             (*instruction_has_delayslot)(struct cpu *cpu,
346                              unsigned char *ib);                              unsigned char *ib);
347    
348            /*  The program counter. (For 32-bit modes, not all bits are used.)  */
349          uint64_t        pc;          uint64_t        pc;
350    
351            /*  See comment further up.  */
352            int             delay_slot;
353    
354            /*  The current depth of function call tracing.  */
355          int             trace_tree_depth;          int             trace_tree_depth;
356    
357          /*          /*
358             *  If is_halted is true when an interrupt trap occurs, the pointer
359             *  to the next instruction to execute will be the instruction
360             *  following the halt instruction, not the halt instrucion itself.
361             *
362             *  If has_been_idling is true when printing the number of executed
363             *  instructions per second, "idling" is printed instead. (The number
364             *  of instrs per second when idling is meaningless anyway.)
365             */
366            int             is_halted;
367            int             has_been_idling;
368    
369            /*
370           *  Dynamic translation:           *  Dynamic translation:
371             *
372             *  The number of translated instructions is assumed to be 1 per
373             *  instruction call. For each case where this differs from the
374             *  truth, n_translated_instrs should be modified. E.g. if 1000
375             *  instruction calls are done, and n_translated_instrs is 50, then
376             *  1050 emulated instructions were actually executed.
377             *
378             *  Note that it can also be adjusted negatively, that is, the way
379             *  to "get out" of a dyntrans loop is to set the current instruction
380             *  call pointer to the "nothing" instruction. This instruction
381             *  _decreases_ n_translated_instrs. That way, once the dyntrans loop
382             *  exits, only real instructions will be counted, and not the
383             *  "nothing" instructions.
384           */           */
         int             running_translated;  
385          int             n_translated_instrs;          int             n_translated_instrs;
386          unsigned char   *translation_cache;          unsigned char   *translation_cache;
387          size_t          translation_cache_cur_ofs;          size_t          translation_cache_cur_ofs;
388    
         uint64_t        delay_jmpaddr;  /*  only used if delay_slot > 0  */  
         int             delay_slot;  
   
389          /*          /*
390           *  CPU-family dependent:           *  CPU-family dependent:
391             *
392             *  These contain everything ranging from registers, memory management,
393             *  status words, etc.
394           */           */
395          union {          union {
396                  struct alpha_cpu   alpha;                  struct alpha_cpu      alpha;
397                  struct arm_cpu     arm;                  struct arm_cpu        arm;
398                  struct avr_cpu     avr;                  struct avr_cpu        avr;
399                  struct hppa_cpu    hppa;                  struct avr32_cpu      avr32;
400                  struct i960_cpu    i960;                  struct hppa_cpu       hppa;
401                  struct ia64_cpu    ia64;                  struct i960_cpu       i960;
402                  struct m68k_cpu    m68k;                  struct ia64_cpu       ia64;
403                  struct mips_cpu    mips;                  struct m68k_cpu       m68k;
404                  struct ppc_cpu     ppc;                  struct mips_cpu       mips;
405                  struct sh_cpu      sh;                  struct ppc_cpu        ppc;
406                  struct sparc_cpu   sparc;                  struct rca180x_cpu    rca180x;
407                  struct x86_cpu     x86;                  struct sh_cpu         sh;
408                    struct sparc_cpu      sparc;
409                    struct transputer_cpu transputer;
410                    struct x86_cpu        x86;
411          } cd;          } cd;
412  };  };
413    
# Line 339  struct cpu { Line 415  struct cpu {
415  /*  cpu.c:  */  /*  cpu.c:  */
416  struct cpu *cpu_new(struct memory *mem, struct machine *machine,  struct cpu *cpu_new(struct memory *mem, struct machine *machine,
417          int cpu_id, char *cpu_type_name);          int cpu_id, char *cpu_type_name);
418    void cpu_destroy(struct cpu *cpu);
419    
420  void cpu_tlbdump(struct machine *m, int x, int rawflag);  void cpu_tlbdump(struct machine *m, int x, int rawflag);
 void cpu_register_match(struct machine *m, char *name,  
         int writeflag, uint64_t *valuep, int *match_register);  
421  void cpu_register_dump(struct machine *m, struct cpu *cpu,  void cpu_register_dump(struct machine *m, struct cpu *cpu,
422          int gprs, int coprocs);          int gprs, int coprocs);
423  int cpu_disassemble_instr(struct machine *m, struct cpu *cpu,  int cpu_disassemble_instr(struct machine *m, struct cpu *cpu,
424          unsigned char *instr, int running, uint64_t addr);          unsigned char *instr, int running, uint64_t addr);
425  char *cpu_gdb_stub(struct cpu *cpu, char *cmd);  char *cpu_gdb_stub(struct cpu *cpu, char *cmd);
426    
427  int cpu_interrupt(struct cpu *cpu, uint64_t irq_nr);  int cpu_interrupt(struct cpu *cpu, uint64_t irq_nr);
428  int cpu_interrupt_ack(struct cpu *cpu, uint64_t irq_nr);  int cpu_interrupt_ack(struct cpu *cpu, uint64_t irq_nr);
429  void cpu_functioncall_trace(struct cpu *cpu, uint64_t f);  void cpu_functioncall_trace(struct cpu *cpu, uint64_t f);
430  void cpu_functioncall_trace_return(struct cpu *cpu);  void cpu_functioncall_trace_return(struct cpu *cpu);
431    
432  void cpu_create_or_reset_tc(struct cpu *cpu);  void cpu_create_or_reset_tc(struct cpu *cpu);
433    
434  void cpu_run_init(struct machine *machine);  void cpu_run_init(struct machine *machine);
435  void cpu_run_deinit(struct machine *machine);  void cpu_run_deinit(struct machine *machine);
436    
437  void cpu_dumpinfo(struct machine *m, struct cpu *cpu);  void cpu_dumpinfo(struct machine *m, struct cpu *cpu);
438  void cpu_list_available_types(void);  void cpu_list_available_types(void);
439  void cpu_show_cycles(struct machine *machine, int forced);  void cpu_show_cycles(struct machine *machine, int forced);
440    
441  struct cpu_family *cpu_family_ptr_by_number(int arch);  struct cpu_family *cpu_family_ptr_by_number(int arch);
442  void cpu_init(void);  void cpu_init(void);
443    
# Line 368  void cpu_init(void); Line 449  void cpu_init(void);
449  #define INVALIDATE_VADDR_UPPER4         16      /*  useful for PPC emulation  */  #define INVALIDATE_VADDR_UPPER4         16      /*  useful for PPC emulation  */
450    
451    
452    /*  Note: 64-bit processors running in 32-bit mode use a 32-bit
453        display format, even though the underlying data is 64-bits.  */
454    #define CPU_SETTINGS_ADD_REGISTER64(name, var)                             \
455            settings_add(cpu->settings, name, 1, SETTINGS_TYPE_UINT64,         \
456                cpu->is_32bit? SETTINGS_FORMAT_HEX32 : SETTINGS_FORMAT_HEX64,  \
457                (void *) &(var));
458    #define CPU_SETTINGS_ADD_REGISTER32(name, var)                             \
459            settings_add(cpu->settings, name, 1, SETTINGS_TYPE_UINT32,         \
460                SETTINGS_FORMAT_HEX32, (void *) &(var));
461    #define CPU_SETTINGS_ADD_REGISTER16(name, var)                             \
462            settings_add(cpu->settings, name, 1, SETTINGS_TYPE_UINT16,         \
463                SETTINGS_FORMAT_HEX16, (void *) &(var));
464    #define CPU_SETTINGS_ADD_REGISTER8(name, var)                              \
465            settings_add(cpu->settings, name, 1, SETTINGS_TYPE_UINT8,          \
466                SETTINGS_FORMAT_HEX8, (void *) &(var));
467    
468    
469  #define CPU_FAMILY_INIT(n,s)    int n ## _cpu_family_init(              \  #define CPU_FAMILY_INIT(n,s)    int n ## _cpu_family_init(              \
470          struct cpu_family *fp) {                                        \          struct cpu_family *fp) {                                        \
471          /*  Fill in the cpu_family struct with valid data for this arch.  */ \          /*  Fill in the cpu_family struct with valid data for this arch.  */ \
472          fp->name = s;                                                   \          fp->name = s;                                                   \
473          fp->cpu_new = n ## _cpu_new;                                    \          fp->cpu_new = n ## _cpu_new;                                    \
474          fp->list_available_types = n ## _cpu_list_available_types;      \          fp->list_available_types = n ## _cpu_list_available_types;      \
         fp->register_match = n ## _cpu_register_match;                  \  
475          fp->disassemble_instr = n ## _cpu_disassemble_instr;            \          fp->disassemble_instr = n ## _cpu_disassemble_instr;            \
476          fp->register_dump = n ## _cpu_register_dump;                    \          fp->register_dump = n ## _cpu_register_dump;                    \
477          fp->dumpinfo = n ## _cpu_dumpinfo;                              \          fp->dumpinfo = n ## _cpu_dumpinfo;                              \
# Line 383  void cpu_init(void); Line 480  void cpu_init(void);
480          fp->functioncall_trace = n ## _cpu_functioncall_trace;          \          fp->functioncall_trace = n ## _cpu_functioncall_trace;          \
481          fp->gdb_stub = n ## _cpu_gdb_stub;                              \          fp->gdb_stub = n ## _cpu_gdb_stub;                              \
482          fp->tlbdump = n ## _cpu_tlbdump;                                \          fp->tlbdump = n ## _cpu_tlbdump;                                \
         fp->run_instr = n ## _cpu_run_instr;                            \  
483          fp->init_tables = n ## _cpu_init_tables;                        \          fp->init_tables = n ## _cpu_init_tables;                        \
484          return 1;                                                       \          return 1;                                                       \
485          }          }

Legend:
Removed from v.26  
changed lines
  Added in v.32

  ViewVC Help
Powered by ViewVC 1.1.26