예제 #1
0
파일: pocl_binary.c 프로젝트: kwm81/pocl
/* deserializes a single kernel
 * Note this has two modes of operation:
 * 1) if name_len and name_match are non-NULL, it only fills in pocl_binary_kernel
 *    with metadata (doesn't unpack files) and only if the name matches - used by
 *    pocl_binary_get_kernel_metadata()
 * 2) if name_len and name_match are NULL, unpacks kernel cachedir on disk, but
 *    does not set up kernel metadata of pocl_binary_kernel argument - used by
 *    pocl_binary_deserialize() */
static int
pocl_binary_deserialize_kernel_from_buffer(unsigned char **buf,
                                           pocl_binary_kernel *kernel,
                                           const char* name_match,
                                           size_t name_len,
                                           char* basedir)
{
  unsigned i;
  unsigned char *buffer = *buf;

  memset(kernel, 0, sizeof(pocl_binary_kernel));
  BUFFER_READ(kernel->struct_size, uint64_t);
  BUFFER_READ(kernel->binaries_size, uint64_t);
  BUFFER_READ(kernel->arginfo_size, uint32_t);
  BUFFER_READ_STR2(kernel->kernel_name, kernel->sizeof_kernel_name);
  BUFFER_READ(kernel->num_args, uint32_t);
  BUFFER_READ(kernel->num_locals, uint32_t);

  if (name_len > 0 && name_match)
    {
      if (strncmp(kernel->kernel_name, name_match, kernel->sizeof_kernel_name))
        {
          *buf = *buf + kernel->struct_size;
          return -11111;
        }

      kernel->dyn_arguments = calloc((kernel->num_args + kernel->num_locals),
                                     sizeof(struct pocl_argument));
      POCL_RETURN_ERROR_COND((!kernel->dyn_arguments), CL_OUT_OF_HOST_MEMORY);

      for (i=0; i < (kernel->num_args + kernel->num_locals); i++)
        {
          BUFFER_READ(kernel->dyn_arguments[i].size, uint64_t);
          kernel->dyn_arguments[i].value = NULL;
        }

      kernel->arg_info = calloc(kernel->num_args, sizeof(struct pocl_argument_info));
      POCL_RETURN_ERROR_COND((!kernel->arg_info), CL_OUT_OF_HOST_MEMORY);

      for (i=0; i < kernel->num_args; i++)
        {
          pocl_argument_info *ai = &kernel->arg_info[i];
          BUFFER_READ(ai->access_qualifier, cl_kernel_arg_access_qualifier);
          BUFFER_READ(ai->address_qualifier, cl_kernel_arg_address_qualifier);
          BUFFER_READ(ai->type_qualifier, cl_kernel_arg_type_qualifier);
          BUFFER_READ(ai->is_local, char);
          BUFFER_READ(ai->is_set, char);
          BUFFER_READ(ai->type, uint32_t);
          BUFFER_READ_STR(ai->name);
          BUFFER_READ_STR(ai->type_name);
        }

    }
  else
    {
예제 #2
0
파일: pocl_binary.c 프로젝트: kwm81/pocl
static unsigned char*
read_header(pocl_binary *b, const unsigned char *buffer)
{
  memset(b, 0, sizeof(pocl_binary));
  memcpy(b->pocl_id, buffer, POCLCC_STRING_ID_LENGTH);
  buffer += POCLCC_STRING_ID_LENGTH;
  BUFFER_READ(b->device_id, uint64_t);
  BUFFER_READ(b->version, uint32_t);
  BUFFER_READ(b->num_kernels, uint32_t);
  memcpy(b->program_build_hash, buffer, sizeof(SHA1_digest_t));
  buffer += sizeof(SHA1_digest_t);
  return (unsigned char*)buffer;
}
예제 #3
0
파일: pocl_binary.c 프로젝트: kwm81/pocl
cl_int
pocl_binary_get_kernel_names(unsigned char *binary,
                             char **kernel_names,
                             size_t num_kernels)
{
  pocl_binary b;
  unsigned char *buffer = read_header(&b, binary);
  assert(num_kernels == b.num_kernels);

  uint64_t struct_size;

  unsigned char *orig_buffer;
  unsigned i, len;
  for (i=0; i < num_kernels; i++)
  {
    orig_buffer = buffer;
    BUFFER_READ(struct_size, uint64_t);
    // skip binaries_size & arginfo_size
    buffer += sizeof(uint64_t) + sizeof(uint32_t);
    BUFFER_READ_STR2(kernel_names[i], len);
    kernel_names[i][len] = 0;
    buffer = orig_buffer + struct_size;
  }
  return CL_SUCCESS;
}
예제 #4
0
int16_t RectifierParser::getAnswer() {
  errorCounter_++;
  parseCounter_++;
  int16_t receiveRxBufferResult = serial_.receiveRxBuffer();
  // get minimum bytes with message length
  if (receiveRxBufferResult < 0) {
    return receiveRxBufferResult; // Error code, if receiveRxBuffer() get error
  }
  uint16_t bytesRead = (uint16_t)receiveRxBufferResult;
  if (bytesRead < RECTIFIER_MIN_LENGTH) {
    return RectifierParseState::GET_MINIMAL_FRAME_ERROR;
  }
  const char* data = serial_.getBuffer();
  
  if (!checkByte(0x7e, data, bytesRead))  {
    return RectifierParseState::CHECK_START_TAIL_BYTE_ERROR;
  }
  BUFFER_READ_BCD(frame_.address, data, bytesRead);
  BUFFER_READ_BCD(frame_.length, data, bytesRead);
  if (frame_.length < (bytesRead - RECTIFIER_CS_TAIL_LENGTH))    {
    return RectifierParseState::GET_MINIMAL_FRAME_ERROR;
  }
 
  //data = serial_.getBuffer();
  BUFFER_READ(frame_.cid, data, bytesRead);

  if (!RectifierInfoParser::makeRectifierInfoParser((int16_t)frame_.cid, parser_)) 
    return RectifierParseState::MAKE_INFO_PARSER_ERROR;
  int8_t parserResult = parser_->parseInfo(data, bytesRead, frame_.length);
  if (RectifierParseState::OK != parserResult) return parserResult;
  pParsedMesage_ = parser_->getData();
  errorCounter_--;
  return parser_->getCid();
}