Fix 197259  Unsupported arch_prtctl PR_SET_GS option
(valgrind side).
In summary: we were counting somewhat on the luck for FS,
we now similarly count on luch for GS
See VEX commit log r3043 for more details.



git-svn-id: svn://svn.valgrind.org/valgrind/trunk@14815 a5019735-40e9-0310-863c-91ae7b9d1cf9
diff --git a/NEWS b/NEWS
index 7ac55fc..3ea2c08 100644
--- a/NEWS
+++ b/NEWS
@@ -41,6 +41,7 @@
 
 116002  VG_(printf): Problems with justification of strings and integers
 155125  avoid cutting away file:lineno after long function name
+197259  Unsupported arch_prtctl PR_SET_GS option
 211926  Avoid compilation warnings in valgrind.h with -pedantic
 226609  Crediting upstream authors in man page
 269360  s390x: Fix addressing mode selection for compare-and-swap
diff --git a/coregrind/m_gdbserver/valgrind-low-amd64.c b/coregrind/m_gdbserver/valgrind-low-amd64.c
index 36f3b5d..630a3b0 100644
--- a/coregrind/m_gdbserver/valgrind-low-amd64.c
+++ b/coregrind/m_gdbserver/valgrind-low-amd64.c
@@ -198,7 +198,7 @@
    case 20: *mod = False; break; //GDBTD VG_(transfer) (&amd64->guest_DS, buf, dir, size, mod);
    case 21: *mod = False; break; //GDBTD VG_(transfer) (&amd64->guest_ES, buf, dir, size, mod);
    case 22: *mod = False; break; //GDBTD VG_(transfer) (&amd64->guest_FS, buf, dir, size, mod);
-   case 23: VG_(transfer) (&amd64->guest_GS_0x60, buf, dir, size, mod); break;
+   case 23: VG_(transfer) (&amd64->guest_GS_CONST, buf, dir, size, mod); break;
    case 24:
    case 25:
    case 26:
@@ -349,7 +349,7 @@
 static CORE_ADDR** target_get_dtv (ThreadState *tst)
 {
    VexGuestAMD64State* amd64 = (VexGuestAMD64State*)&tst->arch.vex;
-   return (CORE_ADDR**)((CORE_ADDR)amd64->guest_FS_ZERO + 0x8);
+   return (CORE_ADDR**)((CORE_ADDR)amd64->guest_FS_CONST + 0x8);
 }
 
 static struct valgrind_target_ops low_target = {
diff --git a/coregrind/m_syswrap/syswrap-amd64-linux.c b/coregrind/m_syswrap/syswrap-amd64-linux.c
index 364a8bb..ae696b1 100644
--- a/coregrind/m_syswrap/syswrap-amd64-linux.c
+++ b/coregrind/m_syswrap/syswrap-amd64-linux.c
@@ -275,7 +275,7 @@
    if (flags & VKI_CLONE_SETTLS) {
       if (debug)
 	 VG_(printf)("clone child has SETTLS: tls at %#lx\n", tlsaddr);
-      ctst->arch.vex.guest_FS_ZERO = tlsaddr;
+      ctst->arch.vex.guest_FS_CONST = tlsaddr;
    }
 
    flags &= ~VKI_CLONE_SETTLS;
@@ -506,21 +506,31 @@
    /* "do" the syscall ourselves; the kernel never sees it */
    if (ARG1 == VKI_ARCH_SET_FS) {
       tst = VG_(get_ThreadState)(tid);
-      tst->arch.vex.guest_FS_ZERO = ARG2;
+      tst->arch.vex.guest_FS_CONST = ARG2;
    }
    else if (ARG1 == VKI_ARCH_GET_FS) {
       PRE_MEM_WRITE("arch_prctl(addr)", ARG2, sizeof(unsigned long));
       tst = VG_(get_ThreadState)(tid);
-      *(unsigned long *)ARG2 = tst->arch.vex.guest_FS_ZERO;
+      *(unsigned long *)ARG2 = tst->arch.vex.guest_FS_CONST;
+      POST_MEM_WRITE(ARG2, sizeof(unsigned long));
+   }
+   else if (ARG1 == VKI_ARCH_SET_GS) {
+      tst = VG_(get_ThreadState)(tid);
+      tst->arch.vex.guest_GS_CONST = ARG2;
+   }
+   else if (ARG1 == VKI_ARCH_GET_GS) {
+      PRE_MEM_WRITE("arch_prctl(addr)", ARG2, sizeof(unsigned long));
+      tst = VG_(get_ThreadState)(tid);
+      *(unsigned long *)ARG2 = tst->arch.vex.guest_GS_CONST;
       POST_MEM_WRITE(ARG2, sizeof(unsigned long));
    }
    else {
-      VG_(core_panic)("Unsupported arch_prtctl option");
+      VG_(core_panic)("Unsupported arch_prctl option");
    }
 
    /* Note; the Status writeback to guest state that happens after
-      this wrapper returns does not change guest_FS_ZERO; hence that
-      direct assignment to the guest state is safe here. */
+      this wrapper returns does not change guest_FS_CONST or guest_GS_CONST;
+      hence that direct assignment to the guest state is safe here. */
    SET_STATUS_Success( 0 );
 }
 
diff --git a/coregrind/m_syswrap/syswrap-darwin.c b/coregrind/m_syswrap/syswrap-darwin.c
index 9249e4f..25b5275 100644
--- a/coregrind/m_syswrap/syswrap-darwin.c
+++ b/coregrind/m_syswrap/syswrap-darwin.c
@@ -8636,7 +8636,7 @@
    {
       ThreadState *tst = VG_(get_ThreadState)(tid);
       tst->os_state.pthread = ARG1;
-      tst->arch.vex.guest_GS_0x60 = ARG1;
+      tst->arch.vex.guest_GS_CONST = ARG1;
       // SET_STATUS_Success(0x60);
       // see comments on x86 case just above
       SET_STATUS_from_SysRes(
diff --git a/coregrind/m_translate.c b/coregrind/m_translate.c
index 816b5f2..2251138 100644
--- a/coregrind/m_translate.c
+++ b/coregrind/m_translate.c
@@ -1585,10 +1585,11 @@
    vex_abiinfo.guest_stack_redzone_size = VG_STACK_REDZONE_SZB;
 
 #  if defined(VGP_amd64_linux)
-   vex_abiinfo.guest_amd64_assume_fs_is_zero  = True;
+   vex_abiinfo.guest_amd64_assume_fs_is_const = True;
+   vex_abiinfo.guest_amd64_assume_gs_is_const = True;
 #  endif
 #  if defined(VGP_amd64_darwin)
-   vex_abiinfo.guest_amd64_assume_gs_is_0x60  = True;
+   vex_abiinfo.guest_amd64_assume_gs_is_const = True;
 #  endif
 #  if defined(VGP_ppc32_linux)
    vex_abiinfo.guest_ppc_zap_RZ_at_blr        = False;
diff --git a/memcheck/mc_machine.c b/memcheck/mc_machine.c
index 7328357..429ff4f 100644
--- a/memcheck/mc_machine.c
+++ b/memcheck/mc_machine.c
@@ -564,8 +564,8 @@
    if (o == GOF(IP_AT_SYSCALL) && sz == 8) return -1; /* slot unused */
    if (o == GOF(IDFLAG)  && sz == 8) return -1; /* slot used for %DH */
    if (o == GOF(ACFLAG)  && sz == 8) return -1; /* slot unused */
-   if (o == GOF(FS_ZERO) && sz == 8) return -1; /* slot unused */
-   if (o == GOF(GS_0x60) && sz == 8) return -1; /* slot unused */
+   if (o == GOF(FS_CONST) && sz == 8) return -1; /* slot unused */
+   if (o == GOF(GS_CONST) && sz == 8) return -1; /* slot unused */
    if (o == GOF(CMSTART) && sz == 8) return -1; /* slot unused */
    if (o == GOF(CMLEN)   && sz == 8) return -1; /* slot unused */
    if (o == GOF(NRADDR)  && sz == 8) return -1; /* slot unused */