Commit 985a19d6d1d7ab3705bf42698cc95abfbbfa24f8
1 parent
3f5dcc34
PowerPC merge (Jocelyn Mayer)
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@566 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
4 changed files
with
27 additions
and
10 deletions
target-ppc/op.c
target-ppc/op_helper.c
... | ... | @@ -349,9 +349,13 @@ void do_fnabs (void) |
349 | 349 | } |
350 | 350 | |
351 | 351 | /* Instruction cache invalidation helper */ |
352 | +#define ICACHE_LINE_SIZE 32 | |
353 | + | |
352 | 354 | void do_icbi (void) |
353 | 355 | { |
354 | - // tb_invalidate_page(T0); | |
356 | + /* Invalidate one cache line */ | |
357 | + T0 &= ~(ICACHE_LINE_SIZE - 1); | |
358 | + tb_invalidate_page_range(T0, T0 + ICACHE_LINE_SIZE); | |
355 | 359 | } |
356 | 360 | |
357 | 361 | /* TLB invalidation helpers */ | ... | ... |
target-ppc/op_mem.h
... | ... | @@ -134,6 +134,19 @@ PPC_OP(glue(glue(l, name), MEMSUFFIX)) \ |
134 | 134 | PPC_LDF_OP(fd, ldfq); |
135 | 135 | PPC_LDF_OP(fs, ldfl); |
136 | 136 | |
137 | +/* Load and set reservation */ | |
138 | +PPC_OP(glue(lwarx, MEMSUFFIX)) | |
139 | +{ | |
140 | + if (T0 & 0x03) { | |
141 | + do_queue_exception(EXCP_ALIGN); | |
142 | + do_process_exceptions(); | |
143 | + } else { | |
144 | + glue(ldl, MEMSUFFIX)((void *)T0); | |
145 | + regs->reserve = T0 & ~0x03; | |
146 | + } | |
147 | + RETURN(); | |
148 | +} | |
149 | + | |
137 | 150 | /* Store with reservation */ |
138 | 151 | PPC_OP(glue(stwcx, MEMSUFFIX)) |
139 | 152 | { | ... | ... |
target-ppc/translate.c
... | ... | @@ -1302,8 +1302,14 @@ GEN_HANDLER(isync, 0x13, 0x16, 0xFF, 0x03FF0801, PPC_MEM) |
1302 | 1302 | |
1303 | 1303 | /* lwarx */ |
1304 | 1304 | #if defined(CONFIG_USER_ONLY) |
1305 | +#define op_lwarx() gen_op_lwarx_raw() | |
1305 | 1306 | #define op_stwcx() gen_op_stwcx_raw() |
1306 | 1307 | #else |
1308 | +#define op_lwarx() (*gen_op_lwarx[ctx->mem_idx])() | |
1309 | +static GenOpFunc *gen_op_lwarx[] = { | |
1310 | + &gen_op_lwarx_user, | |
1311 | + &gen_op_lwarx_kernel, | |
1312 | +}; | |
1307 | 1313 | #define op_stwcx() (*gen_op_stwcx[ctx->mem_idx])() |
1308 | 1314 | static GenOpFunc *gen_op_stwcx[] = { |
1309 | 1315 | &gen_op_stwcx_user, |
... | ... | @@ -1320,9 +1326,8 @@ GEN_HANDLER(lwarx, 0x1F, 0x14, 0xFF, 0x00000001, PPC_RES) |
1320 | 1326 | gen_op_load_gpr_T1(rB(ctx->opcode)); |
1321 | 1327 | gen_op_add(); |
1322 | 1328 | } |
1323 | - op_ldst(lwz); | |
1329 | + op_lwarx(); | |
1324 | 1330 | gen_op_store_T1_gpr(rD(ctx->opcode)); |
1325 | - gen_op_set_reservation(); | |
1326 | 1331 | } |
1327 | 1332 | |
1328 | 1333 | /* stwcx. */ |
... | ... | @@ -3169,9 +3174,11 @@ int gen_intermediate_code_internal (CPUState *env, TranslationBlock *tb, |
3169 | 3174 | while (lj <= j) |
3170 | 3175 | gen_opc_instr_start[lj++] = 0; |
3171 | 3176 | tb->size = 0; |
3177 | +#if 0 | |
3172 | 3178 | if (loglevel > 0) { |
3173 | 3179 | page_dump(logfile); |
3174 | 3180 | } |
3181 | +#endif | |
3175 | 3182 | } else { |
3176 | 3183 | tb->size = (uint32_t)ctx.nip - pc_start; |
3177 | 3184 | } | ... | ... |