Merge branch 'for-linux-user' of https://git.gitorious.org/qemu-m68k/qemu-m68k into...
authorAnthony Liguori <aliguori@us.ibm.com>
Wed, 6 Feb 2013 22:39:04 +0000 (16:39 -0600)
committerAnthony Liguori <aliguori@us.ibm.com>
Wed, 6 Feb 2013 22:39:04 +0000 (16:39 -0600)
* 'for-linux-user' of https://git.gitorious.org/qemu-m68k/qemu-m68k:
  linux-user: correct reboot()
  linux-user: correct setsockopt()
  linux-user: correct print_timeval() swap tv_sec and tv_usec
  linux-user: correct msgrcv()

Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
1  2 
linux-user/syscall.c

diff --combined linux-user/syscall.c
index a148d9f7f45c692cd565f9a53167b04ab1690d65,08538fc35c4d224c9a4cccc51f5bab7c7e875d71..9e31ea72004ae3bc4b98f51a22255056c03af82a
@@@ -101,6 -101,7 +101,7 @@@ int __clone2(int (*fn)(void *), void *c
  #include <linux/fb.h>
  #include <linux/vt.h>
  #include <linux/dm-ioctl.h>
+ #include <linux/reboot.h>
  #include "linux_loop.h"
  #include "cpu-uname.h"
  
@@@ -1489,6 -1490,28 +1490,28 @@@ static abi_long do_setsockopt(int sockf
          break;
      case TARGET_SOL_SOCKET:
          switch (optname) {
+         case TARGET_SO_RCVTIMEO:
+         {
+                 struct timeval tv;
+                 optname = SO_RCVTIMEO;
+ set_timeout:
+                 if (optlen != sizeof(struct target_timeval)) {
+                     return -TARGET_EINVAL;
+                 }
+                 if (copy_from_user_timeval(&tv, optval_addr)) {
+                     return -TARGET_EFAULT;
+                 }
+                 ret = get_errno(setsockopt(sockfd, SOL_SOCKET, optname,
+                                 &tv, sizeof(tv)));
+                 return ret;
+         }
+         case TARGET_SO_SNDTIMEO:
+                 optname = SO_SNDTIMEO;
+                 goto set_timeout;
              /* Options with 'int' argument.  */
          case TARGET_SO_DEBUG:
                optname = SO_DEBUG;
          case TARGET_SO_RCVLOWAT:
                optname = SO_RCVLOWAT;
                break;
-         case TARGET_SO_RCVTIMEO:
-               optname = SO_RCVTIMEO;
-               break;
-         case TARGET_SO_SNDTIMEO:
-               optname = SO_SNDTIMEO;
-               break;
              break;
          default:
              goto unimplemented;
@@@ -2897,7 -2914,7 +2914,7 @@@ static inline abi_long do_msgrcv(int ms
          return -TARGET_EFAULT;
  
      host_mb = g_malloc(msgsz+sizeof(long));
-     ret = get_errno(msgrcv(msqid, host_mb, msgsz, tswapal(msgtyp), msgflg));
+     ret = get_errno(msgrcv(msqid, host_mb, msgsz, msgtyp, msgflg));
  
      if (ret > 0) {
          abi_ulong target_mtext_addr = msgp + sizeof(abi_ulong);
@@@ -3189,7 -3206,7 +3206,7 @@@ static abi_long do_ipc(unsigned int cal
                      break;
                  }
  
-                 ret = do_msgrcv(first, tmp->msgp, second, tmp->msgtyp, third);
+                 ret = do_msgrcv(first, tswapal(tmp->msgp), second, tswapal(tmp->msgtyp), third);
  
                  unlock_user_struct(tmp, ptr, 0);
                  break;
@@@ -5202,7 -5219,7 +5219,7 @@@ abi_long do_syscall(void *cpu_env, int 
                          NULL, NULL, 0);
            }
            thread_env = NULL;
 -          object_delete(OBJECT(ENV_GET_CPU(cpu_env)));
 +          object_unref(OBJECT(ENV_GET_CPU(cpu_env)));
            g_free(ts);
            pthread_exit(NULL);
        }
          break;
  #endif
      case TARGET_NR_reboot:
-         if (!(p = lock_user_string(arg4)))
-             goto efault;
-         ret = reboot(arg1, arg2, arg3, p);
-         unlock_user(p, arg4, 0);
+         if (arg3 == LINUX_REBOOT_CMD_RESTART2) {
+            /* arg4 must be ignored in all other cases */
+            p = lock_user_string(arg4);
+            if (!p) {
+               goto efault;
+            }
+            ret = get_errno(reboot(arg1, arg2, arg3, p));
+            unlock_user(p, arg4, 0);
+         } else {
+            ret = get_errno(reboot(arg1, arg2, arg3, NULL));
+         }
          break;
  #ifdef TARGET_NR_readdir
      case TARGET_NR_readdir: