view loadtools/ltexit.c @ 313:9df7f9c72e17

ARM exception handling: stack setup added
author Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
date Mon, 17 Mar 2014 07:47:18 +0000
parents 6f8d3771aa6c
children 134c047c1269
line wrap: on
line source

/*
 * This module implements the loadtool exit command, along with its
 * options for jump-reboot or eventual Iota power-off.
 */

#include <stdio.h>
#include <string.h>
#include <strings.h>
#include <stdlib.h>

static void
exit_bare()
{
	exit(0);
}

static void
exit_gta02_cutpwr()
{
#ifdef GTA0x_AP_BUILD
	set_gta_modem_power_ctrl(0);
#endif
	exit(0);
}

static void
exit_jump0()
{
	static char *jump0_argv[3] = {"jump", "0", 0};

	tpinterf_make_cmd(jump0_argv);
	tpinterf_send_cmd();
	exit(0);
}

void (*default_exit)() = exit_bare;

static struct kwtab {
	char *kw;
	void (*func)();
} exit_modes[] = {
	{"bare", exit_bare},
	{"gta02-cutpwr", exit_gta02_cutpwr},
	{"jump0", exit_jump0},
	{0, 0}
};

cmd_exit(argc, argv)
	char **argv;
{
	struct kwtab *tp;

	if (argc < 2)
		default_exit();
	for (tp = exit_modes; tp->kw; tp++)
		if (!strcmp(tp->kw, argv[1]))
			break;
	if (!tp->func) {
		fprintf(stderr,
			"error: \"%s\" is not an understood exit mode\n",
			argv[1]);
		return(-1);
	}
	tp->func();
}

/* called from hwparam.c config file parser */
void
set_default_exit_mode(arg, filename_for_errs, lineno_for_errs)
	char *arg;
	char *filename_for_errs;
	int lineno_for_errs;
{
	char *cp;
	struct kwtab *tp;

	while (isspace(*arg))
		arg++;
	if (!*arg) {
		fprintf(stderr,
		"%s line %d: exit-mode setting requires an argument\n",
			filename_for_errs, lineno_for_errs);
		exit(1);
	}
	for (cp = arg; *cp && !isspace(*cp); cp++)
		;
	*cp = '\0';
	for (tp = exit_modes; tp->kw; tp++)
		if (!strcmp(tp->kw, arg))
			break;
	if (!tp->func) {
		fprintf(stderr,
			"%s line %d: \"%s\" is not an understood exit mode\n",
			filename_for_errs, lineno_for_errs, arg);
		exit(1);
	}
	default_exit = tp->func;
}