Diff for /qemu/arm-semi.c between versions 1.1.1.5 and 1.1.1.6

version 1.1.1.5, 2018/04/24 18:24:28 version 1.1.1.6, 2018/04/24 18:34:19
Line 373  uint32_t do_arm_semihosting(CPUState *en Line 373  uint32_t do_arm_semihosting(CPUState *en
 #ifdef CONFIG_USER_ONLY  #ifdef CONFIG_USER_ONLY
         /* Build a commandline from the original argv.  */          /* Build a commandline from the original argv.  */
         {          {
             char **arg = ts->info->host_argv;              char *arm_cmdline_buffer;
             int len = ARG(1);              const char *host_cmdline_buffer;
             /* lock the buffer on the ARM side */  
             char *cmdline_buffer = (char*)lock_user(VERIFY_WRITE, ARG(0), len, 0);  
   
             if (!cmdline_buffer)              unsigned int i;
                 /* FIXME - should this error code be -TARGET_EFAULT ? */              unsigned int arm_cmdline_len = ARG(1);
                 return (uint32_t)-1;              unsigned int host_cmdline_len =
                   ts->info->arg_end-ts->info->arg_start;
   
             s = cmdline_buffer;              if (!arm_cmdline_len || host_cmdline_len > arm_cmdline_len) {
             while (*arg && len > 2) {                  return -1; /* not enough space to store command line */
                 int n = strlen(*arg);              }
   
                 if (s != cmdline_buffer) {              if (!host_cmdline_len) {
                     *(s++) = ' ';                  /* We special-case the "empty command line" case (argc==0).
                     len--;                     Just provide the terminating 0. */
                 }                  arm_cmdline_buffer = lock_user(VERIFY_WRITE, ARG(0), 1, 0);
                 if (n >= len)                  arm_cmdline_buffer[0] = 0;
                     n = len - 1;                  unlock_user(arm_cmdline_buffer, ARG(0), 1);
                 memcpy(s, *arg, n);  
                 s += n;                  /* Adjust the commandline length argument. */
                 len -= n;                  SET_ARG(1, 0);
                 arg++;                  return 0;
             }              }
             /* Null terminate the string.  */  
             *s = 0;  
             len = s - cmdline_buffer;  
   
             /* Unlock the buffer on the ARM side.  */              /* lock the buffers on the ARM side */
             unlock_user(cmdline_buffer, ARG(0), len);              arm_cmdline_buffer =
                   lock_user(VERIFY_WRITE, ARG(0), host_cmdline_len, 0);
               host_cmdline_buffer =
                   lock_user(VERIFY_READ, ts->info->arg_start,
                                          host_cmdline_len, 1);
   
               if (arm_cmdline_buffer && host_cmdline_buffer)
               {
                   /* the last argument is zero-terminated;
                      no need for additional termination */
                   memcpy(arm_cmdline_buffer, host_cmdline_buffer,
                          host_cmdline_len);
   
                   /* separate arguments by white spaces */
                   for (i = 0; i < host_cmdline_len-1; i++) {
                       if (arm_cmdline_buffer[i] == 0) {
                           arm_cmdline_buffer[i] = ' ';
                       }
                   }
   
                   /* Adjust the commandline length argument. */
                   SET_ARG(1, host_cmdline_len-1);
               }
   
             /* Adjust the commandline length argument.  */              /* Unlock the buffers on the ARM side.  */
             SET_ARG(1, len);              unlock_user(arm_cmdline_buffer, ARG(0), host_cmdline_len);
               unlock_user((void*)host_cmdline_buffer, ts->info->arg_start, 0);
   
             /* Return success if commandline fit into buffer.  */              /* Return success if we could return a commandline.  */
             return *arg ? -1 : 0;              return (arm_cmdline_buffer && host_cmdline_buffer) ? 0 : -1;
         }          }
 #else  #else
       return -1;          return -1;
 #endif  #endif
     case SYS_HEAPINFO:      case SYS_HEAPINFO:
         {          {

Removed from v.1.1.1.5  
changed lines
  Added in v.1.1.1.6


unix.superglobalmegacorp.com