Diff for /qemu/arm-semi.c between versions 1.1.1.7 and 1.1.1.8

version 1.1.1.7, 2018/04/24 18:56:34 version 1.1.1.8, 2018/04/24 19:35:00
Line 37 Line 37
 #include "hw/arm-misc.h"  #include "hw/arm-misc.h"
 #endif  #endif
   
 #define SYS_OPEN        0x01  #define TARGET_SYS_OPEN        0x01
 #define SYS_CLOSE       0x02  #define TARGET_SYS_CLOSE       0x02
 #define SYS_WRITEC      0x03  #define TARGET_SYS_WRITEC      0x03
 #define SYS_WRITE0      0x04  #define TARGET_SYS_WRITE0      0x04
 #define SYS_WRITE       0x05  #define TARGET_SYS_WRITE       0x05
 #define SYS_READ        0x06  #define TARGET_SYS_READ        0x06
 #define SYS_READC       0x07  #define TARGET_SYS_READC       0x07
 #define SYS_ISTTY       0x09  #define TARGET_SYS_ISTTY       0x09
 #define SYS_SEEK        0x0a  #define TARGET_SYS_SEEK        0x0a
 #define SYS_FLEN        0x0c  #define TARGET_SYS_FLEN        0x0c
 #define SYS_TMPNAM      0x0d  #define TARGET_SYS_TMPNAM      0x0d
 #define SYS_REMOVE      0x0e  #define TARGET_SYS_REMOVE      0x0e
 #define SYS_RENAME      0x0f  #define TARGET_SYS_RENAME      0x0f
 #define SYS_CLOCK       0x10  #define TARGET_SYS_CLOCK       0x10
 #define SYS_TIME        0x11  #define TARGET_SYS_TIME        0x11
 #define SYS_SYSTEM      0x12  #define TARGET_SYS_SYSTEM      0x12
 #define SYS_ERRNO       0x13  #define TARGET_SYS_ERRNO       0x13
 #define SYS_GET_CMDLINE 0x15  #define TARGET_SYS_GET_CMDLINE 0x15
 #define SYS_HEAPINFO    0x16  #define TARGET_SYS_HEAPINFO    0x16
 #define SYS_EXIT        0x18  #define TARGET_SYS_EXIT        0x18
   
 #ifndef O_BINARY  #ifndef O_BINARY
 #define O_BINARY 0  #define O_BINARY 0
Line 108  static inline uint32_t set_swi_errno(Tas Line 108  static inline uint32_t set_swi_errno(Tas
     return code;      return code;
 }  }
 #else  #else
 static inline uint32_t set_swi_errno(CPUState *env, uint32_t code)  static inline uint32_t set_swi_errno(CPUARMState *env, uint32_t code)
 {  {
     return code;      return code;
 }  }
Line 122  static target_ulong arm_semi_syscall_len Line 122  static target_ulong arm_semi_syscall_len
 static target_ulong syscall_err;  static target_ulong syscall_err;
 #endif  #endif
   
 static void arm_semi_cb(CPUState *env, target_ulong ret, target_ulong err)  static void arm_semi_cb(CPUARMState *env, target_ulong ret, target_ulong err)
 {  {
 #ifdef CONFIG_USER_ONLY  #ifdef CONFIG_USER_ONLY
     TaskState *ts = env->opaque;      TaskState *ts = env->opaque;
Line 138  static void arm_semi_cb(CPUState *env, t Line 138  static void arm_semi_cb(CPUState *env, t
     } else {      } else {
         /* Fixup syscalls that use nonstardard return conventions.  */          /* Fixup syscalls that use nonstardard return conventions.  */
         switch (env->regs[0]) {          switch (env->regs[0]) {
         case SYS_WRITE:          case TARGET_SYS_WRITE:
         case SYS_READ:          case TARGET_SYS_READ:
             env->regs[0] = arm_semi_syscall_len - ret;              env->regs[0] = arm_semi_syscall_len - ret;
             break;              break;
         case SYS_SEEK:          case TARGET_SYS_SEEK:
             env->regs[0] = 0;              env->regs[0] = 0;
             break;              break;
         default:          default:
Line 152  static void arm_semi_cb(CPUState *env, t Line 152  static void arm_semi_cb(CPUState *env, t
     }      }
 }  }
   
 static void arm_semi_flen_cb(CPUState *env, target_ulong ret, target_ulong err)  static void arm_semi_flen_cb(CPUARMState *env, target_ulong ret, target_ulong err)
 {  {
     /* The size is always stored in big-endian order, extract      /* The size is always stored in big-endian order, extract
        the value. We assume the size always fit in 32 bits.  */         the value. We assume the size always fit in 32 bits.  */
Line 174  static void arm_semi_flen_cb(CPUState *e Line 174  static void arm_semi_flen_cb(CPUState *e
     __arg;                                      \      __arg;                                      \
 })  })
 #define SET_ARG(n, val) put_user_ual(val, args + (n) * 4)  #define SET_ARG(n, val) put_user_ual(val, args + (n) * 4)
 uint32_t do_arm_semihosting(CPUState *env)  uint32_t do_arm_semihosting(CPUARMState *env)
 {  {
     target_ulong args;      target_ulong args;
     char * s;      char * s;
Line 184  uint32_t do_arm_semihosting(CPUState *en Line 184  uint32_t do_arm_semihosting(CPUState *en
 #ifdef CONFIG_USER_ONLY  #ifdef CONFIG_USER_ONLY
     TaskState *ts = env->opaque;      TaskState *ts = env->opaque;
 #else  #else
     CPUState *ts = env;      CPUARMState *ts = env;
 #endif  #endif
   
     nr = env->regs[0];      nr = env->regs[0];
     args = env->regs[1];      args = env->regs[1];
     switch (nr) {      switch (nr) {
     case SYS_OPEN:      case TARGET_SYS_OPEN:
         if (!(s = lock_user_string(ARG(0))))          if (!(s = lock_user_string(ARG(0))))
             /* FIXME - should this error code be -TARGET_EFAULT ? */              /* FIXME - should this error code be -TARGET_EFAULT ? */
             return (uint32_t)-1;              return (uint32_t)-1;
Line 211  uint32_t do_arm_semihosting(CPUState *en Line 211  uint32_t do_arm_semihosting(CPUState *en
         }          }
         unlock_user(s, ARG(0), 0);          unlock_user(s, ARG(0), 0);
         return ret;          return ret;
     case SYS_CLOSE:      case TARGET_SYS_CLOSE:
         if (use_gdb_syscalls()) {          if (use_gdb_syscalls()) {
             gdb_do_syscall(arm_semi_cb, "close,%x", ARG(0));              gdb_do_syscall(arm_semi_cb, "close,%x", ARG(0));
             return env->regs[0];              return env->regs[0];
         } else {          } else {
             return set_swi_errno(ts, close(ARG(0)));              return set_swi_errno(ts, close(ARG(0)));
         }          }
     case SYS_WRITEC:      case TARGET_SYS_WRITEC:
         {          {
           char c;            char c;
   
Line 233  uint32_t do_arm_semihosting(CPUState *en Line 233  uint32_t do_arm_semihosting(CPUState *en
                 return write(STDERR_FILENO, &c, 1);                  return write(STDERR_FILENO, &c, 1);
           }            }
         }          }
     case SYS_WRITE0:      case TARGET_SYS_WRITE0:
         if (!(s = lock_user_string(args)))          if (!(s = lock_user_string(args)))
             /* FIXME - should this error code be -TARGET_EFAULT ? */              /* FIXME - should this error code be -TARGET_EFAULT ? */
             return (uint32_t)-1;              return (uint32_t)-1;
Line 246  uint32_t do_arm_semihosting(CPUState *en Line 246  uint32_t do_arm_semihosting(CPUState *en
         }          }
         unlock_user(s, args, 0);          unlock_user(s, args, 0);
         return ret;          return ret;
     case SYS_WRITE:      case TARGET_SYS_WRITE:
         len = ARG(2);          len = ARG(2);
         if (use_gdb_syscalls()) {          if (use_gdb_syscalls()) {
             arm_semi_syscall_len = len;              arm_semi_syscall_len = len;
Line 262  uint32_t do_arm_semihosting(CPUState *en Line 262  uint32_t do_arm_semihosting(CPUState *en
                 return -1;                  return -1;
             return len - ret;              return len - ret;
         }          }
     case SYS_READ:      case TARGET_SYS_READ:
         len = ARG(2);          len = ARG(2);
         if (use_gdb_syscalls()) {          if (use_gdb_syscalls()) {
             arm_semi_syscall_len = len;              arm_semi_syscall_len = len;
Line 280  uint32_t do_arm_semihosting(CPUState *en Line 280  uint32_t do_arm_semihosting(CPUState *en
                 return -1;                  return -1;
             return len - ret;              return len - ret;
         }          }
     case SYS_READC:      case TARGET_SYS_READC:
        /* XXX: Read from debug cosole. Not implemented.  */         /* XXX: Read from debug cosole. Not implemented.  */
         return 0;          return 0;
     case SYS_ISTTY:      case TARGET_SYS_ISTTY:
         if (use_gdb_syscalls()) {          if (use_gdb_syscalls()) {
             gdb_do_syscall(arm_semi_cb, "isatty,%x", ARG(0));              gdb_do_syscall(arm_semi_cb, "isatty,%x", ARG(0));
             return env->regs[0];              return env->regs[0];
         } else {          } else {
             return isatty(ARG(0));              return isatty(ARG(0));
         }          }
     case SYS_SEEK:      case TARGET_SYS_SEEK:
         if (use_gdb_syscalls()) {          if (use_gdb_syscalls()) {
             gdb_do_syscall(arm_semi_cb, "lseek,%x,%x,0", ARG(0), ARG(1));              gdb_do_syscall(arm_semi_cb, "lseek,%x,%x,0", ARG(0), ARG(1));
             return env->regs[0];              return env->regs[0];
Line 300  uint32_t do_arm_semihosting(CPUState *en Line 300  uint32_t do_arm_semihosting(CPUState *en
               return -1;                return -1;
             return 0;              return 0;
         }          }
     case SYS_FLEN:      case TARGET_SYS_FLEN:
         if (use_gdb_syscalls()) {          if (use_gdb_syscalls()) {
             gdb_do_syscall(arm_semi_flen_cb, "fstat,%x,%x",              gdb_do_syscall(arm_semi_flen_cb, "fstat,%x,%x",
                            ARG(0), env->regs[13]-64);                             ARG(0), env->regs[13]-64);
Line 312  uint32_t do_arm_semihosting(CPUState *en Line 312  uint32_t do_arm_semihosting(CPUState *en
                 return -1;                  return -1;
             return buf.st_size;              return buf.st_size;
         }          }
     case SYS_TMPNAM:      case TARGET_SYS_TMPNAM:
         /* XXX: Not implemented.  */          /* XXX: Not implemented.  */
         return -1;          return -1;
     case SYS_REMOVE:      case TARGET_SYS_REMOVE:
         if (use_gdb_syscalls()) {          if (use_gdb_syscalls()) {
             gdb_do_syscall(arm_semi_cb, "unlink,%s", ARG(0), (int)ARG(1)+1);              gdb_do_syscall(arm_semi_cb, "unlink,%s", ARG(0), (int)ARG(1)+1);
             ret = env->regs[0];              ret = env->regs[0];
Line 327  uint32_t do_arm_semihosting(CPUState *en Line 327  uint32_t do_arm_semihosting(CPUState *en
             unlock_user(s, ARG(0), 0);              unlock_user(s, ARG(0), 0);
         }          }
         return ret;          return ret;
     case SYS_RENAME:      case TARGET_SYS_RENAME:
         if (use_gdb_syscalls()) {          if (use_gdb_syscalls()) {
             gdb_do_syscall(arm_semi_cb, "rename,%s,%s",              gdb_do_syscall(arm_semi_cb, "rename,%s,%s",
                            ARG(0), (int)ARG(1)+1, ARG(2), (int)ARG(3)+1);                             ARG(0), (int)ARG(1)+1, ARG(2), (int)ARG(3)+1);
Line 347  uint32_t do_arm_semihosting(CPUState *en Line 347  uint32_t do_arm_semihosting(CPUState *en
                 unlock_user(s, ARG(0), 0);                  unlock_user(s, ARG(0), 0);
             return ret;              return ret;
         }          }
     case SYS_CLOCK:      case TARGET_SYS_CLOCK:
         return clock() / (CLOCKS_PER_SEC / 100);          return clock() / (CLOCKS_PER_SEC / 100);
     case SYS_TIME:      case TARGET_SYS_TIME:
         return set_swi_errno(ts, time(NULL));          return set_swi_errno(ts, time(NULL));
     case SYS_SYSTEM:      case TARGET_SYS_SYSTEM:
         if (use_gdb_syscalls()) {          if (use_gdb_syscalls()) {
             gdb_do_syscall(arm_semi_cb, "system,%s", ARG(0), (int)ARG(1)+1);              gdb_do_syscall(arm_semi_cb, "system,%s", ARG(0), (int)ARG(1)+1);
             return env->regs[0];              return env->regs[0];
Line 363  uint32_t do_arm_semihosting(CPUState *en Line 363  uint32_t do_arm_semihosting(CPUState *en
             unlock_user(s, ARG(0), 0);              unlock_user(s, ARG(0), 0);
             return ret;              return ret;
         }          }
     case SYS_ERRNO:      case TARGET_SYS_ERRNO:
 #ifdef CONFIG_USER_ONLY  #ifdef CONFIG_USER_ONLY
         return ts->swi_errno;          return ts->swi_errno;
 #else  #else
         return syscall_err;          return syscall_err;
 #endif  #endif
     case SYS_GET_CMDLINE:      case TARGET_SYS_GET_CMDLINE:
         {          {
             /* Build a command-line from the original argv.              /* Build a command-line from the original argv.
              *               *
Line 452  uint32_t do_arm_semihosting(CPUState *en Line 452  uint32_t do_arm_semihosting(CPUState *en
   
             return status;              return status;
         }          }
     case SYS_HEAPINFO:      case TARGET_SYS_HEAPINFO:
         {          {
             uint32_t *ptr;              uint32_t *ptr;
             uint32_t limit;              uint32_t limit;
Line 498  uint32_t do_arm_semihosting(CPUState *en Line 498  uint32_t do_arm_semihosting(CPUState *en
 #endif  #endif
             return 0;              return 0;
         }          }
     case SYS_EXIT:      case TARGET_SYS_EXIT:
         gdb_exit(env, 0);          gdb_exit(env, 0);
         exit(0);          exit(0);
     default:      default:

Removed from v.1.1.1.7  
changed lines
  Added in v.1.1.1.8


unix.superglobalmegacorp.com