// There is no verification on the validity of the ID.
uint64 PINContextHandler::getFlagValue(uint64 TritFlagID) const
{
  uint64 rflags;
  REG reg = safecast(PINConverter::convertTritonReg2DBIReg(ID_RFLAGS));

  if (!REG_valid(reg))
    throw std::runtime_error("Error: getFlagValue() - Invalid PIN register id.");

  rflags = PIN_GetContextReg(this->_ctx, reg);

  switch (TritFlagID){
    case ID_AF: return (rflags >> 4) & 1;
    case ID_CF: return (rflags & 1);
    case ID_DF: return (rflags >> 10) & 1;
    case ID_IF: return (rflags >> 9) & 1;
    case ID_OF: return (rflags >> 11) & 1;
    case ID_PF: return (rflags >> 2) & 1;
    case ID_SF: return (rflags >> 7) & 1;
    case ID_TF: return (rflags >> 8) & 1;
    case ID_ZF: return (rflags >> 6) & 1;
    default:
      throw std::runtime_error("Error: getFlagValue() - Invalid Flag id.");
  }
  return 0;
}
Beispiel #2
0
void F77_FUNC(mpix_comm_update,MPIX_COMM_UPDATE)(MPI_Fint * comm, MPI_Fint * optimize, MPI_Fint * ierr)
{
    MPI_Comm mycomm = MPI_Comm_f2c(*comm);
    int myoptimize = -1;
    safecast(*optimize, &myoptimize);
    *ierr = (MPI_Fint)MPIX_Comm_update(mycomm, myoptimize);
    return;
}
// There is no verification on the validity of the ID.
uint64 PINContextHandler::getRegisterValue(uint64 TritRegID) const
{
  REG reg = safecast(PINConverter::convertTritonReg2DBIReg(TritRegID));

  if (!REG_valid(reg) || (TritRegID >= ID_XMM0 && TritRegID <= ID_XMM15))
    throw std::runtime_error("Error: getRegisterValue() - Invalid PIN register id.");

  return PIN_GetContextReg(this->_ctx, reg);
}
Beispiel #4
0
void F77_FUNC(mpix_comm_rank2global,MPIX_COMM_RANK2GLOBAL)(MPI_Fint * comm, MPI_Fint * crank, MPI_Fint * grank, MPI_Fint * ierr)
{
    MPI_Comm mycomm = MPI_Comm_f2c(*comm);
    int mycrank = -1, mygrank = -1;
    safecast(*crank, &mycrank);
    *ierr = (MPI_Fint)MPIX_Comm_rank2global(mycomm, mycrank, &mygrank);
    *grank = (MPI_Fint)mygrank;
    return;
}
// There is no verification on the validity of the ID.
void PINContextHandler::setRegisterValue(uint64 TritRegID, uint64 value) const
{
  REG reg = safecast(PINConverter::convertTritonReg2DBIReg(TritRegID));

  if (!REG_valid(reg) || (TritRegID >= ID_XMM0 && TritRegID <= ID_XMM15))
    throw std::runtime_error("Error: setRegisterValue() - Invalid PIN register id.");

  PIN_SetContextReg(this->_ctx, reg, value);
  PIN_ExecuteAt(this->_ctx);
}
// There is no verification on the validity of the ID.
uint128 PINContextHandler::getSSERegisterValue(uint64 TritRegID) const
{
  REG reg                 = safecast(PINConverter::convertTritonReg2DBIReg(TritRegID));
  uint128 value       = 0;
  PIN_REGISTER tmp;

  if (!REG_valid(reg) || !(TritRegID >= ID_XMM0 && TritRegID <= ID_XMM15))
    throw std::runtime_error("Error: getSSERegisterValue() - Invalid PIN register id.");

  PIN_GetContextRegval(this->_ctx, reg, reinterpret_cast<uint8 *>(&tmp));

  value = *reinterpret_cast<uint128*>(&tmp);

  return value;
}
// There is no verification on the validity of the ID.
void PINContextHandler::setSSERegisterValue(uint64 TritRegID, uint128 value) const
{
  REG reg = safecast(PINConverter::convertTritonReg2DBIReg(TritRegID));
  unsigned char *tmp      = (unsigned char*)malloc(16);

  if (tmp == nullptr)
    throw std::runtime_error("Error: setSSERegisterValue() - Not enough memory.");

  if (!REG_valid(reg) || !(TritRegID >= ID_XMM0 && TritRegID <= ID_XMM15))
    throw std::runtime_error("Error: setSSERegisterValue() - Invalid PIN register id.");

  *(uint128 *)tmp = value;

  PIN_SetContextRegval(this->_ctx, reg, tmp);
  PIN_ExecuteAt(this->_ctx);
  free(tmp);
}
Beispiel #8
0
void F77_FUNC(mpix_rank2torus,MPIX_RANK2TORUS)(MPI_Fint * rank, MPI_Fint * coords, MPI_Fint * ierr)
{
    int torusdim = -1;
    int rc = MPIX_Torus_ndims(&torusdim);
    if (rc!=MPI_SUCCESS) {
        *ierr = (MPI_Fint)rc;
        return;
    }

    int myrank = -1;
    safecast(*rank, &myrank);

    int * mycoords = malloc(torusdim*sizeof(int));
    *ierr = (MPI_Fint)MPIX_Rank2torus(myrank, mycoords);

    for (int i=0; i<torusdim; i++)
        coords[i] = (MPI_Fint)mycoords[i];

    free(mycoords);

    return;
}
Beispiel #9
0
void F77_FUNC(mpix_torus2rank,MPIX_TORUS2RANK)(MPI_Fint * coords, MPI_Fint * rank, MPI_Fint * ierr)
{
    int torusdim = -1;
    int rc = MPIX_Torus_ndims(&torusdim);
    if (rc!=MPI_SUCCESS) {
        *ierr = (MPI_Fint)rc;
        return;
    }

    int * mycoords = malloc(torusdim*sizeof(int));
    for (int i=0; i<torusdim; i++)
        safecast(mycoords[i], &(mycoords[i]) );

    int myrank = -1;
    *ierr = (MPI_Fint)MPIX_Torus2rank(mycoords, &myrank);

    *rank = (MPI_Fint)myrank;

    free(mycoords);

    return;
}