Mark Wielaard c088b4
commit c7bcd1f2ee2d466fb556bfc2b33c5ab039b0898d
Mark Wielaard c088b4
Author: sewardj <sewardj@a5019735-40e9-0310-863c-91ae7b9d1cf9>
Mark Wielaard c088b4
Date:   Fri Jan 20 09:58:15 2017 +0000
Mark Wielaard c088b4
Mark Wielaard c088b4
    x86-linux: Initialize x86 system GDT on first use.  Bug 344139 comment 3.
Mark Wielaard c088b4
    Patch from Sebastian Lackner, sebastian@fds-team.de.
Mark Wielaard c088b4
    
Mark Wielaard c088b4
    
Mark Wielaard c088b4
    git-svn-id: svn://svn.valgrind.org/valgrind/trunk@16204 a5019735-40e9-0310-863c-91ae7b9d1cf9
Mark Wielaard c088b4
Mark Wielaard c088b4
diff --git a/coregrind/m_syswrap/syswrap-x86-linux.c b/coregrind/m_syswrap/syswrap-x86-linux.c
Mark Wielaard c088b4
index f8c4eb4..2f879d8 100644
Mark Wielaard c088b4
--- a/coregrind/m_syswrap/syswrap-x86-linux.c
Mark Wielaard c088b4
+++ b/coregrind/m_syswrap/syswrap-x86-linux.c
Mark Wielaard c088b4
@@ -294,11 +294,37 @@ void translate_to_hw_format ( /* IN  */ vki_modify_ldt_t* inn,
Mark Wielaard c088b4
    out->LdtEnt.Words.word2 = entry_2;
Mark Wielaard c088b4
 }
Mark Wielaard c088b4
 
Mark Wielaard c088b4
-/* Create a zeroed-out GDT. */
Mark Wielaard c088b4
-static VexGuestX86SegDescr* alloc_zeroed_x86_GDT ( void )
Mark Wielaard c088b4
+/* Create initial GDT. */
Mark Wielaard c088b4
+static VexGuestX86SegDescr* alloc_system_x86_GDT ( void )
Mark Wielaard c088b4
 {
Mark Wielaard c088b4
    Int nbytes = VEX_GUEST_X86_GDT_NENT * sizeof(VexGuestX86SegDescr);
Mark Wielaard c088b4
-   return VG_(calloc)("di.syswrap-x86.azxG.1", nbytes, 1);
Mark Wielaard c088b4
+   VexGuestX86SegDescr* gdt = VG_(calloc)("di.syswrap-x86.azxG.1", nbytes, 1);
Mark Wielaard c088b4
+   vki_modify_ldt_t info;
Mark Wielaard c088b4
+   UShort seg;
Mark Wielaard c088b4
+
Mark Wielaard c088b4
+   VG_(memset)(&info, 0, sizeof(info));
Mark Wielaard c088b4
+   info.entry_number    = 0;
Mark Wielaard c088b4
+   info.base_addr       = 0;
Mark Wielaard c088b4
+   info.limit           = 0xfffff;
Mark Wielaard c088b4
+   info.seg_32bit       = 1;
Mark Wielaard c088b4
+   info.contents        = 0;
Mark Wielaard c088b4
+   info.read_exec_only  = 0;
Mark Wielaard c088b4
+   info.limit_in_pages  = 1;
Mark Wielaard c088b4
+   info.seg_not_present = 0;
Mark Wielaard c088b4
+   info.useable         = 0;
Mark Wielaard c088b4
+   info.reserved        = 0;
Mark Wielaard c088b4
+
Mark Wielaard c088b4
+   asm volatile("movw %%ds, %0" : : "m" (seg));
Mark Wielaard c088b4
+   if (!(seg & 4)) translate_to_hw_format(&info, &gdt[seg >> 3], 0);
Mark Wielaard c088b4
+   asm volatile("movw %%ss, %0" : : "m" (seg));
Mark Wielaard c088b4
+   if (!(seg & 4)) translate_to_hw_format(&info, &gdt[seg >> 3], 0);
Mark Wielaard c088b4
+
Mark Wielaard c088b4
+   info.contents        = 2;
Mark Wielaard c088b4
+
Mark Wielaard c088b4
+   asm volatile("movw %%cs, %0" : : "m" (seg));
Mark Wielaard c088b4
+   if (!(seg & 4)) translate_to_hw_format(&info, &gdt[seg >> 3], 0);
Mark Wielaard c088b4
+
Mark Wielaard c088b4
+   return gdt;
Mark Wielaard c088b4
 }
Mark Wielaard c088b4
 
Mark Wielaard c088b4
 /* Create a zeroed-out LDT. */
Mark Wielaard c088b4
@@ -505,7 +531,7 @@ SysRes ML_(x86_sys_set_thread_area) ( ThreadId tid, vki_modify_ldt_t* info )
Mark Wielaard c088b4
 
Mark Wielaard c088b4
    /* If the thread doesn't have a GDT, allocate it now. */
Mark Wielaard c088b4
    if (!gdt) {
Mark Wielaard c088b4
-      gdt = alloc_zeroed_x86_GDT();
Mark Wielaard c088b4
+      gdt = alloc_system_x86_GDT();
Mark Wielaard c088b4
       VG_(threads)[tid].arch.vex.guest_GDT = (HWord)gdt;
Mark Wielaard c088b4
    }
Mark Wielaard c088b4
 
Mark Wielaard c088b4
@@ -564,7 +590,7 @@ static SysRes sys_get_thread_area ( ThreadId tid, vki_modify_ldt_t* info )
Mark Wielaard c088b4
 
Mark Wielaard c088b4
    /* If the thread doesn't have a GDT, allocate it now. */
Mark Wielaard c088b4
    if (!gdt) {
Mark Wielaard c088b4
-      gdt = alloc_zeroed_x86_GDT();
Mark Wielaard c088b4
+      gdt = alloc_system_x86_GDT();
Mark Wielaard c088b4
       VG_(threads)[tid].arch.vex.guest_GDT = (HWord)gdt;
Mark Wielaard c088b4
    }
Mark Wielaard c088b4
 
Mark Wielaard c088b4
@@ -616,7 +642,7 @@ void ML_(x86_setup_LDT_GDT) ( /*OUT*/ ThreadArchState *child,
Mark Wielaard c088b4
    child->vex.guest_GDT = (HWord)NULL;
Mark Wielaard c088b4
 
Mark Wielaard c088b4
    if (parent->vex.guest_GDT != (HWord)NULL) {
Mark Wielaard c088b4
-      child->vex.guest_GDT = (HWord)alloc_zeroed_x86_GDT();
Mark Wielaard c088b4
+      child->vex.guest_GDT = (HWord)alloc_system_x86_GDT();
Mark Wielaard c088b4
       copy_GDT_from_to( (VexGuestX86SegDescr*)parent->vex.guest_GDT,
Mark Wielaard c088b4
                         (VexGuestX86SegDescr*)child->vex.guest_GDT );
Mark Wielaard c088b4
    }
Mark Wielaard c088b4
commit 5f4041b376f7465cd108ad4d1696b0b8a603a175
Mark Wielaard c088b4
Author: sewardj <sewardj@8f6e269a-dfd6-0310-a8e1-e2731360e62c>
Mark Wielaard c088b4
Date:   Fri Jan 20 10:01:42 2017 +0000
Mark Wielaard c088b4
Mark Wielaard c088b4
    x86: Recognize the SS segment prefix on x86.  Bug 344139 comment 4.
Mark Wielaard c088b4
    Patch from Sebastian Lackner, sebastian@fds-team.de.
Mark Wielaard c088b4
    
Mark Wielaard c088b4
    
Mark Wielaard c088b4
    git-svn-id: svn://svn.valgrind.org/vex/trunk@3299 8f6e269a-dfd6-0310-a8e1-e2731360e62c
Mark Wielaard c088b4
Mark Wielaard c088b4
diff --git a/VEX/priv/guest_x86_toIR.c b/VEX/priv/guest_x86_toIR.c
Mark Wielaard c088b4
index de09d3a..234d68e 100644
Mark Wielaard c088b4
--- a/VEX/priv/guest_x86_toIR.c
Mark Wielaard c088b4
+++ b/VEX/priv/guest_x86_toIR.c
Mark Wielaard c088b4
@@ -1409,6 +1409,7 @@ const HChar* sorbTxt ( UChar sorb )
Mark Wielaard c088b4
       case 0x26: return "%es:";
Mark Wielaard c088b4
       case 0x64: return "%fs:";
Mark Wielaard c088b4
       case 0x65: return "%gs:";
Mark Wielaard c088b4
+      case 0x36: return "%ss:";
Mark Wielaard c088b4
       default: vpanic("sorbTxt(x86,guest)");
Mark Wielaard c088b4
    }
Mark Wielaard c088b4
 }
Mark Wielaard c088b4
@@ -1433,6 +1434,7 @@ IRExpr* handleSegOverride ( UChar sorb, IRExpr* virtual )
Mark Wielaard c088b4
       case 0x26: sreg = R_ES; break;
Mark Wielaard c088b4
       case 0x64: sreg = R_FS; break;
Mark Wielaard c088b4
       case 0x65: sreg = R_GS; break;
Mark Wielaard c088b4
+      case 0x36: sreg = R_SS; break;
Mark Wielaard c088b4
       default: vpanic("handleSegOverride(x86,guest)");
Mark Wielaard c088b4
    }
Mark Wielaard c088b4
 
Mark Wielaard c088b4
@@ -8101,7 +8103,7 @@ DisResult disInstr_X86_WRK (
Mark Wielaard c088b4
    Int sz = 4;
Mark Wielaard c088b4
 
Mark Wielaard c088b4
    /* sorb holds the segment-override-prefix byte, if any.  Zero if no
Mark Wielaard c088b4
-      prefix has been seen, else one of {0x26, 0x3E, 0x64, 0x65}
Mark Wielaard c088b4
+      prefix has been seen, else one of {0x26, 0x36, 0x3E, 0x64, 0x65}
Mark Wielaard c088b4
       indicating the prefix.  */
Mark Wielaard c088b4
    UChar sorb = 0;
Mark Wielaard c088b4
 
Mark Wielaard c088b4
@@ -8255,6 +8257,7 @@ DisResult disInstr_X86_WRK (
Mark Wielaard c088b4
          case 0x26: /* %ES: */
Mark Wielaard c088b4
          case 0x64: /* %FS: */
Mark Wielaard c088b4
          case 0x65: /* %GS: */
Mark Wielaard c088b4
+         case 0x36: /* %SS: */
Mark Wielaard c088b4
             if (sorb != 0) 
Mark Wielaard c088b4
                goto decode_failure; /* only one seg override allowed */
Mark Wielaard c088b4
             sorb = pre;
Mark Wielaard c088b4
@@ -8274,9 +8277,6 @@ DisResult disInstr_X86_WRK (
Mark Wielaard c088b4
             }
Mark Wielaard c088b4
             break;
Mark Wielaard c088b4
          }
Mark Wielaard c088b4
-         case 0x36: /* %SS: */
Mark Wielaard c088b4
-            /* SS override cases are not handled */
Mark Wielaard c088b4
-            goto decode_failure;
Mark Wielaard c088b4
          default: 
Mark Wielaard c088b4
             goto not_a_prefix;
Mark Wielaard c088b4
       }