예제 #1
0
/**
 * Parse GDB transport name
 *
 * @v text		Text
 * @ret trans		GDB transport
 * @ret rc		Return status code
 */
static int parse_gdb_transport ( const char *text,
				 struct gdb_transport **trans ) {

	/* Sanity check */
	assert ( text != NULL );

	/* Find transport */
	*trans = find_gdb_transport ( text );
	if ( ! *trans ) {
		printf ( "\"%s\": no such transport (is it compiled in?)\n",
			 text );
		return -ENOTSUP;
	}

	return 0;
}
예제 #2
0
/**
 * The "gdbstub" command
 *
 * @v argc		Argument count
 * @v argv		Argument list
 * @ret rc		Exit code
 */
static int gdbstub_exec ( int argc, char **argv ) {
	static struct option longopts[] = {
		{ "help", 0, NULL, 'h' },
		{ NULL, 0, NULL, 0 },
	};
	const char *trans_name;
	struct gdb_transport *trans;
	int c;

	/* Parse options */
	while ( ( c = getopt_long ( argc, argv, "h", longopts, NULL ) ) >= 0 ){
		switch ( c ) {
		case 'h':
			/* Display help text */
		default:
			/* Unrecognised/invalid option */
			gdbstub_syntax ( argv );
			return 1;
		}
	}

	/* At least one argument */
	if ( optind == argc ) {
		gdbstub_syntax ( argv );
		return 1;
	}

	trans_name = argv[optind++];

	/* Initialise transport */
	trans = find_gdb_transport ( trans_name );
	if ( !trans ) {
		printf ( "%s: no such transport (is it compiled in?)\n", trans_name );
		return 1;
	}

	if ( trans->init ) {
		if ( trans->init ( argc - optind, &argv[optind] ) != 0 ) {
			return 1;
		}
	}

	/* Enter GDB stub */
	gdbstub_start ( trans );
	return 0;
}