aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/asm-x86/termios.h74
1 files changed, 45 insertions, 29 deletions
diff --git a/include/asm-x86/termios.h b/include/asm-x86/termios.h
index d501748700d2..f72956331c49 100644
--- a/include/asm-x86/termios.h
+++ b/include/asm-x86/termios.h
@@ -41,6 +41,8 @@ struct termio {
41 41
42#ifdef __KERNEL__ 42#ifdef __KERNEL__
43 43
44#include <asm/uaccess.h>
45
44/* intr=^C quit=^\ erase=del kill=^U 46/* intr=^C quit=^\ erase=del kill=^U
45 eof=^D vtime=\0 vmin=\1 sxtc=\0 47 eof=^D vtime=\0 vmin=\1 sxtc=\0
46 start=^Q stop=^S susp=^Z eol=\0 48 start=^Q stop=^S susp=^Z eol=\0
@@ -58,39 +60,53 @@ struct termio {
58 *(unsigned short *) &(termios)->x = __tmp; \ 60 *(unsigned short *) &(termios)->x = __tmp; \
59} 61}
60 62
61#define user_termio_to_kernel_termios(termios, termio) \ 63static inline int user_termio_to_kernel_termios(struct ktermios *termios,
62({ \ 64 struct termio __user *termio)
63 SET_LOW_TERMIOS_BITS(termios, termio, c_iflag); \ 65{
64 SET_LOW_TERMIOS_BITS(termios, termio, c_oflag); \ 66 SET_LOW_TERMIOS_BITS(termios, termio, c_iflag);
65 SET_LOW_TERMIOS_BITS(termios, termio, c_cflag); \ 67 SET_LOW_TERMIOS_BITS(termios, termio, c_oflag);
66 SET_LOW_TERMIOS_BITS(termios, termio, c_lflag); \ 68 SET_LOW_TERMIOS_BITS(termios, termio, c_cflag);
67 copy_from_user((termios)->c_cc, (termio)->c_cc, NCC); \ 69 SET_LOW_TERMIOS_BITS(termios, termio, c_lflag);
68}) 70 return copy_from_user(termios->c_cc, termio->c_cc, NCC);
71}
69 72
70/* 73/*
71 * Translate a "termios" structure into a "termio". Ugh. 74 * Translate a "termios" structure into a "termio". Ugh.
72 */ 75 */
73#define kernel_termios_to_user_termio(termio, termios) \ 76static inline int kernel_termios_to_user_termio(struct termio __user *termio,
74({ \ 77 struct ktermios *termios)
75 put_user((termios)->c_iflag, &(termio)->c_iflag); \ 78{
76 put_user((termios)->c_oflag, &(termio)->c_oflag); \ 79 put_user((termios)->c_iflag, &(termio)->c_iflag);
77 put_user((termios)->c_cflag, &(termio)->c_cflag); \ 80 put_user((termios)->c_oflag, &(termio)->c_oflag);
78 put_user((termios)->c_lflag, &(termio)->c_lflag); \ 81 put_user((termios)->c_cflag, &(termio)->c_cflag);
79 put_user((termios)->c_line, &(termio)->c_line); \ 82 put_user((termios)->c_lflag, &(termio)->c_lflag);
80 copy_to_user((termio)->c_cc, (termios)->c_cc, NCC); \ 83 put_user((termios)->c_line, &(termio)->c_line);
81}) 84 return copy_to_user((termio)->c_cc, (termios)->c_cc, NCC);
82 85}
83#define user_termios_to_kernel_termios(k, u) \ 86
84 copy_from_user(k, u, sizeof(struct termios2)) 87static inline int user_termios_to_kernel_termios(struct ktermios *k,
85 88 struct termios2 __user *u)
86#define kernel_termios_to_user_termios(u, k) \ 89{
87 copy_to_user(u, k, sizeof(struct termios2)) 90 return copy_from_user(k, u, sizeof(struct termios2));
88 91}
89#define user_termios_to_kernel_termios_1(k, u) \ 92
90 copy_from_user(k, u, sizeof(struct termios)) 93static inline int kernel_termios_to_user_termios(struct termios2 __user *u,
91 94 struct ktermios *k)
92#define kernel_termios_to_user_termios_1(u, k) \ 95{
93 copy_to_user(u, k, sizeof(struct termios)) 96 return copy_to_user(u, k, sizeof(struct termios2));
97}
98
99static inline int user_termios_to_kernel_termios_1(struct ktermios *k,
100 struct termios __user *u)
101{
102 return copy_from_user(k, u, sizeof(struct termios));
103}
104
105static inline int kernel_termios_to_user_termios_1(struct termios __user *u,
106 struct ktermios *k)
107{
108 return copy_to_user(u, k, sizeof(struct termios));
109}
94 110
95#endif /* __KERNEL__ */ 111#endif /* __KERNEL__ */
96 112