//@{
/// 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;
//@{
/// 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;
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;
//@{
/// 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;
//@{
/// 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__
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
/* 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),
/* 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),
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.
+ static bool
+ isTtyReq(unsigned req)
+ {
+ switch (req) {
+ case TGT_FIONREAD:
+ case TGT_TCSETAW:
+ case TGT_TCGETS:
+ case TGT_TCGETA:
+ return true;
+ default:
+ return false;
+ }
+ }
+
/// For getrusage().
struct rusage {
/// Target ioctl() handler. For the most part, programs call ioctl()
/// only to find out if their stdout is a tty, to determine whether to
-/// do line or block buffering.
+/// do line or block buffering. We always claim that output fds are
+/// not TTYs to provide repeatable results.
template <class OS>
SyscallReturn
ioctlFunc(SyscallDesc *desc, int callnum, LiveProcess *process,
return -EBADF;
}
- switch (req) {
- case OS::TIOCISATTY_:
- case OS::TIOCGETP_:
- case OS::TIOCSETP_:
- case OS::TIOCSETN_:
- case OS::TIOCSETC_:
- case OS::TIOCGETC_:
- case OS::TIOCGETS_:
- case OS::TIOCGETA_:
- case OS::TCSETAW_:
+ if (OS::isTtyReq(req)) {
return -ENOTTY;
-
- default:
- fatal("Unsupported ioctl call: ioctl(%d, 0x%x, ...) @ \n",
- fd, req, tc->pcState());
}
+
+ warn("Unsupported ioctl call: ioctl(%d, 0x%x, ...) @ \n",
+ fd, req, tc->pcState());
+ return -ENOTTY;
}
/// Target open() handler.