int core_single_exec(cmdtoken *tok) {
    char **argv = history_tokenize(tok->cmd);
    if (!argv) return glob_shell->lreturn;
    char *p;
    while (*argv && (p = strchr(*argv, '='))) {
        *p = '\0';
        tbl_set(glob_shell->lvar_tbl, *argv, p + 1);
        argv++;
    }
    core_argv_expn(argv);
    if (*argv == NULL) return glob_shell->lreturn;
    if (tbl_containskey(glob_alias->tbl, *argv)) {
        *argv = alias_get(*argv);
    }
    int res = builtin_try(argv);
    if (res != BUILTIN_NOSUCH) return res;
    return core_exec_extern(argv, tok);
}
Beispiel #2
0
int main(int argc, char *argv[])
{
	struct srio_dev *sriodev;
	struct dma_ch *dmadev;
	struct dma_pool *dmapool = NULL;
	int i, err;
	struct srio_port_data *port_data;
	int cli_argc;
	char *cli, **cli_argv;

	of_init();
	err = fsl_srio_uio_init(&sriodev);
	if (err < 0)
		error(EXIT_FAILURE, -err, "%s(): srio_uio_init()", __func__);

	port_num = fsl_srio_get_port_num(sriodev);

	memset(&cmd_param, 0, sizeof(cmd_param));
	cmd_param.port = malloc(sizeof(struct cmd_port_param) * port_num);
	if (!cmd_param.port) {
		error(0, errno, "%s(): command port", __func__);
		goto err_cmd_malloc;
	}
	memset(cmd_param.port, 0, sizeof(struct cmd_port_param));

	port_data = malloc(sizeof(struct srio_port_data) * port_num);
	if (!port_data) {
		error(0, errno, "%s(): port_data", __func__);
		goto err_cmd_malloc;
	}

	for (i = 0; i < port_num; i++) {
		fsl_srio_connection(sriodev, i);
		fsl_srio_get_port_info(sriodev, i + 1, &port_data[i].port_info,
				       &port_data[i].range_virt);
	}

	err = fsl_srio_port_connected(sriodev);
	if (err <= 0) {
		error(0, -err, "%s(): fsl_srio_port_connected", __func__);
		goto err_srio_connected;
	}

	err = dma_pool_init(&dmapool);

	for (i = 0; i < port_num; i++) {
		dma_addr_t port_phys_base =
			dmapool->dma_phys_base + SRIO_POOL_PORT_OFFSET * i;
		port_data[i].phys.write_recv_data = port_phys_base;
		port_data[i].phys.read_recv_data =
			port_phys_base + SRIO_POOL_SECT_SIZE;
		port_data[i].phys.write_data_prep =
			port_phys_base + SRIO_POOL_SECT_SIZE * 2;
		port_data[i].phys.res =
			port_phys_base + SRIO_POOL_SECT_SIZE * 3;

		port_data[i].virt = (typeof(port_data[i].virt))
			(dmapool->dma_virt_base + i * SRIO_POOL_PORT_OFFSET);
		fsl_srio_set_ibwin(sriodev, i, 1,
				   port_data[i].phys.write_recv_data,
				   SRIO_SYS_ADDR, LAWAR_SIZE_2M);
	}

	err = fsl_dma_chan_init(&dmadev, 0, 0);
	if (err < 0) {
		error(0, -err, "%s(): fsl_dma_chan_init()", __func__);
		goto err_srio_connected;
	}

	err = fsl_dma_chan_init(&dmadev1, 0, 1);
	if (err < 0) {
		error(0, -err, "%s(): fsl_dma_chan_init()", __func__);
		goto err_srio_connected;
	}

	err = fsl_dma_chan_init(&dmadev2, 1, 1);
	if (err < 0) {
		error(0, -err, "%s(): fsl_dma_chan_init()", __func__);
		goto err_srio_connected;
	}

	fsl_srio_err_handle_enable(sriodev);

	/* Run the CLI loop */
	while (1) {
		/* Get CLI input */
		cli = readline(sra_prompt);
		if (unlikely((cli == NULL) || strncmp(cli, "q", 1) == 0))
			break;
		if (cli[0] == 0) {
			free(cli);
			continue;
		}

		cli_argv = history_tokenize(cli);
		if (unlikely(cli_argv == NULL)) {
			error(EXIT_SUCCESS, 0,
			      "Out of memory while parsing: %s", cli);
			free(cli);
			continue;
		}
		for (cli_argc = 0; cli_argv[cli_argc] != NULL; cli_argc++)
			;

		add_history(cli);
		err = cmd_translate(cli_argc, cli_argv);
		if (err < 0)
			cmd_format_print();

		for (cli_argc = 0; cli_argv[cli_argc] != NULL; cli_argc++)
			free(cli_argv[cli_argc]);
		free(cli_argv);
		free(cli);

		if (err < 0)
			continue;
		fsl_dma_chan_basic_direct_init(dmadev);

		cmd_implement(sriodev, dmadev, port_data);
	}

	free(port_data);
	free(cmd_param.port);
	fsl_dma_chan_finish(dmadev);
	fsl_dma_chan_finish(dmadev1);
	fsl_dma_chan_finish(dmadev2);
	dma_pool_finish(dmapool);
	fsl_srio_uio_finish(sriodev);

	of_finish();
	return EXIT_SUCCESS;

err_srio_connected:
	free(port_data);
	free(cmd_param.port);
err_cmd_malloc:
	fsl_srio_uio_finish(sriodev);
	of_finish();

	return err;
}