mirror of
https://github.com/torvalds/linux.git
synced 2024-11-23 20:51:44 +00:00
[SPARC]: Support for new termios.
[akpm@linux-foundation.org: coding-style tweaks] Signed-off-by: David Miller <davem@davemloft.net> Signed-off-by: Alan Cox <alan@redhat.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
4209ab098c
commit
6050afbbb0
@ -15,6 +15,10 @@
|
||||
#define TCSETS _IOW('T', 9, struct termios)
|
||||
#define TCSETSW _IOW('T', 10, struct termios)
|
||||
#define TCSETSF _IOW('T', 11, struct termios)
|
||||
#define TCGETS2 _IOR('T', 12, struct termios2)
|
||||
#define TCSETS2 _IOW('T', 13, struct termios2)
|
||||
#define TCSETSW2 _IOW('T', 14, struct termios2)
|
||||
#define TCSETSF2 _IOW('T', 15, struct termios2)
|
||||
|
||||
/* Note that all the ioctls that are not available in Linux have a
|
||||
* double underscore on the front to: a) avoid some programs to
|
||||
|
@ -31,6 +31,18 @@ struct termios {
|
||||
#endif
|
||||
};
|
||||
|
||||
struct termios2 {
|
||||
tcflag_t c_iflag; /* input mode flags */
|
||||
tcflag_t c_oflag; /* output mode flags */
|
||||
tcflag_t c_cflag; /* control mode flags */
|
||||
tcflag_t c_lflag; /* local mode flags */
|
||||
cc_t c_line; /* line discipline */
|
||||
cc_t c_cc[NCCS]; /* control characters */
|
||||
cc_t _x_cc[2]; /* padding to match ktermios */
|
||||
speed_t c_ispeed; /* input speed */
|
||||
speed_t c_ospeed; /* output speed */
|
||||
};
|
||||
|
||||
struct ktermios {
|
||||
tcflag_t c_iflag; /* input mode flags */
|
||||
tcflag_t c_oflag; /* output mode flags */
|
||||
@ -160,6 +172,7 @@ struct ktermios {
|
||||
#define CLOCAL 0x00000800
|
||||
#define CBAUDEX 0x00001000
|
||||
/* We'll never see these speeds with the Zilogs, but for completeness... */
|
||||
#define BOTHER 0x00001000
|
||||
#define B57600 0x00001001
|
||||
#define B115200 0x00001002
|
||||
#define B230400 0x00001003
|
||||
@ -189,6 +202,8 @@ struct ktermios {
|
||||
#define CMSPAR 0x40000000 /* mark or space (stick) parity */
|
||||
#define CRTSCTS 0x80000000 /* flow control */
|
||||
|
||||
#define IBSHIFT 16 /* Shift from CBAUD to CIBAUD */
|
||||
|
||||
/* c_lflag bits */
|
||||
#define ISIG 0x00000001
|
||||
#define ICANON 0x00000002
|
||||
|
@ -107,6 +107,48 @@ struct winsize {
|
||||
})
|
||||
|
||||
#define user_termios_to_kernel_termios(k, u) \
|
||||
({ \
|
||||
int err; \
|
||||
err = get_user((k)->c_iflag, &(u)->c_iflag); \
|
||||
err |= get_user((k)->c_oflag, &(u)->c_oflag); \
|
||||
err |= get_user((k)->c_cflag, &(u)->c_cflag); \
|
||||
err |= get_user((k)->c_lflag, &(u)->c_lflag); \
|
||||
err |= get_user((k)->c_line, &(u)->c_line); \
|
||||
err |= copy_from_user((k)->c_cc, (u)->c_cc, NCCS); \
|
||||
if ((k)->c_lflag & ICANON) { \
|
||||
err |= get_user((k)->c_cc[VEOF], &(u)->c_cc[VEOF]); \
|
||||
err |= get_user((k)->c_cc[VEOL], &(u)->c_cc[VEOL]); \
|
||||
} else { \
|
||||
err |= get_user((k)->c_cc[VMIN], &(u)->c_cc[_VMIN]); \
|
||||
err |= get_user((k)->c_cc[VTIME], &(u)->c_cc[_VTIME]); \
|
||||
} \
|
||||
err |= get_user((k)->c_ispeed, &(u)->c_ispeed); \
|
||||
err |= get_user((k)->c_ospeed, &(u)->c_ospeed); \
|
||||
err; \
|
||||
})
|
||||
|
||||
#define kernel_termios_to_user_termios(u, k) \
|
||||
({ \
|
||||
int err; \
|
||||
err = put_user((k)->c_iflag, &(u)->c_iflag); \
|
||||
err |= put_user((k)->c_oflag, &(u)->c_oflag); \
|
||||
err |= put_user((k)->c_cflag, &(u)->c_cflag); \
|
||||
err |= put_user((k)->c_lflag, &(u)->c_lflag); \
|
||||
err |= put_user((k)->c_line, &(u)->c_line); \
|
||||
err |= copy_to_user((u)->c_cc, (k)->c_cc, NCCS); \
|
||||
if (!((k)->c_lflag & ICANON)) { \
|
||||
err |= put_user((k)->c_cc[VMIN], &(u)->c_cc[_VMIN]); \
|
||||
err |= put_user((k)->c_cc[VTIME], &(u)->c_cc[_VTIME]); \
|
||||
} else { \
|
||||
err |= put_user((k)->c_cc[VEOF], &(u)->c_cc[VEOF]); \
|
||||
err |= put_user((k)->c_cc[VEOL], &(u)->c_cc[VEOL]); \
|
||||
} \
|
||||
err |= put_user((k)->c_ispeed, &(u)->c_ispeed); \
|
||||
err |= put_user((k)->c_ospeed, &(u)->c_ospeed); \
|
||||
err; \
|
||||
})
|
||||
|
||||
#define user_termios_to_kernel_termios_1(k, u) \
|
||||
({ \
|
||||
get_user((k)->c_iflag, &(u)->c_iflag); \
|
||||
get_user((k)->c_oflag, &(u)->c_oflag); \
|
||||
@ -114,7 +156,7 @@ struct winsize {
|
||||
get_user((k)->c_lflag, &(u)->c_lflag); \
|
||||
get_user((k)->c_line, &(u)->c_line); \
|
||||
copy_from_user((k)->c_cc, (u)->c_cc, NCCS); \
|
||||
if((k)->c_lflag & ICANON) { \
|
||||
if ((k)->c_lflag & ICANON) { \
|
||||
get_user((k)->c_cc[VEOF], &(u)->c_cc[VEOF]); \
|
||||
get_user((k)->c_cc[VEOL], &(u)->c_cc[VEOL]); \
|
||||
} else { \
|
||||
@ -124,7 +166,7 @@ struct winsize {
|
||||
0; \
|
||||
})
|
||||
|
||||
#define kernel_termios_to_user_termios(u, k) \
|
||||
#define kernel_termios_to_user_termios_1(u, k) \
|
||||
({ \
|
||||
put_user((k)->c_iflag, &(u)->c_iflag); \
|
||||
put_user((k)->c_oflag, &(u)->c_oflag); \
|
||||
@ -132,7 +174,7 @@ struct winsize {
|
||||
put_user((k)->c_lflag, &(u)->c_lflag); \
|
||||
put_user((k)->c_line, &(u)->c_line); \
|
||||
copy_to_user((u)->c_cc, (k)->c_cc, NCCS); \
|
||||
if(!((k)->c_lflag & ICANON)) { \
|
||||
if (!((k)->c_lflag & ICANON)) { \
|
||||
put_user((k)->c_cc[VMIN], &(u)->c_cc[_VMIN]); \
|
||||
put_user((k)->c_cc[VTIME], &(u)->c_cc[_VTIME]); \
|
||||
} else { \
|
||||
|
@ -16,6 +16,10 @@
|
||||
#define TCSETS _IOW('T', 9, struct termios)
|
||||
#define TCSETSW _IOW('T', 10, struct termios)
|
||||
#define TCSETSF _IOW('T', 11, struct termios)
|
||||
#define TCGETS2 _IOR('T', 12, struct termios2)
|
||||
#define TCSETS2 _IOW('T', 13, struct termios2)
|
||||
#define TCSETSW2 _IOW('T', 14, struct termios2)
|
||||
#define TCSETSF2 _IOW('T', 15, struct termios2)
|
||||
|
||||
/* Note that all the ioctls that are not available in Linux have a
|
||||
* double underscore on the front to: a) avoid some programs to
|
||||
|
@ -5,8 +5,6 @@
|
||||
|
||||
typedef unsigned char cc_t;
|
||||
typedef unsigned int speed_t;
|
||||
|
||||
/* XXX is this right for sparc64? it was an unsigned long... XXX */
|
||||
typedef unsigned int tcflag_t;
|
||||
|
||||
#define NCC 8
|
||||
@ -33,6 +31,18 @@ struct termios {
|
||||
#endif
|
||||
};
|
||||
|
||||
struct termios2 {
|
||||
tcflag_t c_iflag; /* input mode flags */
|
||||
tcflag_t c_oflag; /* output mode flags */
|
||||
tcflag_t c_cflag; /* control mode flags */
|
||||
tcflag_t c_lflag; /* local mode flags */
|
||||
cc_t c_line; /* line discipline */
|
||||
cc_t c_cc[NCCS]; /* control characters */
|
||||
cc_t _x_cc[2]; /* padding to match ktermios */
|
||||
speed_t c_ispeed; /* input speed */
|
||||
speed_t c_ospeed; /* output speed */
|
||||
};
|
||||
|
||||
struct ktermios {
|
||||
tcflag_t c_iflag; /* input mode flags */
|
||||
tcflag_t c_oflag; /* output mode flags */
|
||||
@ -161,6 +171,7 @@ struct ktermios {
|
||||
#define HUPCL 0x00000400
|
||||
#define CLOCAL 0x00000800
|
||||
#define CBAUDEX 0x00001000
|
||||
#define BOTHER 0x00001000
|
||||
#define B57600 0x00001001
|
||||
#define B115200 0x00001002
|
||||
#define B230400 0x00001003
|
||||
@ -190,6 +201,8 @@ struct ktermios {
|
||||
#define CMSPAR 0x40000000 /* mark or space (stick) parity */
|
||||
#define CRTSCTS 0x80000000 /* flow control */
|
||||
|
||||
#define IBSHIFT 16 /* Shift from CBAUD to CIBAUD */
|
||||
|
||||
/* c_lflag bits */
|
||||
#define ISIG 0x00000001
|
||||
#define ICANON 0x00000002
|
||||
|
@ -123,10 +123,52 @@ struct winsize {
|
||||
err |= get_user((k)->c_cc[VMIN], &(u)->c_cc[_VMIN]); \
|
||||
err |= get_user((k)->c_cc[VTIME], &(u)->c_cc[_VTIME]); \
|
||||
} \
|
||||
err |= get_user((k)->c_ispeed, &(u)->c_ispeed); \
|
||||
err |= get_user((k)->c_ospeed, &(u)->c_ospeed); \
|
||||
err; \
|
||||
})
|
||||
|
||||
#define kernel_termios_to_user_termios(u, k) \
|
||||
({ \
|
||||
int err; \
|
||||
err = put_user((k)->c_iflag, &(u)->c_iflag); \
|
||||
err |= put_user((k)->c_oflag, &(u)->c_oflag); \
|
||||
err |= put_user((k)->c_cflag, &(u)->c_cflag); \
|
||||
err |= put_user((k)->c_lflag, &(u)->c_lflag); \
|
||||
err |= put_user((k)->c_line, &(u)->c_line); \
|
||||
err |= copy_to_user((u)->c_cc, (k)->c_cc, NCCS); \
|
||||
if(!((k)->c_lflag & ICANON)) { \
|
||||
err |= put_user((k)->c_cc[VMIN], &(u)->c_cc[_VMIN]); \
|
||||
err |= put_user((k)->c_cc[VTIME], &(u)->c_cc[_VTIME]); \
|
||||
} else { \
|
||||
err |= put_user((k)->c_cc[VEOF], &(u)->c_cc[VEOF]); \
|
||||
err |= put_user((k)->c_cc[VEOL], &(u)->c_cc[VEOL]); \
|
||||
} \
|
||||
err |= put_user((k)->c_ispeed, &(u)->c_ispeed); \
|
||||
err |= put_user((k)->c_ospeed, &(u)->c_ospeed); \
|
||||
err; \
|
||||
})
|
||||
|
||||
#define user_termios_to_kernel_termios_1(k, u) \
|
||||
({ \
|
||||
int err; \
|
||||
err = get_user((k)->c_iflag, &(u)->c_iflag); \
|
||||
err |= get_user((k)->c_oflag, &(u)->c_oflag); \
|
||||
err |= get_user((k)->c_cflag, &(u)->c_cflag); \
|
||||
err |= get_user((k)->c_lflag, &(u)->c_lflag); \
|
||||
err |= get_user((k)->c_line, &(u)->c_line); \
|
||||
err |= copy_from_user((k)->c_cc, (u)->c_cc, NCCS); \
|
||||
if((k)->c_lflag & ICANON) { \
|
||||
err |= get_user((k)->c_cc[VEOF], &(u)->c_cc[VEOF]); \
|
||||
err |= get_user((k)->c_cc[VEOL], &(u)->c_cc[VEOL]); \
|
||||
} else { \
|
||||
err |= get_user((k)->c_cc[VMIN], &(u)->c_cc[_VMIN]); \
|
||||
err |= get_user((k)->c_cc[VTIME], &(u)->c_cc[_VTIME]); \
|
||||
} \
|
||||
err; \
|
||||
})
|
||||
|
||||
#define kernel_termios_to_user_termios_1(u, k) \
|
||||
({ \
|
||||
int err; \
|
||||
err = put_user((k)->c_iflag, &(u)->c_iflag); \
|
||||
|
Loading…
Reference in New Issue
Block a user