Commit a316d3353cefb6634f8007c8bb18f4744a66766b
1 parent
6e256c93
added CPU_COMMON and CPUState.tb_jmp_cache[]
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@1630 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
6 changed files
with
38 additions
and
91 deletions
cpu-defs.h
... | ... | @@ -77,6 +77,9 @@ typedef unsigned long ram_addr_t; |
77 | 77 | |
78 | 78 | #define MAX_BREAKPOINTS 32 |
79 | 79 | |
80 | +#define TB_JMP_CACHE_BITS 12 | |
81 | +#define TB_JMP_CACHE_SIZE (1 << TB_JMP_CACHE_BITS) | |
82 | + | |
80 | 83 | #define CPU_TLB_SIZE 256 |
81 | 84 | |
82 | 85 | typedef struct CPUTLBEntry { |
... | ... | @@ -91,4 +94,30 @@ typedef struct CPUTLBEntry { |
91 | 94 | target_phys_addr_t addend; |
92 | 95 | } CPUTLBEntry; |
93 | 96 | |
97 | +#define CPU_COMMON \ | |
98 | + struct TranslationBlock *current_tb; /* currently executing TB */ \ | |
99 | + /* soft mmu support */ \ | |
100 | + /* in order to avoid passing too many arguments to the memory \ | |
101 | + write helpers, we store some rarely used information in the CPU \ | |
102 | + context) */ \ | |
103 | + unsigned long mem_write_pc; /* host pc at which the memory was \ | |
104 | + written */ \ | |
105 | + target_ulong mem_write_vaddr; /* target virtual addr at which the \ | |
106 | + memory was written */ \ | |
107 | + /* 0 = kernel, 1 = user */ \ | |
108 | + CPUTLBEntry tlb_read[2][CPU_TLB_SIZE]; \ | |
109 | + CPUTLBEntry tlb_write[2][CPU_TLB_SIZE]; \ | |
110 | + struct TranslationBlock *tb_jmp_cache[TB_JMP_CACHE_SIZE]; \ | |
111 | + \ | |
112 | + /* from this point: preserved by CPU reset */ \ | |
113 | + /* ice debug support */ \ | |
114 | + target_ulong breakpoints[MAX_BREAKPOINTS]; \ | |
115 | + int nb_breakpoints; \ | |
116 | + int singlestep_enabled; \ | |
117 | + \ | |
118 | + /* user data */ \ | |
119 | + void *opaque; | |
120 | + | |
121 | + | |
122 | + | |
94 | 123 | #endif | ... | ... |
target-arm/cpu.h
... | ... | @@ -60,22 +60,9 @@ typedef struct CPUARMState { |
60 | 60 | jmp_buf jmp_env; |
61 | 61 | int exception_index; |
62 | 62 | int interrupt_request; |
63 | - struct TranslationBlock *current_tb; | |
64 | 63 | int user_mode_only; |
65 | 64 | uint32_t address; |
66 | 65 | |
67 | - /* ICE debug support. */ | |
68 | - target_ulong breakpoints[MAX_BREAKPOINTS]; | |
69 | - int nb_breakpoints; | |
70 | - int singlestep_enabled; | |
71 | - | |
72 | - /* in order to avoid passing too many arguments to the memory | |
73 | - write helpers, we store some rarely used information in the CPU | |
74 | - context) */ | |
75 | - unsigned long mem_write_pc; /* host pc at which the memory was | |
76 | - written */ | |
77 | - unsigned long mem_write_vaddr; /* target virtual addr at which the | |
78 | - memory was written */ | |
79 | 66 | /* VFP coprocessor state. */ |
80 | 67 | struct { |
81 | 68 | float64 regs[16]; |
... | ... | @@ -93,8 +80,8 @@ typedef struct CPUARMState { |
93 | 80 | float_status fp_status; |
94 | 81 | } vfp; |
95 | 82 | |
96 | - /* user data */ | |
97 | - void *opaque; | |
83 | + CPU_COMMON | |
84 | + | |
98 | 85 | } CPUARMState; |
99 | 86 | |
100 | 87 | CPUARMState *cpu_arm_init(void); | ... | ... |
target-i386/cpu.h
... | ... | @@ -497,28 +497,11 @@ typedef struct CPUX86State { |
497 | 497 | int error_code; |
498 | 498 | int exception_is_int; |
499 | 499 | target_ulong exception_next_eip; |
500 | - struct TranslationBlock *current_tb; /* currently executing TB */ | |
501 | 500 | target_ulong dr[8]; /* debug registers */ |
502 | 501 | int interrupt_request; |
503 | 502 | int user_mode_only; /* user mode only simulation */ |
504 | 503 | |
505 | - /* soft mmu support */ | |
506 | - /* in order to avoid passing too many arguments to the memory | |
507 | - write helpers, we store some rarely used information in the CPU | |
508 | - context) */ | |
509 | - unsigned long mem_write_pc; /* host pc at which the memory was | |
510 | - written */ | |
511 | - target_ulong mem_write_vaddr; /* target virtual addr at which the | |
512 | - memory was written */ | |
513 | - /* 0 = kernel, 1 = user */ | |
514 | - CPUTLBEntry tlb_read[2][CPU_TLB_SIZE]; | |
515 | - CPUTLBEntry tlb_write[2][CPU_TLB_SIZE]; | |
516 | - | |
517 | - /* from this point: preserved by CPU reset */ | |
518 | - /* ice debug support */ | |
519 | - target_ulong breakpoints[MAX_BREAKPOINTS]; | |
520 | - int nb_breakpoints; | |
521 | - int singlestep_enabled; | |
504 | + CPU_COMMON | |
522 | 505 | |
523 | 506 | /* processor features (e.g. for CPUID insn) */ |
524 | 507 | uint32_t cpuid_level; |
... | ... | @@ -538,8 +521,6 @@ typedef struct CPUX86State { |
538 | 521 | /* in order to simplify APIC support, we leave this pointer to the |
539 | 522 | user */ |
540 | 523 | struct APICState *apic_state; |
541 | - /* user data */ | |
542 | - void *opaque; | |
543 | 524 | } CPUX86State; |
544 | 525 | |
545 | 526 | CPUX86State *cpu_x86_init(void); | ... | ... |
target-mips/cpu.h
... | ... | @@ -162,24 +162,8 @@ struct CPUMIPSState { |
162 | 162 | #define MIPS_HFLAG_BR 0x0800 /* branch to register (can't link TB) */ |
163 | 163 | target_ulong btarget; /* Jump / branch target */ |
164 | 164 | int bcond; /* Branch condition (if needed) */ |
165 | - struct TranslationBlock *current_tb; /* currently executing TB */ | |
166 | - /* soft mmu support */ | |
167 | - /* in order to avoid passing too many arguments to the memory | |
168 | - write helpers, we store some rarely used information in the CPU | |
169 | - context) */ | |
170 | - target_ulong mem_write_pc; /* host pc at which the memory was | |
171 | - written */ | |
172 | - unsigned long mem_write_vaddr; /* target virtual addr at which the | |
173 | - memory was written */ | |
174 | - /* 0 = kernel, 1 = user (may have 2 = kernel code, 3 = user code ?) */ | |
175 | - CPUTLBEntry tlb_read[2][CPU_TLB_SIZE]; | |
176 | - CPUTLBEntry tlb_write[2][CPU_TLB_SIZE]; | |
177 | - /* ice debug support */ | |
178 | - target_ulong breakpoints[MAX_BREAKPOINTS]; | |
179 | - int nb_breakpoints; | |
180 | - int singlestep_enabled; /* XXX: should use CPU single step mode instead */ | |
181 | - /* user data */ | |
182 | - void *opaque; | |
165 | + | |
166 | + CPU_COMMON | |
183 | 167 | }; |
184 | 168 | |
185 | 169 | #include "cpu-all.h" | ... | ... |
target-ppc/cpu.h
... | ... | @@ -493,19 +493,10 @@ struct CPUPPCState { |
493 | 493 | /* floating point status and control register */ |
494 | 494 | uint8_t fpscr[8]; |
495 | 495 | |
496 | - /* soft mmu support */ | |
497 | - /* 0 = kernel, 1 = user (may have 2 = kernel code, 3 = user code ?) */ | |
498 | - CPUTLBEntry tlb_read[2][CPU_TLB_SIZE]; | |
499 | - CPUTLBEntry tlb_write[2][CPU_TLB_SIZE]; | |
496 | + CPU_COMMON | |
497 | + | |
500 | 498 | int access_type; /* when a memory exception occurs, the access |
501 | 499 | type is stored here */ |
502 | - /* in order to avoid passing too many arguments to the memory | |
503 | - write helpers, we store some rarely used information in the CPU | |
504 | - context) */ | |
505 | - unsigned long mem_write_pc; /* host pc at which the memory was | |
506 | - written */ | |
507 | - unsigned long mem_write_vaddr; /* target virtual addr at which the | |
508 | - memory was written */ | |
509 | 500 | |
510 | 501 | /* MMU context */ |
511 | 502 | /* Address space register */ |
... | ... | @@ -564,22 +555,13 @@ struct CPUPPCState { |
564 | 555 | /* Those resources are used only in Qemu core */ |
565 | 556 | jmp_buf jmp_env; |
566 | 557 | int user_mode_only; /* user mode only simulation */ |
567 | - struct TranslationBlock *current_tb; /* currently executing TB */ | |
568 | 558 | uint32_t hflags; |
569 | 559 | |
570 | - /* ice debug support */ | |
571 | - target_ulong breakpoints[MAX_BREAKPOINTS]; | |
572 | - int nb_breakpoints; | |
573 | - int singlestep_enabled; /* XXX: should use CPU single step mode instead */ | |
574 | - | |
575 | 560 | /* Power management */ |
576 | 561 | int power_mode; |
577 | 562 | |
578 | 563 | /* temporary hack to handle OSI calls (only used if non NULL) */ |
579 | 564 | int (*osi_call)(struct CPUPPCState *env); |
580 | - | |
581 | - /* user data */ | |
582 | - void *opaque; | |
583 | 565 | }; |
584 | 566 | |
585 | 567 | /*****************************************************************************/ | ... | ... |
target-sparc/cpu.h
... | ... | @@ -166,21 +166,11 @@ typedef struct CPUSPARCState { |
166 | 166 | int exception_index; |
167 | 167 | int interrupt_index; |
168 | 168 | int interrupt_request; |
169 | - struct TranslationBlock *current_tb; | |
170 | - void *opaque; | |
171 | 169 | /* NOTE: we allow 8 more registers to handle wrapping */ |
172 | 170 | target_ulong regbase[NWINDOWS * 16 + 8]; |
173 | 171 | |
174 | - /* in order to avoid passing too many arguments to the memory | |
175 | - write helpers, we store some rarely used information in the CPU | |
176 | - context) */ | |
177 | - unsigned long mem_write_pc; /* host pc at which the memory was | |
178 | - written */ | |
179 | - target_ulong mem_write_vaddr; /* target virtual addr at which the | |
180 | - memory was written */ | |
181 | - /* 0 = kernel, 1 = user (may have 2 = kernel code, 3 = user code ?) */ | |
182 | - CPUTLBEntry tlb_read[2][CPU_TLB_SIZE]; | |
183 | - CPUTLBEntry tlb_write[2][CPU_TLB_SIZE]; | |
172 | + CPU_COMMON | |
173 | + | |
184 | 174 | /* MMU regs */ |
185 | 175 | #if defined(TARGET_SPARC64) |
186 | 176 | uint64_t lsu; |
... | ... | @@ -222,12 +212,6 @@ typedef struct CPUSPARCState { |
222 | 212 | #if !defined(TARGET_SPARC64) && !defined(reg_T2) |
223 | 213 | target_ulong t2; |
224 | 214 | #endif |
225 | - | |
226 | - /* ice debug support */ | |
227 | - target_ulong breakpoints[MAX_BREAKPOINTS]; | |
228 | - int nb_breakpoints; | |
229 | - int singlestep_enabled; /* XXX: should use CPU single step mode instead */ | |
230 | - | |
231 | 215 | } CPUSPARCState; |
232 | 216 | #if defined(TARGET_SPARC64) |
233 | 217 | #define GET_FSR32(env) (env->fsr & 0xcfc1ffff) | ... | ... |