...and here's the prefetch version (fixed one little mistake...):

diff --git a/src/target/arm_semihosting.c b/src/target/arm_semihosting.c
index a247cc8..ef13f68 100644
--- a/src/target/arm_semihosting.c
+++ b/src/target/arm_semihosting.c
@@ -136,18 +136,26 @@ static int do_semihosting(struct target *target)
                }
                break;

-       case 0x04:      /* SYS_WRITE0 */
-               do {
-                       unsigned char c;
-                       retval = target_read_memory(target, r1, 1, 1, &c);
-                       if (retval != ERROR_OK)
-                               return retval;
-                       if (!c)
-                               break;
-                       putchar(c);
-               } while (1);
-               result = 0;
-               break;
+#define WRITE0_PREFETCH 16
+
+    case 0x04:  /* SYS_WRITE0 */
+        do {
+            unsigned char c[WRITE0_PREFETCH];
+            int i;
+            retval = target_read_memory(target, r1, 1, WRITE0_PREFETCH, c);
+            if (retval != ERROR_OK)
+                return retval;
+            r1 += WRITE0_PREFETCH;
+            for (i=0; i < WRITE0_PREFETCH; i++) {
+                if (!c[i])
+                    break;
+                putchar(c[i]);
+            }
+            if (i < WRITE0_PREFETCH)
+                break;
+        } while (1);
+        result = 0;
+        break;

        case 0x05:      /* SYS_WRITE */
                retval = target_read_memory(target, r1, 4, 3, params);




On Mon, Mar 14, 2011 at 12:14 PM, John and Tina Peterson <j...@byu.edu>wrote:

> In the latest git commit of openocd-0.5.0-dev, this is the code that
> handles the semihosting call SYS_WRITE0:
>
>     case 0x04:  /* SYS_WRITE0 */
>         do {
>             unsigned char c;
>             retval = target_read_memory(target, r1, 1, 1, &c);
>             if (retval != ERROR_OK)
>                 return retval;
>             if (!c)
>                 break;
>             putchar(c);
>         } while (1);
>         result = 0;
>         break;
>
>
> Problem is, trying to print "Hello, world!\n" just prints endless H's,
> because r1 is never incremented.
>
> One way to fix it would be to add a "++" after "r1".
>
> Additionally, it would be much more efficient to amortize the USB/JTAG
> round trip times by grabbing more than one byte at a time.  Something like
> this:
>
> #define WRITE0_PREFETCH 16
>
>     case 0x04:  /* SYS_WRITE0 */
>         do {
>             unsigned char c[WRITE0_PREFETCH];
>             int i;
>             retval = target_read_memory(target, r1, 1, WRITE0_PREFETCH,
> &c);
>             if (retval != ERROR_OK)
>                 return retval;
>             r1 += WRITE0_PREFETCH;
>             for (i=0; i < WRITE0_PREFETCH; i++) {
>                 if (!c[i])
>                     break;
>                 putchar(c[i]);
>             }
>             if (i < WRITE0_PREFETCH)
>                 break;
>         } while (1);
>         result = 0;
>         break;
>
> ...with the caveat that this would error out if the end of the string is
> within 16 bytes of the end of memory. Probably a reasonable risk or some
> code could detect that.
>
> John K Peterson
>
>
>
_______________________________________________
Openocd-development mailing list
Openocd-development@lists.berlios.de
https://lists.berlios.de/mailman/listinfo/openocd-development

Reply via email to