This is an automated email from Gerrit.

Brandon Warhurst ([email protected]) just uploaded a new patch set to 
Gerrit, which you can find at http://openocd.zylin.com/1345

-- gerrit

commit 768f393010d098115dad81eec6f3ce2a0ac3ccdf
Author: Brandon Warhurst <[email protected]>
Date:   Thu Apr 18 14:05:26 2013 -0400

    Added functionality to the SYS_SYSTEM semihosting call.
    
    Change-Id: Ie17dc96c6d48227a3dc9ff1e21201a85498a10b1
    Signed-off-by: Brandon Warhurst <[email protected]>

diff --git a/src/target/arm_semihosting.c b/src/target/arm_semihosting.c
index 115c7d4..238a199 100644
--- a/src/target/arm_semihosting.c
+++ b/src/target/arm_semihosting.c
@@ -374,9 +374,37 @@ static int do_semihosting(struct target *target)
                }
                return target_call_event_callbacks(target, TARGET_EVENT_HALTED);
 
+       case 0x12:      /* SYS_SYSTEM */
+               /* Provide SYS_SYSTEM functionality.  Uses the 
+                * libc system command, there may be a reason *NOT*
+                * to use this, but as I can't think of one, I
+                * implemented it this way.
+                */
+               retval = target_read_memory(target, r1, 4, 2, params);
+               if (retval != ERROR_OK)
+                       return retval;
+               else {
+                       //printf ("Reading from address 0x%08x\n",r1);
+                       //printf ("Got a system 
command[0x%08x,0x%08x]\n",*(unsigned int *)params,*(unsigned int *)(params+4));
+                       uint32_t len = target_buffer_get_u32(target, params+4);
+                       uint32_t c_ptr = target_buffer_get_u32(target, params);
+                       uint8_t cmd[256];
+                       //printf ("Got a system 
command[0x%08x,0x%08x]\n",c_ptr,len);
+                       if(len > 255) {
+                               result = -1;
+                               arm->semihosting_errno = EINVAL;
+                       } else {
+                               memset(cmd,0x0,256);
+                               retval = target_read_memory(target, c_ptr, 1, 
len, cmd);
+                               if (retval != ERROR_OK)
+                                       return retval;
+                               else
+                                       result = system((const char *)cmd);
+                       }
+               }
+               break;
        case 0x0d:      /* SYS_TMPNAM */
        case 0x10:      /* SYS_CLOCK */
-       case 0x12:      /* SYS_SYSTEM */
        case 0x17:      /* angel_SWIreason_EnterSVC */
        case 0x30:      /* SYS_ELAPSED */
        case 0x31:      /* SYS_TICKFREQ */

-- 

------------------------------------------------------------------------------
Precog is a next-generation analytics platform capable of advanced
analytics on semi-structured data. The platform includes APIs for building
apps and a phenomenal toolset for data science. Developers can use
our toolset for easy data analysis & visualization. Get a free account!
http://www2.precog.com/precogplatform/slashdotnewsletter
_______________________________________________
OpenOCD-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/openocd-devel

Reply via email to