int loadcmd(interpreteur inter, memory mem) {
  int no_args;
  char* token;
  char* elf_file;
  size_t addr;
  
  if ((token = get_next_token(inter)) == NULL) {
    WARNING_MSG("Usage : load <fichier elf> {<adresse>}\n");
    return 1;
  }
  else {
    elf_file = token;
    no_args = 1;
  }

  token = get_next_token(inter);
  if(token!=NULL && !is_hexa(token)) {
    WARNING_MSG("Attention : adresse de depart non hexadecimale. Utilisation de la valeur par défaut.\n");
  }
  else if(token!=NULL && is_hexa(token)) {
    sscanf(token, "%zx", &addr);
    no_args = 2;
  }
  load(no_args, elf_file, addr, mem);
  return 0;
}
Exemple #2
0
/**
 * retourne le type du token (fonction très incomplete)
 * @param chaine le token à analyser
 * @return un entier correspondant au type du token
 *
 */
int get_type(char* chaine) {


    if (is_hexa(chaine))
        return HEXA; // HEXA ==1

    if(convert(chaine)!=-1){
        return REGISTRE;
    }

    if(is_hexa(chaine))
        return ADD;
    if(strcmp(chaine,":")==0)
        return DEUXPOINTS;

    if (strcmp(chaine,"+")==0)
        return PLUS;



    return UNKNOWN;
}
Exemple #3
0
/**** set progaddr ****/
int command_progaddr(){
	char *tmp;
	int addr;

	tmp = strtok(NULL, " ");
	if(!tmp)
		return 2;
	else if((addr = is_hexa(tmp,1)) == -1)
		return 3;
	
	if(comma_check(tmp))
		return 9;

	if((tmp = strtok(NULL, " ")))
		return 6;

	set_Addr(addr);
	return 0;
}
Exemple #4
0
int
check_mac(const char * command, unsigned char * mac) {
  int i = 0;
  char c;
  int size = 0;
  int current = 0;
  int j;
  unsigned char num;

  while ( command[i] == ' '){
    i++;
  }
  j = i;
  while( i < j + MAC_ADDRESS_SIZE){
    c = command[i++];
    switch(c){
      case ':':
        if ( size > 2 ){
          return -1;
        }else{
          size = 0;
          current++;
        }
        break;
      default:
        if ( !is_hexa(c) || size > 2 ){
          return -1;
        }else{
          if ( size == 0 ){
            num = char_hexa_to_i(c) * 0x10;
          }else{
            num += char_hexa_to_i(c);
            mac[current] = num;
          }
          size++;
        }
    }
  }

  return i;
}
int assertcmd(interpreteur inter, memory mem) 
{
  DEBUG_MSG("Chaine : %s", inter->input);
    
  char* token = NULL;

  if ((token = get_next_token(inter)) == NULL) {
    WARNING_MSG("no argument given to command %s\n", "assertcmd");
    return 1;
  }

  if (strcmp(token, "reg") == 0) {
    if ((token = get_next_token(inter)) == NULL) {
      WARNING_MSG("not enough arguments given to command %s\n", "assertcmd");
      return 1;
    }
    if (!is_register(token)) {
      char* token1;
      if((token1 = get_next_token(inter)) == NULL) {
	WARNING_MSG("not enough arguments given to command %s\n", "setcmd");
	return 1;
      }
      if (get_type(token1) == INT) {
	if (atoi(token1) == mem->reg[reg_index(token)]) {
	  printf("Ok\n");
	  return 0;
	}
	return 1; 
      }
      else if (is_hexa(token1)) {
	if (strtol(token1, NULL, 16) == mem->reg[reg_index(token)]) {
	  printf("Ok\n");
	  return 0;
	}
	return 1;
      }
      else {
	WARNING_MSG("second argument is not an integer %s\n", "assertcmd");
	return 1;
      } 
    }
    else {
      WARNING_MSG("first argument not a valid register%s\n", "assertcmd");
      return 1;
    }
  }

  if (strcmp(token, "word") == 0) {
    if ((token = get_next_token(inter)) == NULL) {
      WARNING_MSG("not enough arguments given to command %s\n", "assertcmd");
      return 1;
    }
    if (is_adress(token)) {
      char* token1;
      if ((token1 = get_next_token(inter)) == NULL) {
      WARNING_MSG("not enough arguments given to command %s\n", "assertcmd");
      return 1;
      }
      word value;
      if (get_type(token1) == INT) 
	value = atoi(token1);
      else if (is_hexa(token1))
	value = strtol(token1, NULL, 16);
      else{
	WARNING_MSG("second argument is not an integer %s\n", "assertcmd");
	return 1;
      }
      byte bValue[4];
      bValue[0] = (byte)((value & 0xff000000) >> 24);
      bValue[1] = (byte)((value & 0x00ff0000) >> 16);
      bValue[2] = (byte)((value & 0x0000ff00) >> 8);
      bValue[3] = (byte)((value & 0x000000ff));
      size_t addr = strtol(token, NULL, 16);
      if (mem->endianness == LSB && bValue[0] == read_memory_value(addr, mem) && bValue[1] == read_memory_value(addr+1, mem) && bValue[2] == read_memory_value(addr+2, mem) && bValue[3] == read_memory_value(addr+3, mem)) {
	printf("Ok\n");
	return 0;
      }
      else if (mem->endianness == MSB && bValue[0] == read_memory_value(addr+3, mem) && bValue[1] == read_memory_value(addr+2, mem) && bValue[2] == read_memory_value(addr+1, mem) && bValue[3] == read_memory_value(addr, mem)) {
	printf("Ok\n");
	return 0;
      }
      return 1;
    }
    else {
      WARNING_MSG("first argument not a valid adress %s\n","assertcmd");
      return 1;
    }
  }
int setcmd(interpreteur inter, memory mem)
{
  DEBUG_MSG("Chaine : %s", inter->input);
    
  char* token = NULL;

  if ((token = get_next_token(inter)) == NULL) {
    WARNING_MSG("no argument given to command %s\n", "setcmd");
    return 1;
  }

  if (strcmp(token, "mem") == 0) {
    if ((token = get_next_token(inter)) == NULL) {
      WARNING_MSG("not enough arguments given to command %s\n", "setcmd");
      return 1;
    }
    
    if (!strcmp(token, "byte")) {
      if((token = get_next_token(inter)) == NULL) {
	WARNING_MSG("not enough arguments given to command %s\n", "setcmd");
	return 1;
      }
      if(!is_adress(token)) {
	WARNING_MSG("third argument is not an adress range %s\n", "setcmd");
	return 1;
      }
      size_t adress = strtol(token, NULL, 16);
      if((token = get_next_token(inter)) == NULL) {
	WARNING_MSG("not enough arguments given to command %s\n", "setcmd");
	return 1;
      }
      if(!is_hexa(token)) {
	WARNING_MSG("fourth argument is not an hex %s\n", "setcmd");
	return 1;
      }
      byte value = strtol(token, NULL, 16);
      if(write_memory_value(adress, value, mem)) {
	WARNING_MSG("address is not valid %s\n", "setcmd");
	return 1;
      }
      return 0;
    }
    
    if (!strcmp(token, "word")) {
      if((token = get_next_token(inter)) == NULL) {
	WARNING_MSG("not enough arguments given to command %s\n", "setcmd");
	return 1;
      }
      if(!is_adress(token)) {
	WARNING_MSG("third argument is not an adress range %s\n", "setcmd");
	return 1;
      }
      size_t adress = strtol(token, NULL, 16);
      if((token = get_next_token(inter)) == NULL) {
	WARNING_MSG("not enough arguments given to command %s\n", "setcmd");
	return 1;
      }
      if(!is_hexa(token)) {
	WARNING_MSG("fourth argument is not an hex %s\n", "setcmd");
	return 1;
      }
      word wValue = strtol(token, NULL, 16);
      byte bValue[4];
      bValue[0] = (byte)((wValue & 0xff000000) >> 24);
      bValue[1] = (byte)((wValue & 0x00ff0000) >> 16);
      bValue[2] = (byte)((wValue & 0x0000ff00) >> 8);
      bValue[3] = (byte)((wValue & 0x000000ff));
      int i;
      if (mem->endianness == LSB) {
	for (i=0;i<=3;i++) {
	  if (write_memory_value(adress+i, bValue[i], mem)) {
	    WARNING_MSG("address is not valid %s\n", "setcmd");
	    return 1;
	  }
	}
      }
      else if (mem->endianness == MSB) {
	for (i=0;i<=3;i++) {
	  if (write_memory_value(adress+i, bValue[3-i], mem)) {
	    WARNING_MSG("address is not valid %s\n", "setcmd");
	    return 1;
	  }
	}
      }
      else
	ERROR_MSG("Endianness invaid\n");
      return 0;
    }
  }
  
  if (strcmp(token, "reg") == 0) {
    if ((token = get_next_token(inter)) == NULL) {
      WARNING_MSG("not enough arguments given to command %s\n", "setcmd");
      return 1;
    }

    if (!is_register(token)) {
      char* value;
      if ((value = get_next_token(inter)) != NULL) {
	if (get_type(value) == INT)
	  mem->reg[reg_index(token)] = atoi(value);
	else if (is_hexa(value))
	  mem->reg[reg_index(token)] = strtol(value, NULL, 16);	 
	else {
	  WARNING_MSG("value is not an integer %s\n", "setcmd");
	  return 1;
	}
	return 0;
      }
      else {
	WARNING_MSG("not enough arguments given to command %s\n", "setcmd");
	return 1;	 
      }
    }
		
    else {
      WARNING_MSG("argument not a valid register%s\n", "setcmd");
      return 1;
    }
  }

  else {
    WARNING_MSG("value %s is not a valid argument of command %s\n", token, "setcmd");
    return 1;
  }
  return 1;
}