PowerPC merge (Jocelyn Mayer)
authorbellard <bellard@c046a42c-6fe2-441c-8c8c-71466251a162>
Sun, 18 Jan 2004 22:49:57 +0000 (22:49 +0000)
committerbellard <bellard@c046a42c-6fe2-441c-8c8c-71466251a162>
Sun, 18 Jan 2004 22:49:57 +0000 (22:49 +0000)
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@566 c046a42c-6fe2-441c-8c8c-71466251a162

target-ppc/op.c
target-ppc/op_helper.c
target-ppc/op_mem.h
target-ppc/translate.c

index 28722d6507a5c468856ccd346e0646bea263e552..98d788585b45db5d11e5172f5712ab630ca79657 100644 (file)
@@ -453,13 +453,6 @@ PPC_OP(reset_scrfx)
     RETURN();
 }
 
-/* Set reservation */
-PPC_OP(set_reservation)
-{
-    regs->reserve = T0 & ~0x03;
-    RETURN();
-}
-
 /* crf operations */
 PPC_OP(getbit_T0)
 {
index 5d02dfabe7ddedf0ff8a23eca6de0d82dfe6f980..a0e9360282abc07a3fbc18b15c65388f3074701b 100644 (file)
@@ -349,9 +349,13 @@ void do_fnabs (void)
 }
 
 /* Instruction cache invalidation helper */
+#define ICACHE_LINE_SIZE 32
+
 void do_icbi (void)
 {
-    //    tb_invalidate_page(T0);
+    /* Invalidate one cache line */
+    T0 &= ~(ICACHE_LINE_SIZE - 1);
+    tb_invalidate_page_range(T0, T0 + ICACHE_LINE_SIZE);
 }
 
 /* TLB invalidation helpers */
index e66a1dbe0146e29e3f008d9eeef4f4ff779bb44e..01df45d9cff68d727c1ceaff82e9ba766c4d0f2c 100644 (file)
@@ -134,6 +134,19 @@ PPC_OP(glue(glue(l, name), MEMSUFFIX))                                        \
 PPC_LDF_OP(fd, ldfq);
 PPC_LDF_OP(fs, ldfl);
 
+/* Load and set reservation */
+PPC_OP(glue(lwarx, MEMSUFFIX))
+{
+    if (T0 & 0x03) {
+        do_queue_exception(EXCP_ALIGN);
+        do_process_exceptions();
+    } else {
+       glue(ldl, MEMSUFFIX)((void *)T0);
+       regs->reserve = T0 & ~0x03;
+    }
+    RETURN();
+}
+
 /* Store with reservation */
 PPC_OP(glue(stwcx, MEMSUFFIX))
 {
index 34f92bd16d55d166617377f2de8bd45c490562ac..9ad8f6dea1af38a3d5a664bb8a135279f96f139c 100644 (file)
@@ -1302,8 +1302,14 @@ GEN_HANDLER(isync, 0x13, 0x16, 0xFF, 0x03FF0801, PPC_MEM)
 
 /* lwarx */
 #if defined(CONFIG_USER_ONLY)
+#define op_lwarx() gen_op_lwarx_raw()
 #define op_stwcx() gen_op_stwcx_raw()
 #else
+#define op_lwarx() (*gen_op_lwarx[ctx->mem_idx])()
+static GenOpFunc *gen_op_lwarx[] = {
+    &gen_op_lwarx_user,
+    &gen_op_lwarx_kernel,
+};
 #define op_stwcx() (*gen_op_stwcx[ctx->mem_idx])()
 static GenOpFunc *gen_op_stwcx[] = {
     &gen_op_stwcx_user,
@@ -1320,9 +1326,8 @@ GEN_HANDLER(lwarx, 0x1F, 0x14, 0xFF, 0x00000001, PPC_RES)
         gen_op_load_gpr_T1(rB(ctx->opcode));
         gen_op_add();
     }
-    op_ldst(lwz);
+    op_lwarx();
     gen_op_store_T1_gpr(rD(ctx->opcode));
-    gen_op_set_reservation();
 }
 
 /* stwcx. */
@@ -3169,9 +3174,11 @@ int gen_intermediate_code_internal (CPUState *env, TranslationBlock *tb,
         while (lj <= j)
             gen_opc_instr_start[lj++] = 0;
         tb->size = 0;
+#if 0
         if (loglevel > 0) {
             page_dump(logfile);
         }
+#endif
     } else {
         tb->size = (uint32_t)ctx.nip - pc_start;
     }