aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOmair Javaid <omair.javaid@linaro.org>2018-05-31 05:26:49 +0500
committerMatthias Welwarsky <matthias@welwarsky.de>2018-07-13 09:18:21 +0100
commit0aa8e8cfc3c28f4fcbba549db45be4e712f02c0a (patch)
tree1c2e091dcb9ca56a3cef73812c87b6b4c9d3b673
parenta7da117ad6bc1749863c14fdeef2bd4898620574 (diff)
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>
-rw-r--r--src/target/semihosting_common.c24
1 files changed, 19 insertions, 5 deletions
diff --git a/src/target/semihosting_common.c b/src/target/semihosting_common.c
index 7ef1810e..59207897 100644
--- a/src/target/semihosting_common.c
+++ b/src/target/semihosting_common.c
@@ -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;