/* 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_ppc64.h"

static struct reg regs[] = {
  { "r0", 0, 64 },
  { "r1", 64, 64 },
  { "r2", 128, 64 },
  { "r3", 192, 64 },
  { "r4", 256, 64 },
  { "r5", 320, 64 },
  { "r6", 384, 64 },
  { "r7", 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 },
  { "r16", 1024, 64 },
  { "r17", 1088, 64 },
  { "r18", 1152, 64 },
  { "r19", 1216, 64 },
  { "r20", 1280, 64 },
  { "r21", 1344, 64 },
  { "r22", 1408, 64 },
  { "r23", 1472, 64 },
  { "r24", 1536, 64 },
  { "r25", 1600, 64 },
  { "r26", 1664, 64 },
  { "r27", 1728, 64 },
  { "r28", 1792, 64 },
  { "r29", 1856, 64 },
  { "r30", 1920, 64 },
  { "r31", 1984, 64 },
  { "f0", 2048, 64 },
  { "f1", 2112, 64 },
  { "f2", 2176, 64 },
  { "f3", 2240, 64 },
  { "f4", 2304, 64 },
  { "f5", 2368, 64 },
  { "f6", 2432, 64 },
  { "f7", 2496, 64 },
  { "f8", 2560, 64 },
  { "f9", 2624, 64 },
  { "f10", 2688, 64 },
  { "f11", 2752, 64 },
  { "f12", 2816, 64 },
  { "f13", 2880, 64 },
  { "f14", 2944, 64 },
  { "f15", 3008, 64 },
  { "f16", 3072, 64 },
  { "f17", 3136, 64 },
  { "f18", 3200, 64 },
  { "f19", 3264, 64 },
  { "f20", 3328, 64 },
  { "f21", 3392, 64 },
  { "f22", 3456, 64 },
  { "f23", 3520, 64 },
  { "f24", 3584, 64 },
  { "f25", 3648, 64 },
  { "f26", 3712, 64 },
  { "f27", 3776, 64 },
  { "f28", 3840, 64 },
  { "f29", 3904, 64 },
  { "f30", 3968, 64 },
  { "f31", 4032, 64 },
  { "pc", 4096, 64 },
  { "msr", 4160, 64 },
  { "cr", 4224, 32 },
  { "lr", 4256, 64 },
  { "ctr", 4320, 64 },
  { "xer", 4384, 32 },
  { "fpscr", 4416, 32 },
  { "orig_r3", 4448, 64 },
  { "trap", 4512, 64 },
  { "vr0", 4576, 128 },
  { "vr1", 4704, 128 },
  { "vr2", 4832, 128 },
  { "vr3", 4960, 128 },
  { "vr4", 5088, 128 },
  { "vr5", 5216, 128 },
  { "vr6", 5344, 128 },
  { "vr7", 5472, 128 },
  { "vr8", 5600, 128 },
  { "vr9", 5728, 128 },
  { "vr10", 5856, 128 },
  { "vr11", 5984, 128 },
  { "vr12", 6112, 128 },
  { "vr13", 6240, 128 },
  { "vr14", 6368, 128 },
  { "vr15", 6496, 128 },
  { "vr16", 6624, 128 },
  { "vr17", 6752, 128 },
  { "vr18", 6880, 128 },
  { "vr19", 7008, 128 },
  { "vr20", 7136, 128 },
  { "vr21", 7264, 128 },
  { "vr22", 7392, 128 },
  { "vr23", 7520, 128 },
  { "vr24", 7648, 128 },
  { "vr25", 7776, 128 },
  { "vr26", 7904, 128 },
  { "vr27", 8032, 128 },
  { "vr28", 8160, 128 },
  { "vr29", 8288, 128 },
  { "vr30", 8416, 128 },
  { "vr31", 8544, 128 },
  { "vscr", 8672, 32 },
  { "vrsave", 8704, 32 },
};
static const char *expedite_regs[] = { "r1", "pc", 0 };
#define num_regs (sizeof (regs) / sizeof (regs[0]))

static
CORE_ADDR get_pc (void)
{
   unsigned long pc;

   collect_register_by_name ("pc", &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 ("pc", &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 / num_regs;
   int regno = abs_regno % num_regs;
   *mod = False;

   VexGuestPPC64State* ppc64 = (VexGuestPPC64State*) 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) (&ppc64->guest_GPR0,  buf, dir, size, mod); break;
   case 1:  VG_(transfer) (&ppc64->guest_GPR1,  buf, dir, size, mod); break;
   case 2:  VG_(transfer) (&ppc64->guest_GPR2,  buf, dir, size, mod); break;
   case 3:  VG_(transfer) (&ppc64->guest_GPR3,  buf, dir, size, mod); break;
   case 4:  VG_(transfer) (&ppc64->guest_GPR4,  buf, dir, size, mod); break;
   case 5:  VG_(transfer) (&ppc64->guest_GPR5,  buf, dir, size, mod); break;
   case 6:  VG_(transfer) (&ppc64->guest_GPR6,  buf, dir, size, mod); break;
   case 7:  VG_(transfer) (&ppc64->guest_GPR7,  buf, dir, size, mod); break;
   case 8:  VG_(transfer) (&ppc64->guest_GPR8,  buf, dir, size, mod); break;
   case 9:  VG_(transfer) (&ppc64->guest_GPR9,  buf, dir, size, mod); break;
   case 10: VG_(transfer) (&ppc64->guest_GPR10, buf, dir, size, mod); break;
   case 11: VG_(transfer) (&ppc64->guest_GPR11, buf, dir, size, mod); break;
   case 12: VG_(transfer) (&ppc64->guest_GPR12, buf, dir, size, mod); break;
   case 13: VG_(transfer) (&ppc64->guest_GPR13, buf, dir, size, mod); break;
   case 14: VG_(transfer) (&ppc64->guest_GPR14, buf, dir, size, mod); break;
   case 15: VG_(transfer) (&ppc64->guest_GPR15, buf, dir, size, mod); break;
   case 16: VG_(transfer) (&ppc64->guest_GPR16, buf, dir, size, mod); break;
   case 17: VG_(transfer) (&ppc64->guest_GPR17, buf, dir, size, mod); break;
   case 18: VG_(transfer) (&ppc64->guest_GPR18, buf, dir, size, mod); break;
   case 19: VG_(transfer) (&ppc64->guest_GPR19, buf, dir, size, mod); break;
   case 20: VG_(transfer) (&ppc64->guest_GPR20, buf, dir, size, mod); break;
   case 21: VG_(transfer) (&ppc64->guest_GPR21, buf, dir, size, mod); break;
   case 22: VG_(transfer) (&ppc64->guest_GPR22, buf, dir, size, mod); break;
   case 23: VG_(transfer) (&ppc64->guest_GPR23, buf, dir, size, mod); break;
   case 24: VG_(transfer) (&ppc64->guest_GPR24, buf, dir, size, mod); break;
   case 25: VG_(transfer) (&ppc64->guest_GPR25, buf, dir, size, mod); break;
   case 26: VG_(transfer) (&ppc64->guest_GPR26, buf, dir, size, mod); break;
   case 27: VG_(transfer) (&ppc64->guest_GPR27, buf, dir, size, mod); break;
   case 28: VG_(transfer) (&ppc64->guest_GPR28, buf, dir, size, mod); break;
   case 29: VG_(transfer) (&ppc64->guest_GPR29, buf, dir, size, mod); break;
   case 30: VG_(transfer) (&ppc64->guest_GPR30, buf, dir, size, mod); break;
   case 31: VG_(transfer) (&ppc64->guest_GPR31, buf, dir, size, mod); break;
   case 32: VG_(transfer) (&ppc64->guest_VSR0,  buf, dir, size, mod); break;
   case 33: VG_(transfer) (&ppc64->guest_VSR1,  buf, dir, size, mod); break;
   case 34: VG_(transfer) (&ppc64->guest_VSR2,  buf, dir, size, mod); break;
   case 35: VG_(transfer) (&ppc64->guest_VSR3,  buf, dir, size, mod); break;
   case 36: VG_(transfer) (&ppc64->guest_VSR4,  buf, dir, size, mod); break;
   case 37: VG_(transfer) (&ppc64->guest_VSR5,  buf, dir, size, mod); break;
   case 38: VG_(transfer) (&ppc64->guest_VSR6,  buf, dir, size, mod); break;
   case 39: VG_(transfer) (&ppc64->guest_VSR7,  buf, dir, size, mod); break;
   case 40: VG_(transfer) (&ppc64->guest_VSR8,  buf, dir, size, mod); break;
   case 41: VG_(transfer) (&ppc64->guest_VSR9,  buf, dir, size, mod); break;
   case 42: VG_(transfer) (&ppc64->guest_VSR10, buf, dir, size, mod); break;
   case 43: VG_(transfer) (&ppc64->guest_VSR11, buf, dir, size, mod); break;
   case 44: VG_(transfer) (&ppc64->guest_VSR12, buf, dir, size, mod); break;
   case 45: VG_(transfer) (&ppc64->guest_VSR13, buf, dir, size, mod); break;
   case 46: VG_(transfer) (&ppc64->guest_VSR14, buf, dir, size, mod); break;
   case 47: VG_(transfer) (&ppc64->guest_VSR15, buf, dir, size, mod); break;
   case 48: VG_(transfer) (&ppc64->guest_VSR16, buf, dir, size, mod); break;
   case 49: VG_(transfer) (&ppc64->guest_VSR17, buf, dir, size, mod); break;
   case 50: VG_(transfer) (&ppc64->guest_VSR18, buf, dir, size, mod); break;
   case 51: VG_(transfer) (&ppc64->guest_VSR19, buf, dir, size, mod); break;
   case 52: VG_(transfer) (&ppc64->guest_VSR20, buf, dir, size, mod); break;
   case 53: VG_(transfer) (&ppc64->guest_VSR21, buf, dir, size, mod); break;
   case 54: VG_(transfer) (&ppc64->guest_VSR22, buf, dir, size, mod); break;
   case 55: VG_(transfer) (&ppc64->guest_VSR23, buf, dir, size, mod); break;
   case 56: VG_(transfer) (&ppc64->guest_VSR24, buf, dir, size, mod); break;
   case 57: VG_(transfer) (&ppc64->guest_VSR25, buf, dir, size, mod); break;
   case 58: VG_(transfer) (&ppc64->guest_VSR26, buf, dir, size, mod); break;
   case 59: VG_(transfer) (&ppc64->guest_VSR27, buf, dir, size, mod); break;
   case 60: VG_(transfer) (&ppc64->guest_VSR28, buf, dir, size, mod); break;
   case 61: VG_(transfer) (&ppc64->guest_VSR29, buf, dir, size, mod); break;
   case 62: VG_(transfer) (&ppc64->guest_VSR30, buf, dir, size, mod); break;
   case 63: VG_(transfer) (&ppc64->guest_VSR31, buf, dir, size, mod); break;
   case 64: VG_(transfer) (&ppc64->guest_CIA,   buf, dir, size, mod); break;
   case 65: *mod = False; break; // VEX does not model Machine State Register
   case 66: {
      UInt cr = LibVEX_GuestPPC64_get_CR (ppc64);
      if (dir == valgrind_to_gdbserver) {
         VG_(transfer) (&cr, buf, dir, size, mod); 
      } else {
         UInt newcr;
         VG_(transfer) (&newcr, buf, dir, size, mod);
         *mod = newcr != cr;
         LibVEX_GuestPPC64_put_CR (newcr, ppc64);
      }
      break;
   }
   case 67: VG_(transfer) (&ppc64->guest_LR,    buf, dir, size, mod); break;
   case 68: VG_(transfer) (&ppc64->guest_CTR,   buf, dir, size, mod); break;
   case 69: {
      UInt xer = LibVEX_GuestPPC64_get_XER (ppc64);
      if (dir == valgrind_to_gdbserver) {
         VG_(transfer) (&xer, buf, dir, size, mod); 
      } else {
         UInt newxer;
         VG_(transfer) (&newxer, buf, dir, size, mod);
         *mod = newxer != xer;
         LibVEX_GuestPPC64_put_XER (newxer, ppc64);
      }
      break;
   }
   case 70:  VG_(transfer) (&ppc64->guest_FPROUND, buf, dir, size, mod); break;
   case 71:  *mod = False; break; // GDBTD???? VEX { "orig_r3", 4448, 64 },
   case 72:  *mod = False; break; // GDBTD???? VEX { "trap", 4512, 64 },
   case 73:  VG_(transfer) (&ppc64->guest_VSR32, buf, dir, size, mod); break;
   case 74:  VG_(transfer) (&ppc64->guest_VSR33, buf, dir, size, mod); break;
   case 75:  VG_(transfer) (&ppc64->guest_VSR34, buf, dir, size, mod); break;
   case 76:  VG_(transfer) (&ppc64->guest_VSR35, buf, dir, size, mod); break;
   case 77:  VG_(transfer) (&ppc64->guest_VSR36, buf, dir, size, mod); break;
   case 78:  VG_(transfer) (&ppc64->guest_VSR37, buf, dir, size, mod); break;
   case 79:  VG_(transfer) (&ppc64->guest_VSR38, buf, dir, size, mod); break;
   case 80:  VG_(transfer) (&ppc64->guest_VSR39, buf, dir, size, mod); break;
   case 81:  VG_(transfer) (&ppc64->guest_VSR40, buf, dir, size, mod); break;
   case 82:  VG_(transfer) (&ppc64->guest_VSR41, buf, dir, size, mod); break;
   case 83:  VG_(transfer) (&ppc64->guest_VSR42, buf, dir, size, mod); break;
   case 84:  VG_(transfer) (&ppc64->guest_VSR43, buf, dir, size, mod); break;
   case 85:  VG_(transfer) (&ppc64->guest_VSR44, buf, dir, size, mod); break;
   case 86:  VG_(transfer) (&ppc64->guest_VSR45, buf, dir, size, mod); break;
   case 87:  VG_(transfer) (&ppc64->guest_VSR46, buf, dir, size, mod); break;
   case 88:  VG_(transfer) (&ppc64->guest_VSR47, buf, dir, size, mod); break;
   case 89:  VG_(transfer) (&ppc64->guest_VSR48, buf, dir, size, mod); break;
   case 90:  VG_(transfer) (&ppc64->guest_VSR49, buf, dir, size, mod); break;
   case 91:  VG_(transfer) (&ppc64->guest_VSR50, buf, dir, size, mod); break;
   case 92:  VG_(transfer) (&ppc64->guest_VSR51, buf, dir, size, mod); break;
   case 93:  VG_(transfer) (&ppc64->guest_VSR52, buf, dir, size, mod); break;
   case 94:  VG_(transfer) (&ppc64->guest_VSR53, buf, dir, size, mod); break;
   case 95:  VG_(transfer) (&ppc64->guest_VSR54, buf, dir, size, mod); break;
   case 96:  VG_(transfer) (&ppc64->guest_VSR55, buf, dir, size, mod); break;
   case 97:  VG_(transfer) (&ppc64->guest_VSR56, buf, dir, size, mod); break;
   case 98:  VG_(transfer) (&ppc64->guest_VSR57, buf, dir, size, mod); break;
   case 99:  VG_(transfer) (&ppc64->guest_VSR58, buf, dir, size, mod); break;
   case 100: VG_(transfer) (&ppc64->guest_VSR59, buf, dir, size, mod); break;
   case 101: VG_(transfer) (&ppc64->guest_VSR60, buf, dir, size, mod); break;
   case 102: VG_(transfer) (&ppc64->guest_VSR61, buf, dir, size, mod); break;
   case 103: VG_(transfer) (&ppc64->guest_VSR62, buf, dir, size, mod); break;
   case 104: VG_(transfer) (&ppc64->guest_VSR63, buf, dir, size, mod); break;
   case 105: VG_(transfer) (&ppc64->guest_VSCR, buf, dir, size, mod); break;
   case 106: VG_(transfer) (&ppc64->guest_VRSAVE, buf, dir, size, mod); break;
   default: vg_assert(0);
   }
}

static
const char* target_xml (Bool shadow_mode)
{
   if (shadow_mode) {
      return "powerpc-altivec64l-valgrind.xml";
   } else {
      return "powerpc-altivec64l.xml";
   }  
}

static CORE_ADDR** target_get_dtv (ThreadState *tst)
{
   VexGuestPPC64State* ppc64 = (VexGuestPPC64State*)&tst->arch.vex;
   // ppc64 dtv is located just before the tcb, which is 0x7000 before 
   // the thread id (r13)
   return (CORE_ADDR**)((CORE_ADDR)ppc64->guest_GPR13 
                        - 0x7000 - sizeof(CORE_ADDR));
}

static struct valgrind_target_ops low_target = {
   num_regs,
   regs,
   1, //r1
   transfer_register,
   get_pc,
   set_pc,
   "ppc64",
   target_xml,
   target_get_dtv
};

void ppc64_init_architecture (struct valgrind_target_ops *target)
{
   *target = low_target;
   set_register_cache (regs, num_regs);
   gdbserver_expedite_regs = expedite_regs;
}
