/* Low level interface to valgrind, for the remote server for GDB integrated
   in valgrind.
   Copyright (C) 2011
   Free Software Foundation, Inc.

   This file is part of VALGRIND.
   It has been inspired from a file from gdbserver in gdb 6.6.

   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 2 of the License, or
   (at your option) any later version.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program; if not, write to the Free Software
   Foundation, Inc., 51 Franklin Street, Fifth Floor,
   Boston, MA 02110-1301, USA.  */

#include "server.h"
#include "target.h"
#include "regdef.h"
#include "regcache.h"

#include "pub_core_machine.h"
#include "pub_core_threadstate.h"
#include "pub_core_transtab.h"
#include "pub_core_gdbserver.h" 

#include "valgrind_low.h"

#include "libvex_guest_amd64.h"
/* GDBTD: ??? have a cleaner way to get the f80 <> f64 conversion functions */
/* below include needed for conversion f80 <> f64 */
#include "../../VEX/priv/guest_generic_x87.h" 

/* below loosely inspired from file generated with gdb regdat.sh */

static struct reg regs[] = {
  { "rax", 0, 64 },
  { "rbx", 64, 64 },
  { "rcx", 128, 64 },
  { "rdx", 192, 64 },
  { "rsi", 256, 64 },
  { "rdi", 320, 64 },
  { "rbp", 384, 64 },
  { "rsp", 448, 64 },
  { "r8", 512, 64 },
  { "r9", 576, 64 },
  { "r10", 640, 64 },
  { "r11", 704, 64 },
  { "r12", 768, 64 },
  { "r13", 832, 64 },
  { "r14", 896, 64 },
  { "r15", 960, 64 },
  { "rip", 1024, 64 },
  { "eflags", 1088, 32 },
  { "cs", 1120, 32 },
  { "ss", 1152, 32 },
  { "ds", 1184, 32 },
  { "es", 1216, 32 },
  { "fs", 1248, 32 },
  { "gs", 1280, 32 },
  { "st0", 1312, 80 },
  { "st1", 1392, 80 },
  { "st2", 1472, 80 },
  { "st3", 1552, 80 },
  { "st4", 1632, 80 },
  { "st5", 1712, 80 },
  { "st6", 1792, 80 },
  { "st7", 1872, 80 },
  { "fctrl", 1952, 32 },
  { "fstat", 1984, 32 },
  { "ftag", 2016, 32 },
  { "fiseg", 2048, 32 },
  { "fioff", 2080, 32 },
  { "foseg", 2112, 32 },
  { "fooff", 2144, 32 },
  { "fop", 2176, 32 },
  { "xmm0", 2208, 128 },
  { "xmm1", 2336, 128 },
  { "xmm2", 2464, 128 },
  { "xmm3", 2592, 128 },
  { "xmm4", 2720, 128 },
  { "xmm5", 2848, 128 },
  { "xmm6", 2976, 128 },
  { "xmm7", 3104, 128 },
  { "xmm8", 3232, 128 },
  { "xmm9", 3360, 128 },
  { "xmm10", 3488, 128 },
  { "xmm11", 3616, 128 },
  { "xmm12", 3744, 128 },
  { "xmm13", 3872, 128 },
  { "xmm14", 4000, 128 },
  { "xmm15", 4128, 128 },
  { "mxcsr", 4256, 32  },
#if defined(VGO_linux)
  { "orig_rax", 4288, 64 },
#endif
  { "ymm0h", 4352, 128 }, // The ymm?h registers only to be given to GDB
  { "ymm1h", 4480, 128 }, // if Valgrind is running with AVX instructions.
  { "ymm2h", 4608, 128 },
  { "ymm3h", 4736, 128 },
  { "ymm4h", 4864, 128 },
  { "ymm5h", 4992, 128 },
  { "ymm6h", 5120, 128 },
  { "ymm7h", 5248, 128 },
  { "ymm8h", 5376, 128 },
  { "ymm9h", 5504, 128 },
  { "ymm10h", 5632, 128 },
  { "ymm11h", 5760, 128 },
  { "ymm12h", 5888, 128 },
  { "ymm13h", 6016, 128 },
  { "ymm14h", 6144, 128 },
  { "ymm15h", 6272, 128 }
};
static const char *expedite_regs[] = { "rbp", "rsp", "rip", 0 };
#define max_num_regs (sizeof (regs) / sizeof (regs[0]))
static int dyn_num_regs; // if no AVX, we have to give less registers to gdb.


static
CORE_ADDR get_pc (void)
{
   unsigned long pc;

   collect_register_by_name ("rip", &pc);
   
   dlog(1, "stop pc is %p\n", (void *) pc);
   return pc;
}

static
void set_pc (CORE_ADDR newpc)
{
   Bool mod;
   supply_register_by_name ("rip", &newpc, &mod);
   if (mod)
      dlog(1, "set pc to %p\n", C2v (newpc));
   else
      dlog(1, "set pc not changed %p\n", C2v (newpc));
}

/* store registers in the guest state (gdbserver_to_valgrind)
   or fetch register from the guest state (valgrind_to_gdbserver). */
static
void transfer_register (ThreadId tid, int abs_regno, void * buf,
                        transfer_direction dir, int size, Bool *mod)
{
   ThreadState* tst = VG_(get_ThreadState)(tid);
   int set = abs_regno / dyn_num_regs;
   int regno = abs_regno % dyn_num_regs;
   *mod = False;

   VexGuestAMD64State* amd64 = (VexGuestAMD64State*) get_arch (set, tst);

   switch (regno) { 
   // numbers here have to match the order of regs above.
   // Attention: gdb order does not match valgrind order.
   case 0:  VG_(transfer) (&amd64->guest_RAX, buf, dir, size, mod); break;
   case 1:  VG_(transfer) (&amd64->guest_RBX, buf, dir, size, mod); break;
   case 2:  VG_(transfer) (&amd64->guest_RCX, buf, dir, size, mod); break;
   case 3:  VG_(transfer) (&amd64->guest_RDX, buf, dir, size, mod); break;
   case 4:  VG_(transfer) (&amd64->guest_RSI, buf, dir, size, mod); break;
   case 5:  VG_(transfer) (&amd64->guest_RDI, buf, dir, size, mod); break;
   case 6:  VG_(transfer) (&amd64->guest_RBP, buf, dir, size, mod); break;
   case 7:  VG_(transfer) (&amd64->guest_RSP, buf, dir, size, mod); break;
   case 8:  VG_(transfer) (&amd64->guest_R8,  buf, dir, size, mod); break;
   case 9:  VG_(transfer) (&amd64->guest_R9,  buf, dir, size, mod); break;
   case 10: VG_(transfer) (&amd64->guest_R10, buf, dir, size, mod); break;
   case 11: VG_(transfer) (&amd64->guest_R11, buf, dir, size, mod); break;
   case 12: VG_(transfer) (&amd64->guest_R12, buf, dir, size, mod); break;
   case 13: VG_(transfer) (&amd64->guest_R13, buf, dir, size, mod); break;
   case 14: VG_(transfer) (&amd64->guest_R14, buf, dir, size, mod); break;
   case 15: VG_(transfer) (&amd64->guest_R15, buf, dir, size, mod); break;
   case 16: VG_(transfer) (&amd64->guest_RIP, buf, dir, size, mod); break;
   case 17: 
      if (dir == valgrind_to_gdbserver) {
         ULong rflags;
         /* we can only retrieve the real flags (set 0)
            retrieving shadow flags is not ok */
         if (set == 0)
            rflags = LibVEX_GuestAMD64_get_rflags (amd64);
         else
            rflags = 0;
         VG_(transfer) (&rflags, buf, dir, size, mod); 
      } else {
         *mod = False; //GDBTD? how do we store rflags in libvex_guest_amd64.h ???
      }
      break; 
   case 18: *mod = False; break; //GDBTD VG_(transfer) (&amd64->guest_CS, buf, dir, size, mod);
   case 19: *mod = False; break; //GDBTD VG_(transfer) (&amd64->guest_SS, buf, dir, size, mod);
   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_CONST, buf, dir, size, mod); break;
   case 24:
   case 25:
   case 26:
   case 27: /* register 24 to 31 are float registers 80 bits but 64 bits in valgrind */
   case 28:
   case 29:
   case 30:
   case 31: 
      if (dir == valgrind_to_gdbserver) {
         UChar fpreg80[10];
         convert_f64le_to_f80le ((UChar *)&amd64->guest_FPREG[regno-24],
                                 fpreg80);
         VG_(transfer) (&fpreg80, buf, dir, sizeof(fpreg80), mod);
      } else {
         ULong fpreg64;
         convert_f80le_to_f64le (buf, (UChar *)&fpreg64); 
         VG_(transfer) (&amd64->guest_FPREG[regno-24], &fpreg64,
                        dir, sizeof(fpreg64), mod);
      }
      break;
   case 32: 
      if (dir == valgrind_to_gdbserver) {
         // vex only models the rounding bits (see libvex_guest_amd64.h)
         UWord value = 0x037f;
         value |= amd64->guest_FPROUND << 10;
         VG_(transfer)(&value, buf, dir, size, mod);
      } else {
         *mod = False; // GDBTD???? VEX equivalent fcrtl
      }
      break;
   case 33: 
      if (dir == valgrind_to_gdbserver) {
         UWord value = amd64->guest_FC3210;
         value |= (amd64->guest_FTOP & 7) << 11;
         VG_(transfer)(&value, buf, dir, size, mod); 
      } else {
         *mod = False; // GDBTD???? VEX equivalent fstat
      }
      break;
   case 34: 
      if (dir == valgrind_to_gdbserver) {
         // vex doesn't model these precisely
         UWord value = 
            ((amd64->guest_FPTAG[0] ? 0 : 3) << 0)  | 
            ((amd64->guest_FPTAG[1] ? 0 : 3) << 2)  | 
            ((amd64->guest_FPTAG[2] ? 0 : 3) << 4)  | 
            ((amd64->guest_FPTAG[3] ? 0 : 3) << 6)  | 
            ((amd64->guest_FPTAG[4] ? 0 : 3) << 8)  | 
            ((amd64->guest_FPTAG[5] ? 0 : 3) << 10) | 
            ((amd64->guest_FPTAG[6] ? 0 : 3) << 12) | 
            ((amd64->guest_FPTAG[7] ? 0 : 3) << 14);
         VG_(transfer)(&value, buf, dir, size, mod); 
      } else {
         *mod = False; // GDBTD???? VEX equivalent ftag
      }
      break;
   case 35: *mod = False; break; // GDBTD ??? equivalent of fiseg
   case 36: *mod = False; break; // GDBTD ??? equivalent of fioff
   case 37: *mod = False; break; // GDBTD ??? equivalent of foseg
   case 38: *mod = False; break; // GDBTD ??? equivalent of fooff
   case 39: *mod = False; break; // GDBTD ??? equivalent of fop
   case 40: VG_(transfer) (&amd64->guest_YMM0[0],  buf, dir, size, mod); break;
   case 41: VG_(transfer) (&amd64->guest_YMM1[0],  buf, dir, size, mod); break;
   case 42: VG_(transfer) (&amd64->guest_YMM2[0],  buf, dir, size, mod); break;
   case 43: VG_(transfer) (&amd64->guest_YMM3[0],  buf, dir, size, mod); break;
   case 44: VG_(transfer) (&amd64->guest_YMM4[0],  buf, dir, size, mod); break;
   case 45: VG_(transfer) (&amd64->guest_YMM5[0],  buf, dir, size, mod); break;
   case 46: VG_(transfer) (&amd64->guest_YMM6[0],  buf, dir, size, mod); break;
   case 47: VG_(transfer) (&amd64->guest_YMM7[0],  buf, dir, size, mod); break;
   case 48: VG_(transfer) (&amd64->guest_YMM8[0],  buf, dir, size, mod); break;
   case 49: VG_(transfer) (&amd64->guest_YMM9[0],  buf, dir, size, mod); break;
   case 50: VG_(transfer) (&amd64->guest_YMM10[0], buf, dir, size, mod); break;
   case 51: VG_(transfer) (&amd64->guest_YMM11[0], buf, dir, size, mod); break;
   case 52: VG_(transfer) (&amd64->guest_YMM12[0], buf, dir, size, mod); break;
   case 53: VG_(transfer) (&amd64->guest_YMM13[0], buf, dir, size, mod); break;
   case 54: VG_(transfer) (&amd64->guest_YMM14[0], buf, dir, size, mod); break;
   case 55: VG_(transfer) (&amd64->guest_YMM15[0], buf, dir, size, mod); break;
   case 56: 
      if (dir == valgrind_to_gdbserver) {
         // vex only models the rounding bits (see libvex_guest_x86.h)
         UWord value = 0x1f80;
         value |= amd64->guest_SSEROUND << 13;
         VG_(transfer)(&value, buf, dir, size, mod); 
      } else {
         *mod = False;  // GDBTD???? VEX equivalent mxcsr
      }
      break;
   case 57: *mod = False; break; // GDBTD???? VEX equivalent { "orig_rax"},
   case 58: VG_(transfer) (&amd64->guest_YMM0[4],  buf, dir, size, mod); break;
   case 59: VG_(transfer) (&amd64->guest_YMM1[4],  buf, dir, size, mod); break;
   case 60: VG_(transfer) (&amd64->guest_YMM2[4],  buf, dir, size, mod); break;
   case 61: VG_(transfer) (&amd64->guest_YMM3[4],  buf, dir, size, mod); break;
   case 62: VG_(transfer) (&amd64->guest_YMM4[4],  buf, dir, size, mod); break;
   case 63: VG_(transfer) (&amd64->guest_YMM5[4],  buf, dir, size, mod); break;
   case 64: VG_(transfer) (&amd64->guest_YMM6[4],  buf, dir, size, mod); break;
   case 65: VG_(transfer) (&amd64->guest_YMM7[4],  buf, dir, size, mod); break;
   case 66: VG_(transfer) (&amd64->guest_YMM8[4],  buf, dir, size, mod); break;
   case 67: VG_(transfer) (&amd64->guest_YMM9[4],  buf, dir, size, mod); break;
   case 68: VG_(transfer) (&amd64->guest_YMM10[4], buf, dir, size, mod); break;
   case 69: VG_(transfer) (&amd64->guest_YMM11[4], buf, dir, size, mod); break;
   case 70: VG_(transfer) (&amd64->guest_YMM12[4], buf, dir, size, mod); break;
   case 71: VG_(transfer) (&amd64->guest_YMM13[4], buf, dir, size, mod); break;
   case 72: VG_(transfer) (&amd64->guest_YMM14[4], buf, dir, size, mod); break;
   case 73: VG_(transfer) (&amd64->guest_YMM15[4], buf, dir, size, mod); break;
   default: vg_assert(0);
   }
}

static
Bool have_avx(void)
{
   VexArch va;
   VexArchInfo vai;
   VG_(machine_get_VexArchInfo) (&va, &vai);
   return (vai.hwcaps & VEX_HWCAPS_AMD64_AVX ? True : False);
}

static
const char* target_xml (Bool shadow_mode)
{
   if (shadow_mode) {
#if defined(VGO_linux)
      if (have_avx())
         return "amd64-avx-linux-valgrind.xml";
      else
         return "amd64-linux-valgrind.xml";
#else
      if (have_avx())
         return "amd64-avx-coresse-valgrind.xml";
      else
         return "amd64-coresse-valgrind.xml";
#endif
   } else {
#if defined(VGO_linux)
      if (have_avx())
         return "amd64-avx-linux.xml";
      else
         return NULL;
#else
      if (have_avx())
         return "amd64-avx-coresse.xml";
      else
         return NULL;
#endif
   }  
}

static CORE_ADDR** target_get_dtv (ThreadState *tst)
{
   VexGuestAMD64State* amd64 = (VexGuestAMD64State*)&tst->arch.vex;
   return (CORE_ADDR**)((CORE_ADDR)amd64->guest_FS_CONST + 0x8);
}

static struct valgrind_target_ops low_target = {
   -1, // Must be computed at init time.
   regs,
   7, //RSP
   transfer_register,
   get_pc,
   set_pc,
   "amd64",
   target_xml,
   target_get_dtv
};

void amd64_init_architecture (struct valgrind_target_ops *target)
{
   *target = low_target;
   if (have_avx())
      dyn_num_regs = max_num_regs;
   else
      dyn_num_regs = max_num_regs - 16; // remove the AVX "high" registers.
   target->num_regs = dyn_num_regs;
   set_register_cache (regs, dyn_num_regs);
   gdbserver_expedite_regs = expedite_regs;
}
