GDB fileIO stdout support

This patch fixes gdb fileio support to allow gdb console to be used as stdout.

Now we can do something like
gdb <inferior file>

(gdb) tar ext :3333
(gdb) load
(gdb) monitor arm semihosting enable
(gdb) monitor arm semihosting_fileio enable
(gdb) continue

Here: Output from inferior using puts, printf etc will be routed to gdb console.

Change-Id: I9cb0dddda1de58038c84f5b035c38229828cd744
Signed-off-by: Omair Javaid <omair.javaid@linaro.org>
Reviewed-on: http://openocd.zylin.com/4538
Tested-by: jenkins
Reviewed-by: Matthias Welwarsky <matthias@welwarsky.de>
bscan_tunnel
Omair Javaid 2018-05-31 05:26:49 +05:00 committed by Matthias Welwarsky
parent a7da117ad6
commit 0aa8e8cfc3
1 changed files with 19 additions and 5 deletions

View File

@ -225,6 +225,10 @@ int semihosting_common(struct target *target)
else {
int fd = semihosting_get_field(target, 0, fields);
if (semihosting->is_fileio) {
if (fd == 0 || fd == 1 || fd == 2) {
semihosting->result = 0;
break;
}
semihosting->hit_fileio = true;
fileio_info->identifier = "close";
fileio_info->param_1 = fd;
@ -445,8 +449,8 @@ int semihosting_common(struct target *target)
* - 1 if an error occurs.
*/
if (semihosting->is_fileio) {
LOG_ERROR("SYS_FLEN not supported by semihosting fileio");
return ERROR_FAIL;
semihosting->result = -1;
semihosting->sys_errno = EINVAL;
}
retval = semihosting_read_fields(target, 1, fields);
if (retval != ERROR_OK)
@ -690,9 +694,19 @@ int semihosting_common(struct target *target)
/* TODO: implement the :semihosting-features special file.
* */
if (semihosting->is_fileio) {
if (strcmp((char *)fn, ":tt") == 0)
semihosting->result = 0;
else {
if (strcmp((char *)fn, ":semihosting-features") == 0) {
semihosting->result = -1;
semihosting->sys_errno = EINVAL;
} else if (strcmp((char *)fn, ":tt") == 0) {
if (mode == 0)
semihosting->result = 0;
else if (mode == 4)
semihosting->result = 1;
else if (mode == 8)
semihosting->result = 2;
else
semihosting->result = -1;
} else {
semihosting->hit_fileio = true;
fileio_info->identifier = "open";
fileio_info->param_1 = addr;