예제 #1
0
static void lt_request_cli(void *arg)
{
    int ret;
    lthread_t *lt = NULL;
    proxy_conn_t *priv_conn = proxy_conn_create(-1, 1);
    proxy_conn_t *proxy_conn = (proxy_conn_t*)arg;

    DEFINE_LTHREAD;
    lthread_detach();

    fprintf(stderr, "request new client\n");
    ret = tcp_dial_ipv4(&priv_conn->conn, "192.168.6.1:80");
    if(0 != ret) {
        proxy_conn_free(priv_conn);
        proxy_conn_free(proxy_conn);
        return;
    }

    fprintf(stderr, "dial priv conn ok\n");
    priv_conn->other = proxy_conn;
    proxy_conn->other = priv_conn;
    //lthread_create(&lt1, (void*)lt_proxy_loop, (void*)priv_conn);
    lthread_create(&lt, (void*)lt_proxy_loop, (void*)proxy_conn);
    lt_proxy_loop(priv_conn);

    lthread_join(lt, NULL, LTHREAD_FOREVER);

    void* data = NULL;
    kstring_t *buf = NULL;
    while(0 == chan_recv(priv_conn->write_ch, &data)) {
        if(data != NULL) {
            buf = (kstring_t*)data;
            ks_free(buf);
            free(buf);
        } else {
            //mark as end
            break;
        }
    }
    while(0 == chan_recv(proxy_conn->write_ch, &data)) {
        if(data != NULL) {
            buf = (kstring_t*)data;
            ks_free(buf);
            free(buf);
        } else {
            //mark as end
            break;
        }
    }
    proxy_conn_free(priv_conn);
    proxy_conn_free(proxy_conn);
}
예제 #2
0
int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) {
    ks_engine *ks;
    ks_err err;
    size_t count;
    unsigned char *encode = NULL;
    size_t size;
    char * assembler;

    if (outfile == NULL) {
        // we compute the output
        outfile = fopen("/dev/null", "w");
        if (outfile == NULL) {
            printf("failed opening /dev/null\n");
            abort();
        }
    }

    if (Size < 1) {
        return 0;
    }

    err = ks_open(KS_ARCH_PPC, KS_MODE_PPC32+KS_MODE_BIG_ENDIAN, &ks);
    if (err != KS_ERR_OK) {
        printf("ERROR: failed on ks_open(), quit error = %u\n", err);
        abort();
    }

    ks_option(ks, KS_OPT_SYNTAX, Data[Size-1]);

    assembler = malloc(Size);
    memcpy(assembler, Data, Size-1);
    //null terminate string
    assembler[Size-1] = 0;

    if (ks_asm(ks, assembler, 0, &encode, &size, &count) != KS_ERR_OK) {
        fprintf(outfile, "ERROR: ks_asm() failed & count = %lu, error = %u\n",
                count, ks_errno(ks));
    } else {
        size_t i;

        fprintf(outfile, "%s = ", assembler);
        for (i = 0; i < size; i++) {
            fprintf(outfile, "%02x ", encode[i]);
        }
        fprintf(outfile, "\n");
        fprintf(outfile, "Compiled: %lu bytes, statements: %lu\n", size, count);
    }

    free(assembler);
    // NOTE: free encode after usage to avoid leaking memory
    if (encode != NULL) {
        ks_free(encode);
    }

    // close Keystone instance when done
    ks_close(ks);

    return 0;
}
int main(int argc, char **argv) {
  int ks_arch = KS_ARCH_X86, ks_mode = KS_MODE_64;
  char *assembly = ".=x;.=x;1:";
  ks_engine *ks;
  ks_err err = ks_open(ks_arch, ks_mode, &ks);
  if (!err) {
    size_t count, size;
    unsigned char *insn;
    ks_asm(ks, assembly, 0, &insn, &size, &count);
    ks_free(insn);
  }
  ks_close(ks);
}
int main(int argc, char **argv) {
  int ks_arch = KS_ARCH_X86, ks_mode = KS_MODE_64;
  char *assembly = "{[x*mm0";
  ks_engine *ks;
  ks_err err = ks_open(ks_arch, ks_mode, &ks);
  if (!err) {
    size_t count, size;
    unsigned char *insn;
    if (ks_asm(ks, assembly, 0, &insn, &size, &count))
      printf("ERROR: failed on ks_asm() with error = %s, code = %u\n", ks_strerror(ks_errno(ks)), ks_errno(ks));
    ks_free(insn);
  }
  ks_close(ks);
}
예제 #5
0
int main(int argc, char **argv) {
  int ks_arch = KS_ARCH_ARM, ks_mode = KS_MODE_LITTLE_ENDIAN;
  char *assembly = "LDr AH1I,=jHGQ,=2,=r,=GQ,=1111111111111112,=ey,=2,=eQ,=rQ',=r,=";
  ks_engine *ks;
  ks_err err = ks_open(ks_arch, ks_mode, &ks);
  if (!err) {
    size_t count, size;
    unsigned char *insn;
    if (ks_asm(ks, assembly, 0, &insn, &size, &count))
      printf("ERROR: failed on ks_asm() with error = %s, code = %u\n", ks_strerror(ks_errno(ks)), ks_errno(ks));
    ks_free(insn);
  }
  ks_close(ks);
  return 0;
}
int main(int argc, char **argv) {
  int ks_arch = KS_ARCH_SYSTEMZ, ks_mode = KS_MODE_LITTLE_ENDIAN;
  unsigned char assembly[] = {
    'J', '-', '9', 'e', 'e', 0x00,
  };
  ks_engine *ks;
  ks_err err = ks_open(ks_arch, ks_mode, &ks);
  if (!err) {
    size_t count, size;
    unsigned char *insn;
    if (ks_asm(ks, (char *)assembly, 0, &insn, &size, &count))
      printf("ERROR: failed on ks_asm() with error = %s, code = %u\n", ks_strerror(ks_errno(ks)), ks_errno(ks));
    ks_free(insn);
  }
  ks_close(ks);
  return 0;
}
int main(int argc, char **argv) {
  int ks_arch = KS_ARCH_X86, ks_mode = KS_MODE_64;
  unsigned char assembly[] = {
    0x12, ';', 0x12, 'i', ';', '.', 'i', 'R', 'p', ' ',
    'e', 'm', 'i', 'R', 'p', ',', 0xca, 0xe9, ',', 'I',
    '=', 0x00,
  };
  ks_engine *ks;
  ks_err err = ks_open(ks_arch, ks_mode, &ks);
  if (!err) {
    size_t count, size;
    unsigned char *insn;
    if (ks_asm(ks, (char *)assembly, 0, &insn, &size, &count))
      printf("ERROR: failed on ks_asm() with error = %s, code = %u\n", ks_strerror(ks_errno(ks)), ks_errno(ks));
    ks_free(insn);
  }
  ks_close(ks);
  return 0;
}
예제 #8
0
  uint8 ks_device_close(KS_DEVICE_HANDLE device_handle)
{
   uint8 err;
 	 if(device_handle == (KS_DEVICE_HANDLE)NULL){
		return KS_DEVICE_CLOSE_ERR;
    }
	 if(device_handle->can_shared == NOT_CAN_SHARED){
		ks_sem_waitfor(device_handle->device_sem,0,&err);
 	}
	 if(device_handle->open_count>0){
	 	device_handle->open_count --;
	 }	
	 device_handle->state = "close";
   device_handle->deivce_op.device_close();
   ks_free(device_handle);
  if(device_handle->can_shared == NOT_CAN_SHARED){
		ks_sem_sendmsg(device_handle->device_sem);
		ks_sem_delete(device_handle->device_sem,KS_DEL_ALWAYS,&err);
 	}
 return KS_DEVICE_CLOSE_NO_ERR;
}
예제 #9
0
파일: sample.c 프로젝트: aziem/keystone
static int test_ks(ks_arch arch, int mode, const char *assembly, int syntax)
{
    ks_engine *ks;
    ks_err err = KS_ERR_ARCH;
    size_t count;
    unsigned char *encode;
    size_t size;

    err = ks_open(arch, mode, &ks);
    if (err != KS_ERR_OK) {
        printf("ERROR: failed on ks_open(), quit\n");
        return -1;
    }

    if (syntax)
        ks_option(ks, KS_OPT_SYNTAX, syntax);

    if (ks_asm(ks, assembly, 0, &encode, &size, &count)) {
        printf("ERROR: failed on ks_asm() with count = %lu, error code = %u\n", count, ks_errno(ks));
    } else {
        size_t i;

        printf("%s = ", assembly);
        for (i = 0; i < size; i++) {
            printf("%02x ", encode[i]);
        }
        printf("\n");
        printf("Assembled: %lu bytes, %lu statements\n\n", size, count);
    }

    // NOTE: free encode after usage to avoid leaking memory
    ks_free(encode);

    // close Keystone instance when done
    ks_close(ks);

    return 0;
}
예제 #10
0
static void lt_proxy_loop_write(void* arg)
{
    proxy_conn_t *proxy = (proxy_conn_t*)arg;
    //proxy_conn_t *other = proxy->other;
    proxy_server *srv = &g_srv;
    int ret;
    lthread_chan_t* chans[3];
    void* msgs[3];
    kstring_t *buf = NULL;
    lthread_sel_t* sel = lthread_sel_create();
    chans[0] = proxy->write_ch;
    chans[1] = proxy->die_ch;
    chans[2] = srv->die_ch;
    fprintf(stderr, "%s#%d started\n", __FUNCTION__, __LINE__);

    while(!proxy->is_die) {
        ret = chan_select(sel, chans, msgs, 0, 3, LTHREAD_FOREVER);
        switch(ret) {
        case 0:
            //recv channel ok
            buf = msgs[0];
            if(NULL == buf && chan_is_closed(chans[0])) {
                //channel closed
                ret = -10;
                fprintf(stderr, "%s#%d chan closed priv=%d\n", __FUNCTION__, __LINE__, proxy->is_priv);
                break;
            }
            assert(NULL != buf);

            //fprintf(stderr, "recv new writer\n");
            ret = net_conn_write(&proxy->conn.base, (uint8_t*)buf->s, buf->l, LTHREAD_FOREVER);
            if(ret <= 0) {
                fprintf(stderr, "write failed ret=%d priv=%d\n", ret, proxy->is_priv);
                ret = -11;
            }
            ks_free(buf);
            free(buf);
            buf = NULL;
            break;
        case 1:
            //proxy already die
            ret = -12;
            break;
        case 2:
            //server already die
            ret = -13;
            break;
        default:
            break;
        }

        //after switch
        if(ret < 0) {
            fprintf(stderr, "%s#%d error is_priv=%d ret=%d\n", __FUNCTION__, __LINE__, proxy->is_priv, ret);
            break;
        }
    }
    if(NULL != buf) {
        ks_free(buf);
        free(buf);
    }
    assert(0 == chan_size(chans[0]));
    if(!proxy->is_die) {
        proxy->is_die = 1;
        chan_close(proxy->die_ch);
    }
    net_conn_shutdown(&proxy->conn.base);
    lthread_sel_dispose(sel);
}
예제 #11
0
static void lt_proxy_loop_read(void* arg)
{
    proxy_conn_t *proxy = (proxy_conn_t*)arg;
    proxy_conn_t *other = proxy->other;
    proxy_server *srv = &g_srv;
    kstring_t *buf = NULL;
    int ret, n;
    lthread_chan_t* chans[3];
    void* msgs[3];
    lthread_sel_t* sel = lthread_sel_create();
    chans[0] = other->write_ch;
    chans[1] = proxy->die_ch;
    chans[2] = srv->die_ch;

    fprintf(stderr, "%s#%d started\n", __FUNCTION__, __LINE__);
    while(!proxy->is_die) {
        buf = (kstring_t*)calloc(1, sizeof(kstring_t));
        ks_resize(buf, 4096);
        n = net_conn_read(&proxy->conn.base, (uint8_t*)buf->s, (int)buf->m, (uint64_t)10000);
        if(n <= 0) {
            fprintf(stderr, "recv error n=%d priv=%d\n", n, proxy->is_priv);
            break;
        } else {
            buf->l = n;
            msgs[0] = buf;
            ret = chan_select(sel, chans, msgs, 1, 2, (uint64_t)10000);
            switch(ret) {
            case 0:
                //send ok
                buf = NULL;
                //fprintf(stderr, "send new writer\n");
                break;
            case 1:
                //proxy die
                ret = -10;
                break;
            case 2:
                //server die
                ret = -11;
                break;
            default:
                break;
            }
            if(ret < 0) {
                fprintf(stderr, "%s#%d error ret=%d is_priv=%d\n", __FUNCTION__, __LINE__, ret, proxy->is_priv);
                break;
            }
        }
    }

    if(NULL != buf) {
        ks_free(buf);
        free(buf);
        buf = NULL;
    }

    chan_close(other->write_ch);
    if(!proxy->is_die) {
        proxy->is_die = 1;
        chan_close(proxy->die_ch);
    }

    lthread_sel_dispose(sel);
}
예제 #12
0
ks_event * ks_mutex_delete(ks_event*pevent,uint8 opt,uint8 *error)
{
#if KS_CRITICAL_METHOD == 3
	KS_CPU_SR cpu_sr;
#endif
	uint8 thread_waiting;
	if(int_nesting > 0)                     	   /*确保中断服务程子程序无法调用*/
	{
		*error = KS_MUTEX_WAIT_ISR;
		return ((ks_event*)0);
	}
	#if KS_CHECK_EN > 0                            /*是否支持条件检验            */
	if(pevent == (ks_event*)0)             		   /*事件控制块指针为空			 */
	{
		*error = KS_EVENT_TYPE_NULL;
		return ((ks_event*)0);
	}
#endif
	if(pevent->event_type != KS_EVENT_TYPE_MUTEX)  /*确保事件控制块的类型是队列	*/
	{
		*error = KS_MUTEX_TYPE_ERROR;
		return ((ks_event*)0);
	}
	KS_ENTER_CRITICAL();
	if(pevent->event_wait_num != 0)			/*检查消息队列中是否有线程在等待消息*/
	{
		thread_waiting = KS_TRUE;			/*有线程在等待消息                  */
	}
	else
	{
		thread_waiting = KS_FALSE;			/*没有线程在等待消息             	*/
	}
	switch(opt)
	{
	case KS_DEL_NO_WAIT:/*仅在没有线程等待消息时才删除消息队列					*/
		if(thread_waiting == KS_FALSE)
		{
			KS_EXIT_CRITICAL();
			ks_free(pevent->event_wait_list);       /*释放事件等待链表的空间	*/
			ks_free(pevent);                        /*释放事件控制块的空间  	*/
				
			*error = KS_NO_ERROR;
			return ((ks_event*)0);
		}
		else
		{
			KS_EXIT_CRITICAL();
			*error = KS_DEL_THREAD_WAITING;         /*返回错误消息*/
			return (pevent);
		}
	case KS_DEL_ALWAYS:	
		while(pevent->event_wait_num != 0) 			/*将所有等待消息的线程都置于就绪*/
		{
			ks_event_ready(pevent,(void*)0,KS_STATE_WAIT_MUTEX);
		}
		KS_EXIT_CRITICAL();
		ks_free(pevent->event_wait_list);			/*释放事件等待链表的空间*/
		ks_free(pevent);							/*释放事件控制块的空间*/
		if(thread_waiting == KS_TRUE)			
		{
			ks_schedule();							/*若有任务在等待消息,就调度一次*/
		}
		*error = KS_NO_ERROR;
		return ((ks_event*)0);	
	default:										/*其它情况*/
		KS_EXIT_CRITICAL();
		*error = KS_ERROR_INVALID_OPT;
		return (pevent);
	}
	
	
	
}
예제 #13
0
static int keystone_assemble(RAsm *a, RAsmOp *ao, const char *str, ks_arch arch, ks_mode mode) {
	ks_err err = KS_ERR_ARCH;
	bool must_init = false;
	size_t count, size;
	ut8 *insn = NULL;

	if (!ks_arch_supported (arch)) {
		return -1;
	}

	must_init = true; //!oldcur || (a->cur != oldcur || oldbit != a->bits);
	oldcur = a->cur;
	oldbit = a->bits;

	if (must_init) {
		if (ks) {
			ks_close (ks);
			ks = NULL;
		}
		err = ks_open (arch, mode, &ks);
		if (err || !ks) {
			eprintf ("Cannot initialize keystone\n");
			ks_free (insn);
			if (ks) {
				ks_close (ks);
				ks = NULL;
			}
			return -1;
		}
	}

	if (!ks) {
		ks_free (insn);
		if (ks) {
			ks_close (ks);
			ks = NULL;
		}
		return -1;
	}
	if (a->syntax == R_ASM_SYNTAX_ATT) {
		ks_option (ks, KS_OPT_SYNTAX, KS_OPT_SYNTAX_ATT);
	} else {
		ks_option (ks, KS_OPT_SYNTAX, KS_OPT_SYNTAX_NASM);
	}
	int rc = ks_asm (ks, str, a->pc, &insn, &size, &count);
	if (rc) {
		eprintf ("ks_asm: %s\n", ks_strerror ((ks_err)ks_errno (ks)));
		ks_free (insn);
		if (ks) {
			ks_close (ks);
			ks = NULL;
		}
		return -1;
	}
	memcpy (ao->buf, insn, R_MIN (size, sizeof (ao->buf) -1));
	ks_free (insn);
	if (ks) {
		ks_close (ks);
		ks = NULL;
	}
	return size;
}
예제 #14
0
/*----------------------------------------------------------------------*
                              _rtp_free
 *----------------------------------------------------------------------*/
void _rtp_free (void * ptr)
{
    ks_free((PFBYTE)ptr, 0, 0);
}
예제 #15
0
파일: kstool.cpp 프로젝트: eiselekd/hw
int main(int argc, char **argv)
{
    ks_engine *ks;
    ks_err err = KS_ERR_ARCH;
    char *mode, *assembly = NULL;
    uint64_t start_addr = 0;
    char *input = NULL;
    size_t count;
    unsigned char *insn = NULL;
    size_t size;

    if (argc == 2) {
        // handle code from stdin
#if !defined(WIN32) && !defined(WIN64) && !defined(_WIN32) && !defined(_WIN64)
        int flags;
        size_t index = 0;
        char buf[1024];

        mode = argv[1];

        if ((flags = fcntl(STDIN_FILENO, F_GETFL, 0)) == -1)
            flags = 0;

        fcntl(STDIN_FILENO, F_SETFL, flags | O_NONBLOCK);

        while(fgets(buf, sizeof(buf), stdin)) {
            input = (char*)realloc(input, index + strlen(buf));
            if (!input) {
                printf("Failed to allocate memory.");
                return 1;
            }

            memcpy(&input[index], buf, strlen(buf));
            index += strlen(buf);
        }

        fcntl(STDIN_FILENO, F_SETFL, flags);

        assembly = input;
        if (!assembly) {
            usage(argv[0]);
            return -1;
        }
#else   // Windows does not handle code from stdin
        usage(argv[0]);
        return -1;
#endif
    } else if (argc == 3) {
        // kstool <arch> <assembly>
        mode = argv[1];
        assembly = argv[2];
    } else if (argc == 4) {
        // kstool <arch> <assembly> <address>
        char *temp;
        mode = argv[1];
        assembly = argv[2];
        start_addr = strtoull(argv[3], &temp, 16);
        if (temp == argv[3] || *temp != '\0' || errno == ERANGE) {
            printf("ERROR: invalid address argument, quit!\n");
            return -2;
        }
    } else {
        usage(argv[0]);
        return -1;
    }

    if (!strcmp(mode, "x16")) {
        err = ks_open(KS_ARCH_X86, KS_MODE_16, &ks);
    }
    if (!strcmp(mode, "x32")) {
        err = ks_open(KS_ARCH_X86, KS_MODE_32, &ks);
    }
    if (!strcmp(mode, "x64")) {
        err = ks_open(KS_ARCH_X86, KS_MODE_64, &ks);
    }

    if (!strcmp(mode, "x16att")) {
        err = ks_open(KS_ARCH_X86, KS_MODE_16, &ks);
        if (!err) {
            ks_option(ks, KS_OPT_SYNTAX, KS_OPT_SYNTAX_ATT);
        }
    }
    if (!strcmp(mode, "x32att")) {
        err = ks_open(KS_ARCH_X86, KS_MODE_32, &ks);
        if (!err) {
            ks_option(ks, KS_OPT_SYNTAX, KS_OPT_SYNTAX_ATT);
        }
    }
    if (!strcmp(mode, "x64att")) {
        err = ks_open(KS_ARCH_X86, KS_MODE_64, &ks);
        if (!err) {
            ks_option(ks, KS_OPT_SYNTAX, KS_OPT_SYNTAX_ATT);
        }
    }

    if (!strcmp(mode, "x16nasm")) {
        err = ks_open(KS_ARCH_X86, KS_MODE_16, &ks);
        if (!err) {
            ks_option(ks, KS_OPT_SYNTAX, KS_OPT_SYNTAX_NASM);
        }
    }
    if (!strcmp(mode, "x32nasm")) {
        err = ks_open(KS_ARCH_X86, KS_MODE_32, &ks);
        if (!err) {
            ks_option(ks, KS_OPT_SYNTAX, KS_OPT_SYNTAX_NASM);
        }
    }
    if (!strcmp(mode, "x64nasm")) {
        err = ks_open(KS_ARCH_X86, KS_MODE_64, &ks);
        if (!err) {
            ks_option(ks, KS_OPT_SYNTAX, KS_OPT_SYNTAX_NASM);
        }
    }

    if (!strcmp(mode, "arm")) {
        err = ks_open(KS_ARCH_ARM, KS_MODE_ARM+KS_MODE_LITTLE_ENDIAN, &ks);
    }

    if (!strcmp(mode, "armbe")) {
        err = ks_open(KS_ARCH_ARM, KS_MODE_ARM+KS_MODE_BIG_ENDIAN, &ks);
    }

    if (!strcmp(mode, "thumb")) {
        err = ks_open(KS_ARCH_ARM, KS_MODE_THUMB+KS_MODE_LITTLE_ENDIAN, &ks);
    }

    if (!strcmp(mode, "thumbbe")) {
        err = ks_open(KS_ARCH_ARM, KS_MODE_THUMB+KS_MODE_BIG_ENDIAN, &ks);
    }

    if (!strcmp(mode, "armv8")) {
        err = ks_open(KS_ARCH_ARM, KS_MODE_ARM+KS_MODE_LITTLE_ENDIAN+KS_MODE_V8, &ks);
    }

    if (!strcmp(mode, "armv8be")) {
        err = ks_open(KS_ARCH_ARM, KS_MODE_ARM+KS_MODE_BIG_ENDIAN+KS_MODE_V8, &ks);
    }

    if (!strcmp(mode, "thumbv8")) {
        err = ks_open(KS_ARCH_ARM, KS_MODE_THUMB+KS_MODE_LITTLE_ENDIAN+KS_MODE_V8, &ks);
    }

    if (!strcmp(mode, "thumbv8be")) {
        err = ks_open(KS_ARCH_ARM, KS_MODE_THUMB+KS_MODE_BIG_ENDIAN+KS_MODE_V8, &ks);
    }

    if (!strcmp(mode, "arm64")) {
        err = ks_open(KS_ARCH_ARM64, KS_MODE_LITTLE_ENDIAN, &ks);
    }

    if (!strcmp(mode, "hex") || !strcmp(mode, "hexagon")) {
        err = ks_open(KS_ARCH_HEXAGON, KS_MODE_BIG_ENDIAN, &ks);
    }

    if (!strcmp(mode, "mips")) {
        err = ks_open(KS_ARCH_MIPS, KS_MODE_MIPS32+KS_MODE_LITTLE_ENDIAN, &ks);
    }

    if (!strcmp(mode, "mipsbe")) {
        err = ks_open(KS_ARCH_MIPS, KS_MODE_MIPS32+KS_MODE_BIG_ENDIAN, &ks);
    }

    if (!strcmp(mode, "mips64")) {
        err = ks_open(KS_ARCH_MIPS, KS_MODE_MIPS64+KS_MODE_LITTLE_ENDIAN, &ks);
    }

    if (!strcmp(mode, "mips64be")) {
        err = ks_open(KS_ARCH_MIPS, KS_MODE_MIPS64+KS_MODE_BIG_ENDIAN, &ks);
    }

    if (!strcmp(mode, "ppc32be")) {
        err = ks_open(KS_ARCH_PPC, KS_MODE_PPC32+KS_MODE_BIG_ENDIAN, &ks);
    }

    if (!strcmp(mode, "ppc64")) {
        err = ks_open(KS_ARCH_PPC, KS_MODE_PPC64+KS_MODE_LITTLE_ENDIAN, &ks);
    }

    if (!strcmp(mode, "ppc64be")) {
        err = ks_open(KS_ARCH_PPC, KS_MODE_PPC64+KS_MODE_BIG_ENDIAN, &ks);
    }

    if (!strcmp(mode, "sparc")) {
        err = ks_open(KS_ARCH_SPARC, KS_MODE_SPARC32+KS_MODE_LITTLE_ENDIAN, &ks);
    }

    if (!strcmp(mode, "sparcbe")) {
        err = ks_open(KS_ARCH_SPARC, KS_MODE_SPARC32+KS_MODE_BIG_ENDIAN, &ks);
    }

    if (!strcmp(mode, "sparc64be")) {
        err = ks_open(KS_ARCH_SPARC, KS_MODE_SPARC64+KS_MODE_BIG_ENDIAN, &ks);
    }

    if (!strcmp(mode, "systemz") || !strcmp(mode, "sysz") || !strcmp(mode, "s390x")) {
        err = ks_open(KS_ARCH_SYSTEMZ, KS_MODE_BIG_ENDIAN, &ks);
    }

    if (!strcmp(mode, "evm")) {
        err = ks_open(KS_ARCH_EVM, 0, &ks);
    }

    if (err) {
        printf("ERROR: failed on ks_open()\n");
        usage(argv[0]);
        return -1;
    }

    if (ks_asm(ks, assembly, start_addr, &insn, &size, &count)) {
        printf("ERROR: failed on ks_asm() with count = %zu, error = '%s' (code = %u)\n", count, ks_strerror(ks_errno(ks)), ks_errno(ks));
    } else {
        size_t i;
        printf("%s = [ ", assembly);
        for (i = 0; i < size; i++) {
            printf("%02x ", insn[i]);
        }
        printf("]\n");
        //printf("Assembled: %lu bytes, %lu statement(s)\n", size, count);
    }

    // NOTE: free insn after usage to avoid leaking memory
    if (insn != NULL) {
        ks_free(insn);
    }

    // close Keystone instance when done
    ks_close(ks);

    free(input);

    return 0;
}