cpu.h Source File
Back to the index.
Go to the documentation of this file.
35 #include <sys/types.h>
40 #include "../../config.h"
72 #define DYNTRANS_MISC_DECLARATIONS(arch,ARCH,addrtype) struct \
73 arch ## _instr_call { \
74 void (*f)(struct cpu *, struct arch ## _instr_call *); \
75 size_t arg[ARCH ## _N_IC_ARGS]; \
79 struct arch ## _tc_physpage { \
80 struct arch ## _instr_call ics[ARCH ## _IC_ENTRIES_PER_PAGE+2];\
82 uint32_t translations_bitmap; \
83 uint32_t translation_ranges_ofs; \
87 struct arch ## _vpg_tlb_entry { \
90 addrtype vaddr_page; \
91 addrtype paddr_page; \
92 unsigned char *host_page; \
95 #define DYNTRANS_MISC64_DECLARATIONS(arch,ARCH,tlbindextype) \
96 struct arch ## _l3_64_table { \
97 unsigned char *host_load[1 << ARCH ## _L3N]; \
98 unsigned char *host_store[1 << ARCH ## _L3N]; \
99 uint64_t phys_addr[1 << ARCH ## _L3N]; \
100 tlbindextype vaddr_to_tlbindex[1 << ARCH ## _L3N]; \
101 struct arch ## _tc_physpage *phys_page[1 << ARCH ## _L3N]; \
102 struct arch ## _l3_64_table *next; \
105 struct arch ## _l2_64_table { \
106 struct arch ## _l3_64_table *l3[1 << ARCH ## _L2N]; \
107 struct arch ## _l2_64_table *next; \
116 #define PHYSPAGE_RANGES_ENTRIES_PER_LIST 20
143 #define DYNTRANS_ITC(arch) struct arch ## _tc_physpage *cur_physpage; \
144 struct arch ## _instr_call *cur_ic_page; \
145 struct arch ## _instr_call *next_ic; \
146 struct arch ## _tc_physpage *physpage_template;\
147 void (*combination_check)(struct cpu *, \
148 struct arch ## _instr_call *, int low_addr);
157 #define VPH_TLBS(arch,ARCH) \
158 struct arch ## _vpg_tlb_entry \
159 vph_tlb_entry[ARCH ## _MAX_VPH_TLB_ENTRIES];
188 #define N_VPH32_ENTRIES 1048576
189 #define VPH32(arch,ARCH) \
190 unsigned char *host_load[N_VPH32_ENTRIES]; \
191 unsigned char *host_store[N_VPH32_ENTRIES]; \
192 uint32_t phys_addr[N_VPH32_ENTRIES]; \
193 struct arch ## _tc_physpage *phys_page[N_VPH32_ENTRIES]; \
194 uint8_t vaddr_to_tlbindex[N_VPH32_ENTRIES];
195 #define VPH32_16BITVPHENTRIES(arch,ARCH) \
196 unsigned char *host_load[N_VPH32_ENTRIES]; \
197 unsigned char *host_store[N_VPH32_ENTRIES]; \
198 uint32_t phys_addr[N_VPH32_ENTRIES]; \
199 struct arch ## _tc_physpage *phys_page[N_VPH32_ENTRIES]; \
200 uint16_t vaddr_to_tlbindex[N_VPH32_ENTRIES];
201 #define VPH32EXTENDED(arch,ARCH,ex) \
202 unsigned char *host_load_ ## ex[N_VPH32_ENTRIES]; \
203 unsigned char *host_store_ ## ex[N_VPH32_ENTRIES]; \
204 uint32_t phys_addr_ ## ex[N_VPH32_ENTRIES]; \
205 struct arch ## _tc_physpage *phys_page_ ## ex[N_VPH32_ENTRIES];\
206 uint8_t vaddr_to_tlbindex_ ## ex[N_VPH32_ENTRIES];
222 #define DYNTRANS_L1N 17
223 #define VPH64(arch,ARCH) \
224 struct arch ## _l3_64_table *l3_64_dummy; \
225 struct arch ## _l3_64_table *next_free_l3; \
226 struct arch ## _l2_64_table *l2_64_dummy; \
227 struct arch ## _l2_64_table *next_free_l2; \
228 struct arch ## _l2_64_table *l1_64[1 << DYNTRANS_L1N];
266 int cpu_id,
char *cpu_type_name);
281 int gprs,
int coprocs);
305 #define NOT_DELAYED 0
307 #define TO_BE_DELAYED 2
308 #define EXCEPTION_IN_DELAY_SLOT 8
310 #define N_SAFE_DYNTRANS_LIMIT_SHIFT 14
311 #define N_SAFE_DYNTRANS_LIMIT ((1 << (N_SAFE_DYNTRANS_LIMIT_SHIFT - 1)) - 1)
313 #define MAX_DYNTRANS_READAHEAD 128
315 #define DEFAULT_DYNTRANS_CACHE_SIZE (96*1048576)
316 #define DYNTRANS_CACHE_MARGIN 200000
318 #define N_BASE_TABLE_ENTRIES 65536
319 #define PAGENR_TO_TABLE_INDEX(a) ((a) & (N_BASE_TABLE_ENTRIES-1))
370 unsigned char *
data,
size_t len,
371 int writeflag,
int cache_flags);
373 uint64_t *return_paddr,
int flags);
375 uint64_t vaddr_page,
unsigned char *host_page,
376 int writeflag, uint64_t paddr_page);
378 uint64_t paddr,
int flags);
380 uint64_t paddr,
int flags);
455 int cpu_id,
char *cpu_type_name);
460 int gprs,
int coprocs);
480 #define JUST_MARK_AS_NON_WRITABLE 1
481 #define INVALIDATE_ALL 2
482 #define INVALIDATE_PADDR 4
483 #define INVALIDATE_VADDR 8
484 #define INVALIDATE_VADDR_UPPER4 16
489 #define CPU_SETTINGS_ADD_REGISTER64(name, var) \
490 settings_add(cpu->settings, name, 1, SETTINGS_TYPE_UINT64, \
491 cpu->is_32bit? SETTINGS_FORMAT_HEX32 : SETTINGS_FORMAT_HEX64, \
493 #define CPU_SETTINGS_ADD_REGISTER32(name, var) \
494 settings_add(cpu->settings, name, 1, SETTINGS_TYPE_UINT32, \
495 SETTINGS_FORMAT_HEX32, (void *) &(var));
496 #define CPU_SETTINGS_ADD_REGISTER16(name, var) \
497 settings_add(cpu->settings, name, 1, SETTINGS_TYPE_UINT16, \
498 SETTINGS_FORMAT_HEX16, (void *) &(var));
499 #define CPU_SETTINGS_ADD_REGISTER8(name, var) \
500 settings_add(cpu->settings, name, 1, SETTINGS_TYPE_UINT8, \
501 SETTINGS_FORMAT_HEX8, (void *) &(var));
504 #define CPU_FAMILY_INIT(n,s) int n ## _cpu_family_init( \
505 struct cpu_family *fp) { \
507 fp->name = strdup(s); \
508 fp->cpu_new = n ## _cpu_new; \
509 fp->list_available_types = n ## _cpu_list_available_types; \
510 fp->disassemble_instr = n ## _cpu_disassemble_instr; \
511 fp->register_dump = n ## _cpu_register_dump; \
512 fp->dumpinfo = n ## _cpu_dumpinfo; \
513 fp->functioncall_trace = n ## _cpu_functioncall_trace; \
514 fp->tlbdump = n ## _cpu_tlbdump; \
515 fp->init_tables = n ## _cpu_init_tables; \
void cpu_destroy(struct cpu *cpu)
void(* list_available_types)(void)
void f(int s, int func, int only_name)
void(* init_tables)(struct cpu *cpu)
unsigned char * translation_cache
#define PHYSPAGE_RANGES_ENTRIES_PER_LIST
int(* instruction_has_delayslot)(struct cpu *cpu, unsigned char *ib)
void(* update_translation_table)(struct cpu *, uint64_t vaddr_page, unsigned char *host_page, int writeflag, uint64_t paddr_page)
int64_t ninstrs_since_gettimeofday
void(* invalidate_code_translation)(struct cpu *, uint64_t paddr, int flags)
int cpu_disassemble_instr(struct machine *m, struct cpu *cpu, unsigned char *instr, int running, uint64_t addr)
void cpu_dumpinfo(struct machine *m, struct cpu *cpu)
void cpu_create_or_reset_tc(struct cpu *cpu)
void cpu_functioncall_trace(struct cpu *cpu, uint64_t f)
void(* useremul_syscall)(struct cpu *cpu, uint32_t code)
int(* cpu_new)(struct cpu *cpu, struct memory *mem, struct machine *machine, int cpu_id, char *cpu_type_name)
void cpu_show_cycles(struct machine *machine, int forced)
void cpu_run_deinit(struct machine *machine)
uint16_t count[PHYSPAGE_RANGES_ENTRIES_PER_LIST]
uint16_t length[PHYSPAGE_RANGES_ENTRIES_PER_LIST]
uint16_t base[PHYSPAGE_RANGES_ENTRIES_PER_LIST]
struct cpu_family * cpu_family_ptr_by_number(int arch)
void cpu_register_dump(struct machine *m, struct cpu *cpu, int gprs, int coprocs)
void cpu_functioncall_trace_return(struct cpu *cpu)
void(* invalidate_translation_caches)(struct cpu *, uint64_t paddr, int flags)
void(* dumpinfo)(struct cpu *cpu)
int(* translate_v2p)(struct cpu *, uint64_t vaddr, uint64_t *return_paddr, int flags)
void cpu_run_init(struct machine *machine)
struct settings * settings
void(* functioncall_trace)(struct cpu *, int n_args)
int(* run_instr)(struct cpu *cpu)
void cpu_list_available_types(void)
void cpu_tlbdump(struct machine *m, int x, int rawflag)
int translation_readahead
void(* tlbdump)(struct machine *m, int x, int rawflag)
int(* memory_rw)(struct cpu *cpu, struct memory *mem, uint64_t vaddr, unsigned char *data, size_t len, int writeflag, int cache_flags)
void(* register_dump)(struct cpu *cpu, int gprs, int coprocs)
int(* disassemble_instr)(struct cpu *cpu, unsigned char *instr, int running, uint64_t dumpaddr)
size_t translation_cache_cur_ofs
struct cpu * cpu_new(struct memory *mem, struct machine *machine, int cpu_id, char *cpu_type_name)
Generated on Tue Aug 25 2020 19:25:06 for GXemul by
1.8.18