arm: semihosting: set command line arguments
Add "arm semihosting_cmdline [argv0 argv1 ...]" for setting the command line arguments for the debuggee. [andreas.fritiofson@gmail.com]: Dynamic allocation, empty default Change-Id: I831ddd161d602f251940e29608a154e9590fdee1 Signed-off-by: Christian Groessler <chris@groessler.org> Signed-off-by: Andreas Fritiofson <andreas.fritiofson@gmail.com> Reviewed-on: http://openocd.zylin.com/3106 Tested-by: jenkins
This commit is contained in:
parent
1662508911
commit
ef49b34b2a
|
@ -7604,6 +7604,20 @@ requests by using a special SVC instruction that is trapped at the
|
||||||
Supervisor Call vector by OpenOCD.
|
Supervisor Call vector by OpenOCD.
|
||||||
@end deffn
|
@end deffn
|
||||||
|
|
||||||
|
@deffn Command {arm semihosting_cmdline} [@option{enable}|@option{disable}]
|
||||||
|
@cindex ARM semihosting
|
||||||
|
Set the command line to be passed to the debuggee.
|
||||||
|
|
||||||
|
@example
|
||||||
|
arm semihosting_cmdline argv0 argv1 argv2 ...
|
||||||
|
@end example
|
||||||
|
|
||||||
|
This option lets one set the command line arguments to be passed to
|
||||||
|
the program. The first argument (argv0) is the program name in a
|
||||||
|
standard C environment (argv[0]). Depending on the program (not much
|
||||||
|
programs look at argv[0]), argv0 is ignored and can be any string.
|
||||||
|
@end deffn
|
||||||
|
|
||||||
@deffn Command {arm semihosting_fileio} [@option{enable}|@option{disable}]
|
@deffn Command {arm semihosting_fileio} [@option{enable}|@option{disable}]
|
||||||
@cindex ARM semihosting
|
@cindex ARM semihosting
|
||||||
Display status of semihosting fileio, after optionally changing that
|
Display status of semihosting fileio, after optionally changing that
|
||||||
|
|
|
@ -157,6 +157,9 @@ struct arm {
|
||||||
|
|
||||||
int (*setup_semihosting)(struct target *target, int enable);
|
int (*setup_semihosting)(struct target *target, int enable);
|
||||||
|
|
||||||
|
/** Semihosting command line. */
|
||||||
|
char *semihosting_cmdline;
|
||||||
|
|
||||||
/** Backpointer to the target. */
|
/** Backpointer to the target. */
|
||||||
struct target *target;
|
struct target *target;
|
||||||
|
|
||||||
|
|
|
@ -465,7 +465,7 @@ static int do_semihosting(struct target *target)
|
||||||
else {
|
else {
|
||||||
uint32_t a = target_buffer_get_u32(target, params+0);
|
uint32_t a = target_buffer_get_u32(target, params+0);
|
||||||
uint32_t l = target_buffer_get_u32(target, params+4);
|
uint32_t l = target_buffer_get_u32(target, params+4);
|
||||||
char *arg = "foobar";
|
char *arg = arm->semihosting_cmdline != NULL ? arm->semihosting_cmdline : "";
|
||||||
uint32_t s = strlen(arg) + 1;
|
uint32_t s = strlen(arg) + 1;
|
||||||
if (l < s)
|
if (l < s)
|
||||||
arm->semihosting_result = -1;
|
arm->semihosting_result = -1;
|
||||||
|
|
|
@ -1091,6 +1091,42 @@ COMMAND_HANDLER(handle_arm_semihosting_fileio_command)
|
||||||
return ERROR_OK;
|
return ERROR_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
COMMAND_HANDLER(handle_arm_semihosting_cmdline)
|
||||||
|
{
|
||||||
|
struct target *target = get_current_target(CMD_CTX);
|
||||||
|
unsigned int i;
|
||||||
|
|
||||||
|
if (target == NULL) {
|
||||||
|
LOG_ERROR("No target selected");
|
||||||
|
return ERROR_FAIL;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct arm *arm = target_to_arm(target);
|
||||||
|
|
||||||
|
if (!is_arm(arm)) {
|
||||||
|
command_print(CMD_CTX, "current target isn't an ARM");
|
||||||
|
return ERROR_FAIL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!arm->setup_semihosting) {
|
||||||
|
command_print(CMD_CTX, "semihosting not supported for current target");
|
||||||
|
return ERROR_FAIL;
|
||||||
|
}
|
||||||
|
|
||||||
|
free(arm->semihosting_cmdline);
|
||||||
|
arm->semihosting_cmdline = CMD_ARGC > 0 ? strdup(CMD_ARGV[0]) : NULL;
|
||||||
|
|
||||||
|
for (i = 1; i < CMD_ARGC; i++) {
|
||||||
|
char *cmdline = alloc_printf("%s %s", arm->semihosting_cmdline, CMD_ARGV[i]);
|
||||||
|
if (cmdline == NULL)
|
||||||
|
break;
|
||||||
|
free(arm->semihosting_cmdline);
|
||||||
|
arm->semihosting_cmdline = cmdline;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ERROR_OK;
|
||||||
|
}
|
||||||
|
|
||||||
static const struct command_registration arm_exec_command_handlers[] = {
|
static const struct command_registration arm_exec_command_handlers[] = {
|
||||||
{
|
{
|
||||||
.name = "reg",
|
.name = "reg",
|
||||||
|
@ -1133,6 +1169,13 @@ static const struct command_registration arm_exec_command_handlers[] = {
|
||||||
.usage = "['enable'|'disable']",
|
.usage = "['enable'|'disable']",
|
||||||
.help = "activate support for semihosting operations",
|
.help = "activate support for semihosting operations",
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"semihosting_cmdline",
|
||||||
|
.handler = handle_arm_semihosting_cmdline,
|
||||||
|
.mode = COMMAND_EXEC,
|
||||||
|
.usage = "arguments",
|
||||||
|
.help = "command line arguments to be passed to program",
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"semihosting_fileio",
|
"semihosting_fileio",
|
||||||
.handler = handle_arm_semihosting_fileio_command,
|
.handler = handle_arm_semihosting_fileio_command,
|
||||||
|
|
Loading…
Reference in New Issue