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);
269 void (*init_tables)(
struct cpu *cpu);
272 void (*list_available_types)(void);
275 int (*disassemble_instr)(
struct cpu *cpu,
280 void (*register_dump)(
struct cpu *cpu,
281 int gprs,
int coprocs);
284 void (*dumpinfo)(
struct cpu *cpu);
287 void (*tlbdump)(
struct machine *m,
int x,
292 void (*functioncall_trace)(
struct cpu *,
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)) 344 struct timeval starttime;
366 struct memory *mem, uint64_t vaddr,
367 unsigned char *
data,
size_t len,
368 int writeflag,
int cache_flags);
369 int (*translate_v2p)(
struct cpu *, uint64_t vaddr,
370 uint64_t *return_paddr,
int flags);
372 uint64_t vaddr_page,
unsigned char *host_page,
373 int writeflag, uint64_t paddr_page);
375 uint64_t paddr,
int flags);
377 uint64_t paddr,
int flags);
452 int cpu_id,
char *cpu_type_name);
457 int gprs,
int coprocs);
477 #define JUST_MARK_AS_NON_WRITABLE 1 478 #define INVALIDATE_ALL 2 479 #define INVALIDATE_PADDR 4 480 #define INVALIDATE_VADDR 8 481 #define INVALIDATE_VADDR_UPPER4 16 486 #define CPU_SETTINGS_ADD_REGISTER64(name, var) \ 487 settings_add(cpu->settings, name, 1, SETTINGS_TYPE_UINT64, \ 488 cpu->is_32bit? SETTINGS_FORMAT_HEX32 : SETTINGS_FORMAT_HEX64, \ 490 #define CPU_SETTINGS_ADD_REGISTER32(name, var) \ 491 settings_add(cpu->settings, name, 1, SETTINGS_TYPE_UINT32, \ 492 SETTINGS_FORMAT_HEX32, (void *) &(var)); 493 #define CPU_SETTINGS_ADD_REGISTER16(name, var) \ 494 settings_add(cpu->settings, name, 1, SETTINGS_TYPE_UINT16, \ 495 SETTINGS_FORMAT_HEX16, (void *) &(var)); 496 #define CPU_SETTINGS_ADD_REGISTER8(name, var) \ 497 settings_add(cpu->settings, name, 1, SETTINGS_TYPE_UINT8, \ 498 SETTINGS_FORMAT_HEX8, (void *) &(var)); 501 #define CPU_FAMILY_INIT(n,s) int n ## _cpu_family_init( \ 502 struct cpu_family *fp) { \ 504 fp->name = strdup(s); \ 505 fp->cpu_new = n ## _cpu_new; \ 506 fp->list_available_types = n ## _cpu_list_available_types; \ 507 fp->disassemble_instr = n ## _cpu_disassemble_instr; \ 508 fp->register_dump = n ## _cpu_register_dump; \ 509 fp->dumpinfo = n ## _cpu_dumpinfo; \ 510 fp->functioncall_trace = n ## _cpu_functioncall_trace; \ 511 fp->tlbdump = n ## _cpu_tlbdump; \ 512 fp->init_tables = n ## _cpu_init_tables; \ void cpu_run_deinit(struct machine *machine)
struct cpu * cpu_new(struct memory *mem, struct machine *machine, int cpu_id, char *cpu_type_name)
void cpu_list_available_types(void)
void f(int s, int func, int only_name)
struct settings * settings
#define PHYSPAGE_RANGES_ENTRIES_PER_LIST
uint16_t count[PHYSPAGE_RANGES_ENTRIES_PER_LIST]
void cpu_run_init(struct machine *machine)
void cpu_create_or_reset_tc(struct cpu *cpu)
void cpu_tlbdump(struct machine *m, int x, int rawflag)
void cpu_functioncall_trace(struct cpu *cpu, uint64_t f)
int translation_readahead
void cpu_dumpinfo(struct machine *m, struct cpu *cpu)
void cpu_functioncall_trace_return(struct cpu *cpu)
int(* memory_rw)(struct cpu *cpu, struct memory *mem, uint64_t vaddr, unsigned char *data, size_t len, int writeflag, int cache_flags)
uint16_t length[PHYSPAGE_RANGES_ENTRIES_PER_LIST]
size_t translation_cache_cur_ofs
void cpu_destroy(struct cpu *cpu)
unsigned char * translation_cache
uint16_t base[PHYSPAGE_RANGES_ENTRIES_PER_LIST]
int cpu_disassemble_instr(struct machine *m, struct cpu *cpu, unsigned char *instr, int running, uint64_t addr)
void cpu_register_dump(struct machine *m, struct cpu *cpu, int gprs, int coprocs)
int(* instruction_has_delayslot)(struct cpu *cpu, unsigned char *ib)
int64_t ninstrs_since_gettimeofday
struct cpu_family * cpu_family_ptr_by_number(int arch)
void(* update_translation_table)(struct cpu *, uint64_t vaddr_page, unsigned char *host_page, int writeflag, uint64_t paddr_page)
void(* useremul_syscall)(struct cpu *cpu, uint32_t code)
void(* invalidate_code_translation)(struct cpu *, uint64_t paddr, int flags)
void(* invalidate_translation_caches)(struct cpu *, uint64_t paddr, int flags)
void cpu_show_cycles(struct machine *machine, int forced)