]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
Don't use the bits VexArchInfo.hwcaps to distinguish ppc32 and ppc64,
authorJulian Seward <jseward@acm.org>
Sun, 30 Apr 2006 23:37:32 +0000 (23:37 +0000)
committerJulian Seward <jseward@acm.org>
Sun, 30 Apr 2006 23:37:32 +0000 (23:37 +0000)
since that doesn't work properly.  Instead pass the guest arch around
too.  Small change with lots of associated plumbing.

git-svn-id: svn://svn.valgrind.org/vex/trunk@1605

VEX/priv/guest-amd64/gdefs.h
VEX/priv/guest-amd64/toIR.c
VEX/priv/guest-generic/bb_to_IR.c
VEX/priv/guest-generic/bb_to_IR.h
VEX/priv/guest-ppc/gdefs.h
VEX/priv/guest-ppc/toIR.c
VEX/priv/guest-x86/gdefs.h
VEX/priv/guest-x86/toIR.c
VEX/priv/main/vex_main.c

index cae514240dbac6a520298885d4a70d867e8f7f6d..0a0d0a957427a4d11ce1b0f17c500789aee4a52e 100644 (file)
@@ -64,6 +64,7 @@ DisResult disInstr_AMD64 ( IRBB*        irbb,
                            UChar*       guest_code,
                            Long         delta,
                            Addr64       guest_IP,
+                           VexArch      guest_arch,
                            VexArchInfo* archinfo,
                            Bool         host_bigendian );
 
index d667bbf04225451866981b204fcc621109f9d2bd..9de659dff3c7b7ee5411581fd1bb62d021eaee42 100644 (file)
@@ -13833,12 +13833,14 @@ DisResult disInstr_AMD64 ( IRBB*        irbb_IN,
                            UChar*       guest_code_IN,
                            Long         delta,
                            Addr64       guest_IP,
+                           VexArch      guest_arch,
                            VexArchInfo* archinfo,
                            Bool         host_bigendian_IN )
 {
    DisResult dres;
 
    /* Set globals (see top of this file) */
+   vassert(guest_arch == VexArchAMD64);
    guest_code           = guest_code_IN;
    irbb                 = irbb_IN;
    host_is_bigendian    = host_bigendian_IN;
index ca3d9f904776f1d40679d8a0d7d8e21446b80535..9b118fe0ec4ae05c52facfd3c4b7ca30ebf45699 100644 (file)
@@ -99,6 +99,7 @@ IRBB* bb_to_IR ( /*OUT*/VexGuestExtents* vge,
                  /*IN*/ Addr64           guest_IP_bbstart,
                  /*IN*/ Bool             (*chase_into_ok)(void*,Addr64),
                  /*IN*/ Bool             host_bigendian,
+                 /*IN*/ VexArch          arch_guest,
                  /*IN*/ VexArchInfo*     archinfo_guest,
                  /*IN*/ IRType           guest_word_type,
                  /*IN*/ Bool             do_self_check,
@@ -231,6 +232,7 @@ IRBB* bb_to_IR ( /*OUT*/VexGuestExtents* vge,
                             guest_code,
                             delta,
                             guest_IP_curr_instr,
+                            arch_guest,
                             archinfo_guest,
                             host_bigendian );
 
index 04af2eb4af134f339cfdbd197291920541856f06..391b9cdf112999f77bccadc36479d3c94b19908d 100644 (file)
@@ -140,6 +140,7 @@ typedef
       /*IN*/  Addr64       guest_IP,
 
       /* Info about the guest architecture */
+      /*IN*/  VexArch      guest_arch,
       /*IN*/  VexArchInfo* archinfo,
 
       /* Is the host bigendian? */
@@ -161,6 +162,7 @@ IRBB* bb_to_IR ( /*OUT*/VexGuestExtents* vge,
                  /*IN*/ Addr64           guest_IP_bbstart,
                  /*IN*/ Bool             (*chase_into_ok)(void*,Addr64),
                  /*IN*/ Bool             host_bigendian,
+                 /*IN*/ VexArch          arch_guest,
                  /*IN*/ VexArchInfo*     archinfo_guest,
                  /*IN*/ IRType           guest_word_type,
                  /*IN*/ Bool             do_self_check,
index d427f93f40113e10489d61e7c092a910391b7b07..e3c0bcfa80fdc2871df0a397cc080e044df5b959 100644 (file)
@@ -65,6 +65,7 @@ DisResult disInstr_PPC ( IRBB*        irbb,
                          UChar*       guest_code,
                          Long         delta,
                          Addr64       guest_IP,
+                         VexArch      guest_arch,
                          VexArchInfo* archinfo,
                          Bool         host_bigendian );
 
index dde7adce1ccf1c48d9ad552d020456019c6b00f9..f19f0a4ddbb6130b21957d19fe8d9978fa4b8157 100644 (file)
@@ -9447,38 +9447,33 @@ DisResult disInstr_PPC ( IRBB*        irbb_IN,
                          UChar*       guest_code_IN,
                          Long         delta,
                          Addr64       guest_IP,
+                         VexArch      guest_arch,
                          VexArchInfo* archinfo,
                          Bool         host_bigendian_IN )
 {
    IRType     ty;
    DisResult  dres;
-   Bool       is32, is64;
    UInt       mask32, mask64;
    UInt hwcaps_guest = archinfo->hwcaps;
 
+   vassert(guest_arch == VexArchPPC32 || guest_arch == VexArchPPC64);
+
    /* global -- ick */
-   mode64 = False;
+   mode64 = guest_arch == VexArchPPC64;
+   ty = mode64 ? Ity_I64 : Ity_I32;
 
-   /* Figure out whether we're being ppc32 or ppc64 today. */
+   /* do some sanity checks */
    mask32 = VEX_HWCAPS_PPC32_F | VEX_HWCAPS_PPC32_V
             | VEX_HWCAPS_PPC32_FX | VEX_HWCAPS_PPC32_GX;
 
-   is32 = (hwcaps_guest & mask32) > 0;
-
    mask64 = VEX_HWCAPS_PPC64_V
             | VEX_HWCAPS_PPC64_FX | VEX_HWCAPS_PPC64_GX;
 
-   is64 = (hwcaps_guest & mask64) > 0;
-
-   if (is32 && !is64)
-      mode64 = False;
-   else if (is64 && !is32)
-      mode64 = True;
-   else
-      vpanic("distInstr_PPC: illegal subarch");
-
-
-   ty = mode64 ? Ity_I64 : Ity_I32;
+   if (mode64) {
+      vassert((hwcaps_guest & mask32) == 0);
+   } else {
+      vassert((hwcaps_guest & mask64) == 0);
+   }
 
    /* Set globals (see top of this file) */
    guest_code           = guest_code_IN;
index 9f84cedff9544a92b18d1739ee8b7bcc18ce554a..e4113ab2d89a1f7619776dd123b8fd1063f44b2e 100644 (file)
@@ -64,6 +64,7 @@ DisResult disInstr_X86 ( IRBB*        irbb,
                          UChar*       guest_code,
                          Long         delta,
                          Addr64       guest_IP,
+                         VexArch      guest_arch,
                          VexArchInfo* archinfo,
                          Bool         host_bigendian );
 
index a337a81610712f76921b04c42eabbde03bbb70b7..7532404166a5a93e6dc8c52bb09374b8424cb7cd 100644 (file)
@@ -12689,12 +12689,14 @@ DisResult disInstr_X86 ( IRBB*        irbb_IN,
                          UChar*       guest_code_IN,
                          Long         delta,
                          Addr64       guest_IP,
+                         VexArch      guest_arch,
                          VexArchInfo* archinfo,
                          Bool         host_bigendian_IN )
 {
    DisResult dres;
 
    /* Set globals (see top of this file) */
+   vassert(guest_arch == VexArchX86);
    guest_code           = guest_code_IN;
    irbb                 = irbb_IN;
    host_is_bigendian    = host_bigendian_IN;
index a6713f357059df565649a82c4ea03e0289cbd676..b26fc012f1390830df2e5e6d50cfd892cdc3b125 100644 (file)
@@ -430,6 +430,7 @@ VexTranslateResult LibVEX_Translate ( VexTranslateArgs* vta )
                      vta->guest_bytes_addr,
                      vta->chase_into_ok,
                      host_is_bigendian,
+                     vta->arch_guest,
                      &vta->archinfo_guest,
                      guest_word_type,
                      vta->do_self_check,