changeset 593fe25c86a6 in /z/repo/gem5
details: http://repo.gem5.org/gem5?cmd=changeset;node=593fe25c86a6
description:
        syscall emulation: Clean up ioctl handling, and implement for x86.

        Enable different whitelists for different OS/arch combinations,
        since some use the generic Linux definitions only, and others
        use definitions inherited from earlier Unix flavors on those
        architectures.

        Also update x86 function pointers so ioctl is no longer
        unimplemented on that platform.

        This patch is a revised version of Vince Weaver's earlier patch.

diffstat:

 src/arch/alpha/linux/linux.hh  |  37 +++++++++++++++++++++++++++----------
 src/arch/alpha/tru64/tru64.hh  |  40 ++++++++++++++++++++++++++++++----------
 src/arch/arm/linux/linux.hh    |  14 --------------
 src/arch/mips/linux/linux.hh   |  34 ++++++++++++++++++++++++----------
 src/arch/power/linux/linux.hh  |  39 +++++++++++++++++++++++++++------------
 src/arch/sparc/linux/linux.hh  |  29 +++++++++++++++++++++++++++++
 src/arch/x86/linux/syscalls.cc |   4 ++--
 src/kern/linux/linux.hh        |  26 ++++++++++++++++++++++++++
 src/sim/syscall_emul.hh        |  22 +++++++---------------
 9 files changed, 172 insertions(+), 73 deletions(-)

diffs (truncated from 358 to 300 lines):

diff -r cfd2a8364ea1 -r 593fe25c86a6 src/arch/alpha/linux/linux.hh
--- a/src/arch/alpha/linux/linux.hh     Mon Aug 06 18:14:32 2012 -0500
+++ b/src/arch/alpha/linux/linux.hh     Mon Aug 06 16:52:40 2012 -0700
@@ -97,18 +97,35 @@
 
     //@{
     /// ioctl() command codes.
-    static const unsigned TIOCGETP_   = 0x40067408;
-    static const unsigned TIOCSETP_   = 0x80067409;
-    static const unsigned TIOCSETN_   = 0x8006740a;
-    static const unsigned TIOCSETC_   = 0x80067411;
-    static const unsigned TIOCGETC_   = 0x40067412;
-    static const unsigned FIONREAD_   = 0x4004667f;
-    static const unsigned TIOCISATTY_ = 0x2000745e;
-    static const unsigned TIOCGETS_   = 0x402c7413;
-    static const unsigned TIOCGETA_   = 0x40127417;
-    static const unsigned TCSETAW_    = 0x80147419; // 2.6.15 kernel
+    static const unsigned TGT_TIOCGETP   = 0x40067408;
+    static const unsigned TGT_TIOCSETP   = 0x80067409;
+    static const unsigned TGT_TIOCSETN   = 0x8006740a;
+    static const unsigned TGT_TIOCSETC   = 0x80067411;
+    static const unsigned TGT_TIOCGETC   = 0x40067412;
+    static const unsigned TGT_FIONREAD   = 0x4004667f;
+    static const unsigned TGT_TCGETS     = 0x402c7413;
+    static const unsigned TGT_TCGETA     = 0x40127417;
+    static const unsigned TGT_TCSETAW    = 0x80147419; // 2.6.15 kernel
     //@}
 
+    static bool
+    isTtyReq(unsigned req)
+    {
+        switch (req) {
+          case TGT_TIOCGETP:
+          case TGT_TIOCSETP:
+          case TGT_TIOCSETN:
+          case TGT_TIOCSETC:
+          case TGT_TIOCGETC:
+          case TGT_TCGETS:
+          case TGT_TCGETA:
+          case TGT_TCSETAW:
+            return true;
+          default:
+            return false;
+        }
+    }
+
     /// For table().
     static const int TBL_SYSINFO = 12;
 
diff -r cfd2a8364ea1 -r 593fe25c86a6 src/arch/alpha/tru64/tru64.hh
--- a/src/arch/alpha/tru64/tru64.hh     Mon Aug 06 18:14:32 2012 -0500
+++ b/src/arch/alpha/tru64/tru64.hh     Mon Aug 06 16:52:40 2012 -0700
@@ -91,18 +91,38 @@
 
     //@{
     /// ioctl() command codes.
-    static const unsigned TIOCGETP_   = 0x40067408;
-    static const unsigned TIOCSETP_   = 0x80067409;
-    static const unsigned TIOCSETN_   = 0x8006740a;
-    static const unsigned TIOCSETC_   = 0x80067411;
-    static const unsigned TIOCGETC_   = 0x40067412;
-    static const unsigned FIONREAD_   = 0x4004667f;
-    static const unsigned TIOCISATTY_ = 0x2000745e;
-    static const unsigned TIOCGETS_   = 0x402c7413;
-    static const unsigned TIOCGETA_   = 0x40127417;
-    static const unsigned TCSETAW_    = 0x80147419;
+    static const unsigned TGT_TIOCGETP   = 0x40067408;
+    static const unsigned TGT_TIOCSETP   = 0x80067409;
+    static const unsigned TGT_TIOCSETN   = 0x8006740a;
+    static const unsigned TGT_TIOCSETC   = 0x80067411;
+    static const unsigned TGT_TIOCGETC   = 0x40067412;
+    static const unsigned TGT_FIONREAD   = 0x4004667f;
+    static const unsigned TGT_TIOCISATTY = 0x2000745e;
+    static const unsigned TGT_TCGETS     = 0x402c7413;
+    static const unsigned TGT_TCGETA     = 0x40127417;
+    static const unsigned TGT_TCSETAW    = 0x80147419; // 2.6.15 kernel
     //@}
 
+    static bool
+    isTtyReq(unsigned req)
+    {
+        switch (req) {
+          case TGT_TIOCGETP:
+          case TGT_TIOCSETP:
+          case TGT_TIOCSETN:
+          case TGT_TIOCSETC:
+          case TGT_TIOCGETC:
+          case TGT_FIONREAD:
+          case TGT_TIOCISATTY:
+          case TGT_TCGETS:
+          case TGT_TCGETA:
+          case TGT_TCSETAW:
+            return true;
+          default:
+            return false;
+        }
+    }
+
     //@{
     /// For table().
     static const int TBL_SYSINFO = 12;
diff -r cfd2a8364ea1 -r 593fe25c86a6 src/arch/arm/linux/linux.hh
--- a/src/arch/arm/linux/linux.hh       Mon Aug 06 18:14:32 2012 -0500
+++ b/src/arch/arm/linux/linux.hh       Mon Aug 06 16:52:40 2012 -0700
@@ -100,20 +100,6 @@
     static const int TGT_RUSAGE_BOTH = -2;
     //@}
 
-    //@{
-    /// ioctl() command codes.
-    static const unsigned TIOCGETP_   = 0x5401;
-    static const unsigned TIOCSETP_   = 0x80067409;
-    static const unsigned TIOCSETN_   = 0x8006740a;
-    static const unsigned TIOCSETC_   = 0x80067411;
-    static const unsigned TIOCGETC_   = 0x40067412;
-    static const unsigned FIONREAD_   = 0x4004667f;
-    static const unsigned TIOCISATTY_ = 0x2000745e;
-    static const unsigned TIOCGETS_   = 0x402c7413;
-    static const unsigned TIOCGETA_   = 0x5405;
-    static const unsigned TCSETAW_    = 0x5407;     // 2.6.15 kernel
-    //@}
-
     /// For table().
     static const int TBL_SYSINFO = 12;
 
diff -r cfd2a8364ea1 -r 593fe25c86a6 src/arch/mips/linux/linux.hh
--- a/src/arch/mips/linux/linux.hh      Mon Aug 06 18:14:32 2012 -0500
+++ b/src/arch/mips/linux/linux.hh      Mon Aug 06 16:52:40 2012 -0700
@@ -92,18 +92,32 @@
 
     //@{
     /// ioctl() command codes.
-    static const unsigned TIOCGETP_   = 0x7408;
-    static const unsigned TIOCSETP_   = 0x7409;
-    static const unsigned TIOCSETN_   = 0x740a;
-    static const unsigned TIOCSETC_   = 0x7411;
-    static const unsigned TIOCGETC_   = 0x7412;
-    static const unsigned FIONREAD_   = 0x467f;
-    static const unsigned TIOCISATTY_ = 0x5480;
-    static const unsigned TIOCGETS_   = 0x540d;
-    static const unsigned TIOCGETA_   = 0x7417;
-    static const unsigned TCSETAW_    = 0x5403; // 2.6.15 kernel
+    static const unsigned TGT_TCGETA     = 0x5401;
+    static const unsigned TGT_TCSETAW    = 0x5403;
+    static const unsigned TGT_TCGETS     = 0x540d;
+    static const unsigned TGT_FIONREAD   = 0x467f;
+    static const unsigned TGT_TIOCGETP   = 0x7408;
+    static const unsigned TGT_TIOCSETP   = 0x7409;
+    static const unsigned TGT_TIOCSETN   = 0x740a;
     //@}
 
+    static bool
+    isTtyReq(unsigned req)
+    {
+        switch (req) {
+          case TGT_TIOCGETP:
+          case TGT_TIOCSETP:
+          case TGT_TIOCSETN:
+          case TGT_FIONREAD:
+          case TGT_TCGETS:
+          case TGT_TCGETA:
+          case TGT_TCSETAW:
+            return true;
+          default:
+            return false;
+        }
+    }
+
     /// For table().
     static const int TBL_SYSINFO = 12;
 
diff -r cfd2a8364ea1 -r 593fe25c86a6 src/arch/power/linux/linux.hh
--- a/src/arch/power/linux/linux.hh     Mon Aug 06 18:14:32 2012 -0500
+++ b/src/arch/power/linux/linux.hh     Mon Aug 06 16:52:40 2012 -0700
@@ -131,19 +131,34 @@
 
     //@{
     /// ioctl() command codes.
-    /// These are for the 2.6.15 kernel. Some have changed for
-    /// later versions.
-    static const unsigned TIOCGETP_   = 0x40067408;
-    static const unsigned TIOCSETP_   = 0x80067409;
-    static const unsigned TIOCSETN_   = 0x8006740a;
-    static const unsigned TIOCSETC_   = 0x80067411;
-    static const unsigned TIOCGETC_   = 0x40067412;
-    static const unsigned FIONREAD_   = 0x4004667f;
-    static const unsigned TIOCISATTY_ = 0x2000745e;
-    static const unsigned TIOCGETS_   = 0x402c7413;
-    static const unsigned TIOCGETA_   = 0x40147417;
-    static const unsigned TCSETAW_    = 0x80147419;
+    static const unsigned TGT_TIOCGETP   = 0x40067408;
+    static const unsigned TGT_TIOCSETP   = 0x80067409;
+    static const unsigned TGT_TIOCSETN   = 0x8006740a;
+    static const unsigned TGT_TIOCSETC   = 0x80067411;
+    static const unsigned TGT_TIOCGETC   = 0x40067412;
+    static const unsigned TGT_FIONREAD   = 0x4004667f;
+    static const unsigned TGT_TCGETS     = 0x402c7413;
+    static const unsigned TGT_TCGETA     = 0x40127417;
+    static const unsigned TGT_TCSETAW    = 0x80147419; // 2.6.15 kernel
     //@}
+
+    static bool
+    isTtyReq(unsigned req)
+    {
+        switch (req) {
+          case TGT_TIOCGETP:
+          case TGT_TIOCSETP:
+          case TGT_TIOCSETN:
+          case TGT_TIOCSETC:
+          case TGT_TIOCGETC:
+          case TGT_TCGETS:
+          case TGT_TCGETA:
+          case TGT_TCSETAW:
+            return true;
+          default:
+            return false;
+        }
+    }
 };
 
 #endif // __ARCH_POWER_LINUX_LINUX_HH__
diff -r cfd2a8364ea1 -r 593fe25c86a6 src/arch/sparc/linux/linux.hh
--- a/src/arch/sparc/linux/linux.hh     Mon Aug 06 18:14:32 2012 -0500
+++ b/src/arch/sparc/linux/linux.hh     Mon Aug 06 16:52:40 2012 -0700
@@ -94,6 +94,35 @@
         uint64_t mem_unit;  /* Memory unit size in bytes */
     } tgt_sysinfo;
 
+    //@{
+    /// ioctl() command codes.
+    /// These were calculated using the SPARC Linux headers on an x86
+    /// machine and thus may not be correct.  It would be good to
+    /// verify/update these values on an actual SPARC Linux machine.
+    static const unsigned TGT_TCGETA    = 0x40125401;
+    static const unsigned TGT_TCSETAW   = 0x80125403;
+    static const unsigned TGT_TCGETS    = 0x40385408;
+    static const unsigned TGT_FIONREAD  = 0x4004667f;
+    static const unsigned TGT_TIOCGETP  = 0x40067408;
+    static const unsigned TGT_TIOCSETP  = 0x80067409;
+    static const unsigned TGT_TIOCSETN  = 0x8006740a;
+    //@}
+
+    static bool
+    isTtyReq(unsigned req)
+    {
+        switch (req) {
+          case TGT_TIOCGETP:
+          case TGT_TIOCSETP:
+          case TGT_TIOCSETN:
+          case TGT_TCGETS:
+          case TGT_TCGETA:
+          case TGT_TCSETAW:
+            return true;
+          default:
+            return false;
+        }
+    }
 };
 
 class Sparc32Linux : public SparcLinux
diff -r cfd2a8364ea1 -r 593fe25c86a6 src/arch/x86/linux/syscalls.cc
--- a/src/arch/x86/linux/syscalls.cc    Mon Aug 06 18:14:32 2012 -0500
+++ b/src/arch/x86/linux/syscalls.cc    Mon Aug 06 16:52:40 2012 -0700
@@ -229,7 +229,7 @@
     /*  13 */ SyscallDesc("rt_sigaction", ignoreFunc),
     /*  14 */ SyscallDesc("rt_sigprocmask", ignoreFunc),
     /*  15 */ SyscallDesc("rt_sigreturn", unimplementedFunc),
-    /*  16 */ SyscallDesc("ioctl", unimplementedFunc),
+    /*  16 */ SyscallDesc("ioctl", ioctlFunc<X86Linux64>),
     /*  17 */ SyscallDesc("pread64", unimplementedFunc),
     /*  18 */ SyscallDesc("pwrite64", unimplementedFunc),
     /*  19 */ SyscallDesc("readv", unimplementedFunc),
@@ -546,7 +546,7 @@
     /*  51 */ SyscallDesc("acct", unimplementedFunc),
     /*  52 */ SyscallDesc("umount2", unimplementedFunc),
     /*  53 */ SyscallDesc("lock", unimplementedFunc),
-    /*  54 */ SyscallDesc("ioctl", unimplementedFunc),
+    /*  54 */ SyscallDesc("ioctl", ioctlFunc<X86Linux32>),
     /*  55 */ SyscallDesc("fcntl", unimplementedFunc),
     /*  56 */ SyscallDesc("mpx", unimplementedFunc),
     /*  57 */ SyscallDesc("setpgid", unimplementedFunc),
diff -r cfd2a8364ea1 -r 593fe25c86a6 src/kern/linux/linux.hh
--- a/src/kern/linux/linux.hh   Mon Aug 06 18:14:32 2012 -0500
+++ b/src/kern/linux/linux.hh   Mon Aug 06 16:52:40 2012 -0700
@@ -147,6 +147,32 @@
         uint64_t iov_len;
     };
 
+    //@{
+    /// ioctl() command codes.
+    static const unsigned TGT_TCGETS     = 0x5401;
+    static const unsigned TGT_TCGETA     = 0x5405;
+    static const unsigned TGT_TCSETAW    = 0x5407;
+    static const unsigned TGT_FIONREAD   = 0x541B;
+    //@}
+
+    /// Return true for the ioctl codes for which we return ENOTTY
+    /// *without* printing a warning, since we know that ENOTTY is the
+    /// correct thing to return (and not just a sign that we don't
+    /// recognize the ioctl code.
_______________________________________________
gem5-dev mailing list
[email protected]
http://m5sim.org/mailman/listinfo/gem5-dev

Reply via email to