Linux Audio

Check our new training course

In-person Linux kernel drivers training

Jun 16-20, 2025
Register
Loading...
v6.2
  1// SPDX-License-Identifier: GPL-2.0
  2/*
  3 *  Copyright (C) 1991, 1992, 1993, 1994  Linus Torvalds
  4 *
  5 * Modified by Fred N. van Kempen, 01/29/93, to add line disciplines
  6 * which can be dynamically activated and de-activated by the line
  7 * discipline handling modules (like SLIP).
  8 */
  9
 10#include <linux/types.h>
 11#include <linux/termios.h>
 12#include <linux/errno.h>
 13#include <linux/sched/signal.h>
 14#include <linux/kernel.h>
 15#include <linux/major.h>
 16#include <linux/tty.h>
 17#include <linux/fcntl.h>
 18#include <linux/string.h>
 19#include <linux/mm.h>
 20#include <linux/module.h>
 21#include <linux/bitops.h>
 22#include <linux/mutex.h>
 23#include <linux/compat.h>
 24#include <linux/termios_internal.h>
 25#include "tty.h"
 26
 27#include <asm/io.h>
 28#include <linux/uaccess.h>
 29
 30#undef TTY_DEBUG_WAIT_UNTIL_SENT
 31
 32#ifdef TTY_DEBUG_WAIT_UNTIL_SENT
 33# define tty_debug_wait_until_sent(tty, f, args...)    tty_debug(tty, f, ##args)
 34#else
 35# define tty_debug_wait_until_sent(tty, f, args...)    do {} while (0)
 36#endif
 37
 38#undef	DEBUG
 39
 40/*
 41 * Internal flag options for termios setting behavior
 42 */
 43#define TERMIOS_FLUSH	1
 44#define TERMIOS_WAIT	2
 45#define TERMIOS_TERMIO	4
 46#define TERMIOS_OLD	8
 47
 48
 49/**
 50 *	tty_chars_in_buffer	-	characters pending
 51 *	@tty: terminal
 52 *
 53 *	Return the number of bytes of data in the device private
 54 *	output queue. If no private method is supplied there is assumed
 55 *	to be no queue on the device.
 56 */
 57
 58unsigned int tty_chars_in_buffer(struct tty_struct *tty)
 59{
 60	if (tty->ops->chars_in_buffer)
 61		return tty->ops->chars_in_buffer(tty);
 62	return 0;
 63}
 64EXPORT_SYMBOL(tty_chars_in_buffer);
 65
 66/**
 67 *	tty_write_room		-	write queue space
 68 *	@tty: terminal
 69 *
 70 *	Return the number of bytes that can be queued to this device
 71 *	at the present time. The result should be treated as a guarantee
 72 *	and the driver cannot offer a value it later shrinks by more than
 73 *	the number of bytes written. If no method is provided 2K is always
 74 *	returned and data may be lost as there will be no flow control.
 75 */
 76 
 77unsigned int tty_write_room(struct tty_struct *tty)
 78{
 79	if (tty->ops->write_room)
 80		return tty->ops->write_room(tty);
 81	return 2048;
 82}
 83EXPORT_SYMBOL(tty_write_room);
 84
 85/**
 86 *	tty_driver_flush_buffer	-	discard internal buffer
 87 *	@tty: terminal
 88 *
 89 *	Discard the internal output buffer for this device. If no method
 90 *	is provided then either the buffer cannot be hardware flushed or
 91 *	there is no buffer driver side.
 92 */
 93void tty_driver_flush_buffer(struct tty_struct *tty)
 94{
 95	if (tty->ops->flush_buffer)
 96		tty->ops->flush_buffer(tty);
 97}
 98EXPORT_SYMBOL(tty_driver_flush_buffer);
 99
100/**
101 *	tty_unthrottle		-	flow control
102 *	@tty: terminal
103 *
104 *	Indicate that a tty may continue transmitting data down the stack.
105 *	Takes the termios rwsem to protect against parallel throttle/unthrottle
106 *	and also to ensure the driver can consistently reference its own
107 *	termios data at this point when implementing software flow control.
108 *
109 *	Drivers should however remember that the stack can issue a throttle,
110 *	then change flow control method, then unthrottle.
111 */
112
113void tty_unthrottle(struct tty_struct *tty)
114{
115	down_write(&tty->termios_rwsem);
116	if (test_and_clear_bit(TTY_THROTTLED, &tty->flags) &&
117	    tty->ops->unthrottle)
118		tty->ops->unthrottle(tty);
119	tty->flow_change = 0;
120	up_write(&tty->termios_rwsem);
121}
122EXPORT_SYMBOL(tty_unthrottle);
123
124/**
125 *	tty_throttle_safe	-	flow control
126 *	@tty: terminal
127 *
128 *	Indicate that a tty should stop transmitting data down the stack.
129 *	tty_throttle_safe will only attempt throttle if tty->flow_change is
130 *	TTY_THROTTLE_SAFE. Prevents an accidental throttle due to race
131 *	conditions when throttling is conditional on factors evaluated prior to
132 *	throttling.
133 *
134 *	Returns 0 if tty is throttled (or was already throttled)
135 */
136
137int tty_throttle_safe(struct tty_struct *tty)
138{
139	int ret = 0;
140
141	mutex_lock(&tty->throttle_mutex);
142	if (!tty_throttled(tty)) {
143		if (tty->flow_change != TTY_THROTTLE_SAFE)
144			ret = 1;
145		else {
146			set_bit(TTY_THROTTLED, &tty->flags);
147			if (tty->ops->throttle)
148				tty->ops->throttle(tty);
149		}
150	}
151	mutex_unlock(&tty->throttle_mutex);
152
153	return ret;
154}
155
156/**
157 *	tty_unthrottle_safe	-	flow control
158 *	@tty: terminal
159 *
160 *	Similar to tty_unthrottle() but will only attempt unthrottle
161 *	if tty->flow_change is TTY_UNTHROTTLE_SAFE. Prevents an accidental
162 *	unthrottle due to race conditions when unthrottling is conditional
163 *	on factors evaluated prior to unthrottling.
164 *
165 *	Returns 0 if tty is unthrottled (or was already unthrottled)
166 */
167
168int tty_unthrottle_safe(struct tty_struct *tty)
169{
170	int ret = 0;
171
172	mutex_lock(&tty->throttle_mutex);
173	if (tty_throttled(tty)) {
174		if (tty->flow_change != TTY_UNTHROTTLE_SAFE)
175			ret = 1;
176		else {
177			clear_bit(TTY_THROTTLED, &tty->flags);
178			if (tty->ops->unthrottle)
179				tty->ops->unthrottle(tty);
180		}
181	}
182	mutex_unlock(&tty->throttle_mutex);
183
184	return ret;
185}
186
187/**
188 *	tty_wait_until_sent	-	wait for I/O to finish
189 *	@tty: tty we are waiting for
190 *	@timeout: how long we will wait
191 *
192 *	Wait for characters pending in a tty driver to hit the wire, or
193 *	for a timeout to occur (eg due to flow control)
194 *
195 *	Locking: none
196 */
197
198void tty_wait_until_sent(struct tty_struct *tty, long timeout)
199{
200	tty_debug_wait_until_sent(tty, "wait until sent, timeout=%ld\n", timeout);
201
202	if (!timeout)
203		timeout = MAX_SCHEDULE_TIMEOUT;
204
205	timeout = wait_event_interruptible_timeout(tty->write_wait,
206			!tty_chars_in_buffer(tty), timeout);
207	if (timeout <= 0)
208		return;
209
210	if (timeout == MAX_SCHEDULE_TIMEOUT)
211		timeout = 0;
212
213	if (tty->ops->wait_until_sent)
214		tty->ops->wait_until_sent(tty, timeout);
215}
216EXPORT_SYMBOL(tty_wait_until_sent);
217
218
219/*
220 *		Termios Helper Methods
221 */
222
223static void unset_locked_termios(struct tty_struct *tty, const struct ktermios *old)
224{
225	struct ktermios *termios = &tty->termios;
226	struct ktermios *locked  = &tty->termios_locked;
227	int	i;
228
229#define NOSET_MASK(x, y, z) (x = ((x) & ~(z)) | ((y) & (z)))
230
231	NOSET_MASK(termios->c_iflag, old->c_iflag, locked->c_iflag);
232	NOSET_MASK(termios->c_oflag, old->c_oflag, locked->c_oflag);
233	NOSET_MASK(termios->c_cflag, old->c_cflag, locked->c_cflag);
234	NOSET_MASK(termios->c_lflag, old->c_lflag, locked->c_lflag);
235	termios->c_line = locked->c_line ? old->c_line : termios->c_line;
236	for (i = 0; i < NCCS; i++)
237		termios->c_cc[i] = locked->c_cc[i] ?
238			old->c_cc[i] : termios->c_cc[i];
239	/* FIXME: What should we do for i/ospeed */
240}
241
242/**
243 *	tty_termios_copy_hw	-	copy hardware settings
244 *	@new: New termios
245 *	@old: Old termios
246 *
247 *	Propagate the hardware specific terminal setting bits from
248 *	the old termios structure to the new one. This is used in cases
249 *	where the hardware does not support reconfiguration or as a helper
250 *	in some cases where only minimal reconfiguration is supported
251 */
252
253void tty_termios_copy_hw(struct ktermios *new, const struct ktermios *old)
254{
255	/* The bits a dumb device handles in software. Smart devices need
256	   to always provide a set_termios method */
257	new->c_cflag &= HUPCL | CREAD | CLOCAL;
258	new->c_cflag |= old->c_cflag & ~(HUPCL | CREAD | CLOCAL);
259	new->c_ispeed = old->c_ispeed;
260	new->c_ospeed = old->c_ospeed;
261}
262EXPORT_SYMBOL(tty_termios_copy_hw);
263
264/**
265 *	tty_termios_hw_change	-	check for setting change
266 *	@a: termios
267 *	@b: termios to compare
268 *
269 *	Check if any of the bits that affect a dumb device have changed
270 *	between the two termios structures, or a speed change is needed.
271 */
272
273int tty_termios_hw_change(const struct ktermios *a, const struct ktermios *b)
274{
275	if (a->c_ispeed != b->c_ispeed || a->c_ospeed != b->c_ospeed)
276		return 1;
277	if ((a->c_cflag ^ b->c_cflag) & ~(HUPCL | CREAD | CLOCAL))
278		return 1;
279	return 0;
280}
281EXPORT_SYMBOL(tty_termios_hw_change);
282
283/**
284 *	tty_get_char_size	-	get size of a character
285 *	@cflag: termios cflag value
286 *
287 *	Get the size (in bits) of a character depending on @cflag's %CSIZE
288 *	setting.
289 */
290unsigned char tty_get_char_size(unsigned int cflag)
291{
292	switch (cflag & CSIZE) {
293	case CS5:
294		return 5;
295	case CS6:
296		return 6;
297	case CS7:
298		return 7;
299	case CS8:
300	default:
301		return 8;
302	}
303}
304EXPORT_SYMBOL_GPL(tty_get_char_size);
305
306/**
307 *	tty_get_frame_size	-	get size of a frame
308 *	@cflag: termios cflag value
309 *
310 *	Get the size (in bits) of a frame depending on @cflag's %CSIZE, %CSTOPB,
311 *	and %PARENB setting. The result is a sum of character size, start and
312 *	stop bits -- one bit each -- second stop bit (if set), and parity bit
313 *	(if set).
314 */
315unsigned char tty_get_frame_size(unsigned int cflag)
316{
317	unsigned char bits = 2 + tty_get_char_size(cflag);
318
319	if (cflag & CSTOPB)
320		bits++;
321	if (cflag & PARENB)
322		bits++;
323	if (cflag & ADDRB)
324		bits++;
325
326	return bits;
327}
328EXPORT_SYMBOL_GPL(tty_get_frame_size);
329
330/**
331 *	tty_set_termios		-	update termios values
332 *	@tty: tty to update
333 *	@new_termios: desired new value
334 *
335 *	Perform updates to the termios values set on this terminal.
336 *	A master pty's termios should never be set.
337 *
338 *	Locking: termios_rwsem
339 */
340
341int tty_set_termios(struct tty_struct *tty, struct ktermios *new_termios)
342{
343	struct ktermios old_termios;
344	struct tty_ldisc *ld;
345
346	WARN_ON(tty->driver->type == TTY_DRIVER_TYPE_PTY &&
347		tty->driver->subtype == PTY_TYPE_MASTER);
348	/*
349	 *	Perform the actual termios internal changes under lock.
350	 */
351
352
353	/* FIXME: we need to decide on some locking/ordering semantics
354	   for the set_termios notification eventually */
355	down_write(&tty->termios_rwsem);
356	old_termios = tty->termios;
357	tty->termios = *new_termios;
358	unset_locked_termios(tty, &old_termios);
359	/* Reset any ADDRB changes, ADDRB is changed through ->rs485_config() */
360	tty->termios.c_cflag ^= (tty->termios.c_cflag ^ old_termios.c_cflag) & ADDRB;
361
362	if (tty->ops->set_termios)
363		tty->ops->set_termios(tty, &old_termios);
364	else
365		tty_termios_copy_hw(&tty->termios, &old_termios);
366
367	ld = tty_ldisc_ref(tty);
368	if (ld != NULL) {
369		if (ld->ops->set_termios)
370			ld->ops->set_termios(tty, &old_termios);
371		tty_ldisc_deref(ld);
372	}
373	up_write(&tty->termios_rwsem);
374	return 0;
375}
376EXPORT_SYMBOL_GPL(tty_set_termios);
377
378
379/*
380 * Translate a "termio" structure into a "termios". Ugh.
381 */
382__weak int user_termio_to_kernel_termios(struct ktermios *termios,
383						struct termio __user *termio)
384{
385	struct termio v;
386
387	if (copy_from_user(&v, termio, sizeof(struct termio)))
388		return -EFAULT;
389
390	termios->c_iflag = (0xffff0000 & termios->c_iflag) | v.c_iflag;
391	termios->c_oflag = (0xffff0000 & termios->c_oflag) | v.c_oflag;
392	termios->c_cflag = (0xffff0000 & termios->c_cflag) | v.c_cflag;
393	termios->c_lflag = (0xffff0000 & termios->c_lflag) | v.c_lflag;
394	termios->c_line = (0xffff0000 & termios->c_lflag) | v.c_line;
395	memcpy(termios->c_cc, v.c_cc, NCC);
396	return 0;
397}
398
399/*
400 * Translate a "termios" structure into a "termio". Ugh.
401 */
402__weak int kernel_termios_to_user_termio(struct termio __user *termio,
403						struct ktermios *termios)
404{
405	struct termio v;
406	memset(&v, 0, sizeof(struct termio));
407	v.c_iflag = termios->c_iflag;
408	v.c_oflag = termios->c_oflag;
409	v.c_cflag = termios->c_cflag;
410	v.c_lflag = termios->c_lflag;
411	v.c_line = termios->c_line;
412	memcpy(v.c_cc, termios->c_cc, NCC);
413	return copy_to_user(termio, &v, sizeof(struct termio));
414}
415
416#ifdef TCGETS2
417__weak int user_termios_to_kernel_termios(struct ktermios *k,
418						 struct termios2 __user *u)
419{
420	return copy_from_user(k, u, sizeof(struct termios2));
421}
422__weak int kernel_termios_to_user_termios(struct termios2 __user *u,
423						 struct ktermios *k)
424{
425	return copy_to_user(u, k, sizeof(struct termios2));
426}
427__weak int user_termios_to_kernel_termios_1(struct ktermios *k,
428						   struct termios __user *u)
429{
430	return copy_from_user(k, u, sizeof(struct termios));
431}
432__weak int kernel_termios_to_user_termios_1(struct termios __user *u,
433						   struct ktermios *k)
434{
435	return copy_to_user(u, k, sizeof(struct termios));
436}
437
438#else
439
440__weak int user_termios_to_kernel_termios(struct ktermios *k,
441						 struct termios __user *u)
442{
443	return copy_from_user(k, u, sizeof(struct termios));
444}
445__weak int kernel_termios_to_user_termios(struct termios __user *u,
446						 struct ktermios *k)
447{
448	return copy_to_user(u, k, sizeof(struct termios));
449}
450#endif /* TCGETS2 */
451
452/**
453 *	set_termios		-	set termios values for a tty
454 *	@tty: terminal device
455 *	@arg: user data
456 *	@opt: option information
457 *
458 *	Helper function to prepare termios data and run necessary other
459 *	functions before using tty_set_termios to do the actual changes.
460 *
461 *	Locking:
462 *		Called functions take ldisc and termios_rwsem locks
463 */
464
465static int set_termios(struct tty_struct *tty, void __user *arg, int opt)
466{
467	struct ktermios tmp_termios;
468	struct tty_ldisc *ld;
469	int retval = tty_check_change(tty);
470
471	if (retval)
472		return retval;
473
474	down_read(&tty->termios_rwsem);
475	tmp_termios = tty->termios;
476	up_read(&tty->termios_rwsem);
477
478	if (opt & TERMIOS_TERMIO) {
479		if (user_termio_to_kernel_termios(&tmp_termios,
480						(struct termio __user *)arg))
481			return -EFAULT;
482#ifdef TCGETS2
483	} else if (opt & TERMIOS_OLD) {
484		if (user_termios_to_kernel_termios_1(&tmp_termios,
485						(struct termios __user *)arg))
486			return -EFAULT;
487	} else {
488		if (user_termios_to_kernel_termios(&tmp_termios,
489						(struct termios2 __user *)arg))
490			return -EFAULT;
491	}
492#else
493	} else if (user_termios_to_kernel_termios(&tmp_termios,
494					(struct termios __user *)arg))
495		return -EFAULT;
496#endif
497
498	/* If old style Bfoo values are used then load c_ispeed/c_ospeed
499	 * with the real speed so its unconditionally usable */
500	tmp_termios.c_ispeed = tty_termios_input_baud_rate(&tmp_termios);
501	tmp_termios.c_ospeed = tty_termios_baud_rate(&tmp_termios);
502
503	ld = tty_ldisc_ref(tty);
504
505	if (ld != NULL) {
506		if ((opt & TERMIOS_FLUSH) && ld->ops->flush_buffer)
507			ld->ops->flush_buffer(tty);
508		tty_ldisc_deref(ld);
509	}
510
511	if (opt & TERMIOS_WAIT) {
512		tty_wait_until_sent(tty, 0);
513		if (signal_pending(current))
514			return -ERESTARTSYS;
515	}
516
517	tty_set_termios(tty, &tmp_termios);
518
519	/* FIXME: Arguably if tmp_termios == tty->termios AND the
520	   actual requested termios was not tmp_termios then we may
521	   want to return an error as no user requested change has
522	   succeeded */
523	return 0;
524}
525
526static void copy_termios(struct tty_struct *tty, struct ktermios *kterm)
527{
528	down_read(&tty->termios_rwsem);
529	*kterm = tty->termios;
530	up_read(&tty->termios_rwsem);
531}
532
533static void copy_termios_locked(struct tty_struct *tty, struct ktermios *kterm)
534{
535	down_read(&tty->termios_rwsem);
536	*kterm = tty->termios_locked;
537	up_read(&tty->termios_rwsem);
538}
539
540static int get_termio(struct tty_struct *tty, struct termio __user *termio)
541{
542	struct ktermios kterm;
543	copy_termios(tty, &kterm);
544	if (kernel_termios_to_user_termio(termio, &kterm))
545		return -EFAULT;
546	return 0;
547}
548
549#ifdef TIOCGETP
550/*
551 * These are deprecated, but there is limited support..
552 *
553 * The "sg_flags" translation is a joke..
554 */
555static int get_sgflags(struct tty_struct *tty)
556{
557	int flags = 0;
558
559	if (!L_ICANON(tty)) {
560		if (L_ISIG(tty))
561			flags |= 0x02;		/* cbreak */
562		else
563			flags |= 0x20;		/* raw */
564	}
565	if (L_ECHO(tty))
566		flags |= 0x08;			/* echo */
567	if (O_OPOST(tty))
568		if (O_ONLCR(tty))
569			flags |= 0x10;		/* crmod */
570	return flags;
571}
572
573static int get_sgttyb(struct tty_struct *tty, struct sgttyb __user *sgttyb)
574{
575	struct sgttyb tmp;
576
577	down_read(&tty->termios_rwsem);
578	tmp.sg_ispeed = tty->termios.c_ispeed;
579	tmp.sg_ospeed = tty->termios.c_ospeed;
580	tmp.sg_erase = tty->termios.c_cc[VERASE];
581	tmp.sg_kill = tty->termios.c_cc[VKILL];
582	tmp.sg_flags = get_sgflags(tty);
583	up_read(&tty->termios_rwsem);
584
585	return copy_to_user(sgttyb, &tmp, sizeof(tmp)) ? -EFAULT : 0;
586}
587
588static void set_sgflags(struct ktermios *termios, int flags)
589{
590	termios->c_iflag = ICRNL | IXON;
591	termios->c_oflag = 0;
592	termios->c_lflag = ISIG | ICANON;
593	if (flags & 0x02) {	/* cbreak */
594		termios->c_iflag = 0;
595		termios->c_lflag &= ~ICANON;
596	}
597	if (flags & 0x08) {		/* echo */
598		termios->c_lflag |= ECHO | ECHOE | ECHOK |
599				    ECHOCTL | ECHOKE | IEXTEN;
600	}
601	if (flags & 0x10) {		/* crmod */
602		termios->c_oflag |= OPOST | ONLCR;
603	}
604	if (flags & 0x20) {	/* raw */
605		termios->c_iflag = 0;
606		termios->c_lflag &= ~(ISIG | ICANON);
607	}
608	if (!(termios->c_lflag & ICANON)) {
609		termios->c_cc[VMIN] = 1;
610		termios->c_cc[VTIME] = 0;
611	}
612}
613
614/**
615 *	set_sgttyb		-	set legacy terminal values
616 *	@tty: tty structure
617 *	@sgttyb: pointer to old style terminal structure
618 *
619 *	Updates a terminal from the legacy BSD style terminal information
620 *	structure.
621 *
622 *	Locking: termios_rwsem
623 */
624
625static int set_sgttyb(struct tty_struct *tty, struct sgttyb __user *sgttyb)
626{
627	int retval;
628	struct sgttyb tmp;
629	struct ktermios termios;
630
631	retval = tty_check_change(tty);
632	if (retval)
633		return retval;
634
635	if (copy_from_user(&tmp, sgttyb, sizeof(tmp)))
636		return -EFAULT;
637
638	down_write(&tty->termios_rwsem);
639	termios = tty->termios;
640	termios.c_cc[VERASE] = tmp.sg_erase;
641	termios.c_cc[VKILL] = tmp.sg_kill;
642	set_sgflags(&termios, tmp.sg_flags);
643	/* Try and encode into Bfoo format */
 
644	tty_termios_encode_baud_rate(&termios, termios.c_ispeed,
645						termios.c_ospeed);
 
646	up_write(&tty->termios_rwsem);
647	tty_set_termios(tty, &termios);
648	return 0;
649}
650#endif
651
652#ifdef TIOCGETC
653static int get_tchars(struct tty_struct *tty, struct tchars __user *tchars)
654{
655	struct tchars tmp;
656
657	down_read(&tty->termios_rwsem);
658	tmp.t_intrc = tty->termios.c_cc[VINTR];
659	tmp.t_quitc = tty->termios.c_cc[VQUIT];
660	tmp.t_startc = tty->termios.c_cc[VSTART];
661	tmp.t_stopc = tty->termios.c_cc[VSTOP];
662	tmp.t_eofc = tty->termios.c_cc[VEOF];
663	tmp.t_brkc = tty->termios.c_cc[VEOL2];	/* what is brkc anyway? */
664	up_read(&tty->termios_rwsem);
665	return copy_to_user(tchars, &tmp, sizeof(tmp)) ? -EFAULT : 0;
666}
667
668static int set_tchars(struct tty_struct *tty, struct tchars __user *tchars)
669{
670	struct tchars tmp;
671
672	if (copy_from_user(&tmp, tchars, sizeof(tmp)))
673		return -EFAULT;
674	down_write(&tty->termios_rwsem);
675	tty->termios.c_cc[VINTR] = tmp.t_intrc;
676	tty->termios.c_cc[VQUIT] = tmp.t_quitc;
677	tty->termios.c_cc[VSTART] = tmp.t_startc;
678	tty->termios.c_cc[VSTOP] = tmp.t_stopc;
679	tty->termios.c_cc[VEOF] = tmp.t_eofc;
680	tty->termios.c_cc[VEOL2] = tmp.t_brkc;	/* what is brkc anyway? */
681	up_write(&tty->termios_rwsem);
682	return 0;
683}
684#endif
685
686#ifdef TIOCGLTC
687static int get_ltchars(struct tty_struct *tty, struct ltchars __user *ltchars)
688{
689	struct ltchars tmp;
690
691	down_read(&tty->termios_rwsem);
692	tmp.t_suspc = tty->termios.c_cc[VSUSP];
693	/* what is dsuspc anyway? */
694	tmp.t_dsuspc = tty->termios.c_cc[VSUSP];
695	tmp.t_rprntc = tty->termios.c_cc[VREPRINT];
696	/* what is flushc anyway? */
697	tmp.t_flushc = tty->termios.c_cc[VEOL2];
698	tmp.t_werasc = tty->termios.c_cc[VWERASE];
699	tmp.t_lnextc = tty->termios.c_cc[VLNEXT];
700	up_read(&tty->termios_rwsem);
701	return copy_to_user(ltchars, &tmp, sizeof(tmp)) ? -EFAULT : 0;
702}
703
704static int set_ltchars(struct tty_struct *tty, struct ltchars __user *ltchars)
705{
706	struct ltchars tmp;
707
708	if (copy_from_user(&tmp, ltchars, sizeof(tmp)))
709		return -EFAULT;
710
711	down_write(&tty->termios_rwsem);
712	tty->termios.c_cc[VSUSP] = tmp.t_suspc;
713	/* what is dsuspc anyway? */
714	tty->termios.c_cc[VEOL2] = tmp.t_dsuspc;
715	tty->termios.c_cc[VREPRINT] = tmp.t_rprntc;
716	/* what is flushc anyway? */
717	tty->termios.c_cc[VEOL2] = tmp.t_flushc;
718	tty->termios.c_cc[VWERASE] = tmp.t_werasc;
719	tty->termios.c_cc[VLNEXT] = tmp.t_lnextc;
720	up_write(&tty->termios_rwsem);
721	return 0;
722}
723#endif
724
725/**
726 *	tty_change_softcar	-	carrier change ioctl helper
727 *	@tty: tty to update
728 *	@arg: enable/disable CLOCAL
729 *
730 *	Perform a change to the CLOCAL state and call into the driver
731 *	layer to make it visible. All done with the termios rwsem
732 */
733
734static int tty_change_softcar(struct tty_struct *tty, int arg)
735{
736	int ret = 0;
737	int bit = arg ? CLOCAL : 0;
738	struct ktermios old;
739
740	down_write(&tty->termios_rwsem);
741	old = tty->termios;
742	tty->termios.c_cflag &= ~CLOCAL;
743	tty->termios.c_cflag |= bit;
744	if (tty->ops->set_termios)
745		tty->ops->set_termios(tty, &old);
746	if (C_CLOCAL(tty) != bit)
747		ret = -EINVAL;
748	up_write(&tty->termios_rwsem);
749	return ret;
750}
751
752/**
753 *	tty_mode_ioctl		-	mode related ioctls
754 *	@tty: tty for the ioctl
 
755 *	@cmd: command
756 *	@arg: ioctl argument
757 *
758 *	Perform non line discipline specific mode control ioctls. This
759 *	is designed to be called by line disciplines to ensure they provide
760 *	consistent mode setting.
761 */
762
763int tty_mode_ioctl(struct tty_struct *tty, unsigned int cmd, unsigned long arg)
 
764{
765	struct tty_struct *real_tty;
766	void __user *p = (void __user *)arg;
767	int ret = 0;
768	struct ktermios kterm;
769
 
 
770	if (tty->driver->type == TTY_DRIVER_TYPE_PTY &&
771	    tty->driver->subtype == PTY_TYPE_MASTER)
772		real_tty = tty->link;
773	else
774		real_tty = tty;
775
776	switch (cmd) {
777#ifdef TIOCGETP
778	case TIOCGETP:
779		return get_sgttyb(real_tty, (struct sgttyb __user *) arg);
780	case TIOCSETP:
781	case TIOCSETN:
782		return set_sgttyb(real_tty, (struct sgttyb __user *) arg);
783#endif
784#ifdef TIOCGETC
785	case TIOCGETC:
786		return get_tchars(real_tty, p);
787	case TIOCSETC:
788		return set_tchars(real_tty, p);
789#endif
790#ifdef TIOCGLTC
791	case TIOCGLTC:
792		return get_ltchars(real_tty, p);
793	case TIOCSLTC:
794		return set_ltchars(real_tty, p);
795#endif
796	case TCSETSF:
797		return set_termios(real_tty, p,  TERMIOS_FLUSH | TERMIOS_WAIT | TERMIOS_OLD);
798	case TCSETSW:
799		return set_termios(real_tty, p, TERMIOS_WAIT | TERMIOS_OLD);
800	case TCSETS:
801		return set_termios(real_tty, p, TERMIOS_OLD);
802#ifndef TCGETS2
803	case TCGETS:
804		copy_termios(real_tty, &kterm);
805		if (kernel_termios_to_user_termios((struct termios __user *)arg, &kterm))
806			ret = -EFAULT;
807		return ret;
808#else
809	case TCGETS:
810		copy_termios(real_tty, &kterm);
811		if (kernel_termios_to_user_termios_1((struct termios __user *)arg, &kterm))
812			ret = -EFAULT;
813		return ret;
814	case TCGETS2:
815		copy_termios(real_tty, &kterm);
816		if (kernel_termios_to_user_termios((struct termios2 __user *)arg, &kterm))
817			ret = -EFAULT;
818		return ret;
819	case TCSETSF2:
820		return set_termios(real_tty, p,  TERMIOS_FLUSH | TERMIOS_WAIT);
821	case TCSETSW2:
822		return set_termios(real_tty, p, TERMIOS_WAIT);
823	case TCSETS2:
824		return set_termios(real_tty, p, 0);
825#endif
826	case TCGETA:
827		return get_termio(real_tty, p);
828	case TCSETAF:
829		return set_termios(real_tty, p, TERMIOS_FLUSH | TERMIOS_WAIT | TERMIOS_TERMIO);
830	case TCSETAW:
831		return set_termios(real_tty, p, TERMIOS_WAIT | TERMIOS_TERMIO);
832	case TCSETA:
833		return set_termios(real_tty, p, TERMIOS_TERMIO);
834#ifndef TCGETS2
835	case TIOCGLCKTRMIOS:
836		copy_termios_locked(real_tty, &kterm);
837		if (kernel_termios_to_user_termios((struct termios __user *)arg, &kterm))
838			ret = -EFAULT;
839		return ret;
840	case TIOCSLCKTRMIOS:
841		if (!capable(CAP_SYS_ADMIN))
842			return -EPERM;
843		copy_termios_locked(real_tty, &kterm);
844		if (user_termios_to_kernel_termios(&kterm,
845					       (struct termios __user *) arg))
846			return -EFAULT;
847		down_write(&real_tty->termios_rwsem);
848		real_tty->termios_locked = kterm;
849		up_write(&real_tty->termios_rwsem);
850		return 0;
851#else
852	case TIOCGLCKTRMIOS:
853		copy_termios_locked(real_tty, &kterm);
854		if (kernel_termios_to_user_termios_1((struct termios __user *)arg, &kterm))
855			ret = -EFAULT;
856		return ret;
857	case TIOCSLCKTRMIOS:
858		if (!capable(CAP_SYS_ADMIN))
859			return -EPERM;
860		copy_termios_locked(real_tty, &kterm);
861		if (user_termios_to_kernel_termios_1(&kterm,
862					       (struct termios __user *) arg))
863			return -EFAULT;
864		down_write(&real_tty->termios_rwsem);
865		real_tty->termios_locked = kterm;
866		up_write(&real_tty->termios_rwsem);
867		return ret;
868#endif
869#ifdef TCGETX
870	case TCGETX:
871	case TCSETX:
872	case TCSETXW:
873	case TCSETXF:
874		return -ENOTTY;
875#endif
876	case TIOCGSOFTCAR:
877		copy_termios(real_tty, &kterm);
878		ret = put_user((kterm.c_cflag & CLOCAL) ? 1 : 0,
879						(int __user *)arg);
880		return ret;
881	case TIOCSSOFTCAR:
882		if (get_user(arg, (unsigned int __user *) arg))
883			return -EFAULT;
884		return tty_change_softcar(real_tty, arg);
885	default:
886		return -ENOIOCTLCMD;
887	}
888}
889EXPORT_SYMBOL_GPL(tty_mode_ioctl);
890
891
892/* Caller guarantees ldisc reference is held */
893static int __tty_perform_flush(struct tty_struct *tty, unsigned long arg)
894{
895	struct tty_ldisc *ld = tty->ldisc;
896
897	switch (arg) {
898	case TCIFLUSH:
899		if (ld && ld->ops->flush_buffer) {
900			ld->ops->flush_buffer(tty);
901			tty_unthrottle(tty);
902		}
903		break;
904	case TCIOFLUSH:
905		if (ld && ld->ops->flush_buffer) {
906			ld->ops->flush_buffer(tty);
907			tty_unthrottle(tty);
908		}
909		fallthrough;
910	case TCOFLUSH:
911		tty_driver_flush_buffer(tty);
912		break;
913	default:
914		return -EINVAL;
915	}
916	return 0;
917}
918
919int tty_perform_flush(struct tty_struct *tty, unsigned long arg)
920{
921	struct tty_ldisc *ld;
922	int retval = tty_check_change(tty);
923	if (retval)
924		return retval;
925
926	ld = tty_ldisc_ref_wait(tty);
927	retval = __tty_perform_flush(tty, arg);
928	if (ld)
929		tty_ldisc_deref(ld);
930	return retval;
931}
932EXPORT_SYMBOL_GPL(tty_perform_flush);
933
934int n_tty_ioctl_helper(struct tty_struct *tty, unsigned int cmd,
935		unsigned long arg)
936{
937	int retval;
938
939	switch (cmd) {
940	case TCXONC:
941		retval = tty_check_change(tty);
942		if (retval)
943			return retval;
944		switch (arg) {
945		case TCOOFF:
946			spin_lock_irq(&tty->flow.lock);
947			if (!tty->flow.tco_stopped) {
948				tty->flow.tco_stopped = true;
949				__stop_tty(tty);
950			}
951			spin_unlock_irq(&tty->flow.lock);
952			break;
953		case TCOON:
954			spin_lock_irq(&tty->flow.lock);
955			if (tty->flow.tco_stopped) {
956				tty->flow.tco_stopped = false;
957				__start_tty(tty);
958			}
959			spin_unlock_irq(&tty->flow.lock);
960			break;
961		case TCIOFF:
962			if (STOP_CHAR(tty) != __DISABLED_CHAR)
963				retval = tty_send_xchar(tty, STOP_CHAR(tty));
964			break;
965		case TCION:
966			if (START_CHAR(tty) != __DISABLED_CHAR)
967				retval = tty_send_xchar(tty, START_CHAR(tty));
968			break;
969		default:
970			return -EINVAL;
971		}
972		return retval;
973	case TCFLSH:
974		retval = tty_check_change(tty);
975		if (retval)
976			return retval;
977		return __tty_perform_flush(tty, arg);
978	default:
979		/* Try the mode commands */
980		return tty_mode_ioctl(tty, cmd, arg);
981	}
982}
983EXPORT_SYMBOL(n_tty_ioctl_helper);
v5.14.15
  1// SPDX-License-Identifier: GPL-2.0
  2/*
  3 *  Copyright (C) 1991, 1992, 1993, 1994  Linus Torvalds
  4 *
  5 * Modified by Fred N. van Kempen, 01/29/93, to add line disciplines
  6 * which can be dynamically activated and de-activated by the line
  7 * discipline handling modules (like SLIP).
  8 */
  9
 10#include <linux/types.h>
 11#include <linux/termios.h>
 12#include <linux/errno.h>
 13#include <linux/sched/signal.h>
 14#include <linux/kernel.h>
 15#include <linux/major.h>
 16#include <linux/tty.h>
 17#include <linux/fcntl.h>
 18#include <linux/string.h>
 19#include <linux/mm.h>
 20#include <linux/module.h>
 21#include <linux/bitops.h>
 22#include <linux/mutex.h>
 23#include <linux/compat.h>
 
 24#include "tty.h"
 25
 26#include <asm/io.h>
 27#include <linux/uaccess.h>
 28
 29#undef TTY_DEBUG_WAIT_UNTIL_SENT
 30
 31#ifdef TTY_DEBUG_WAIT_UNTIL_SENT
 32# define tty_debug_wait_until_sent(tty, f, args...)    tty_debug(tty, f, ##args)
 33#else
 34# define tty_debug_wait_until_sent(tty, f, args...)    do {} while (0)
 35#endif
 36
 37#undef	DEBUG
 38
 39/*
 40 * Internal flag options for termios setting behavior
 41 */
 42#define TERMIOS_FLUSH	1
 43#define TERMIOS_WAIT	2
 44#define TERMIOS_TERMIO	4
 45#define TERMIOS_OLD	8
 46
 47
 48/**
 49 *	tty_chars_in_buffer	-	characters pending
 50 *	@tty: terminal
 51 *
 52 *	Return the number of bytes of data in the device private
 53 *	output queue. If no private method is supplied there is assumed
 54 *	to be no queue on the device.
 55 */
 56
 57unsigned int tty_chars_in_buffer(struct tty_struct *tty)
 58{
 59	if (tty->ops->chars_in_buffer)
 60		return tty->ops->chars_in_buffer(tty);
 61	return 0;
 62}
 63EXPORT_SYMBOL(tty_chars_in_buffer);
 64
 65/**
 66 *	tty_write_room		-	write queue space
 67 *	@tty: terminal
 68 *
 69 *	Return the number of bytes that can be queued to this device
 70 *	at the present time. The result should be treated as a guarantee
 71 *	and the driver cannot offer a value it later shrinks by more than
 72 *	the number of bytes written. If no method is provided 2K is always
 73 *	returned and data may be lost as there will be no flow control.
 74 */
 75 
 76unsigned int tty_write_room(struct tty_struct *tty)
 77{
 78	if (tty->ops->write_room)
 79		return tty->ops->write_room(tty);
 80	return 2048;
 81}
 82EXPORT_SYMBOL(tty_write_room);
 83
 84/**
 85 *	tty_driver_flush_buffer	-	discard internal buffer
 86 *	@tty: terminal
 87 *
 88 *	Discard the internal output buffer for this device. If no method
 89 *	is provided then either the buffer cannot be hardware flushed or
 90 *	there is no buffer driver side.
 91 */
 92void tty_driver_flush_buffer(struct tty_struct *tty)
 93{
 94	if (tty->ops->flush_buffer)
 95		tty->ops->flush_buffer(tty);
 96}
 97EXPORT_SYMBOL(tty_driver_flush_buffer);
 98
 99/**
100 *	tty_unthrottle		-	flow control
101 *	@tty: terminal
102 *
103 *	Indicate that a tty may continue transmitting data down the stack.
104 *	Takes the termios rwsem to protect against parallel throttle/unthrottle
105 *	and also to ensure the driver can consistently reference its own
106 *	termios data at this point when implementing software flow control.
107 *
108 *	Drivers should however remember that the stack can issue a throttle,
109 *	then change flow control method, then unthrottle.
110 */
111
112void tty_unthrottle(struct tty_struct *tty)
113{
114	down_write(&tty->termios_rwsem);
115	if (test_and_clear_bit(TTY_THROTTLED, &tty->flags) &&
116	    tty->ops->unthrottle)
117		tty->ops->unthrottle(tty);
118	tty->flow_change = 0;
119	up_write(&tty->termios_rwsem);
120}
121EXPORT_SYMBOL(tty_unthrottle);
122
123/**
124 *	tty_throttle_safe	-	flow control
125 *	@tty: terminal
126 *
127 *	Indicate that a tty should stop transmitting data down the stack.
128 *	tty_throttle_safe will only attempt throttle if tty->flow_change is
129 *	TTY_THROTTLE_SAFE. Prevents an accidental throttle due to race
130 *	conditions when throttling is conditional on factors evaluated prior to
131 *	throttling.
132 *
133 *	Returns 0 if tty is throttled (or was already throttled)
134 */
135
136int tty_throttle_safe(struct tty_struct *tty)
137{
138	int ret = 0;
139
140	mutex_lock(&tty->throttle_mutex);
141	if (!tty_throttled(tty)) {
142		if (tty->flow_change != TTY_THROTTLE_SAFE)
143			ret = 1;
144		else {
145			set_bit(TTY_THROTTLED, &tty->flags);
146			if (tty->ops->throttle)
147				tty->ops->throttle(tty);
148		}
149	}
150	mutex_unlock(&tty->throttle_mutex);
151
152	return ret;
153}
154
155/**
156 *	tty_unthrottle_safe	-	flow control
157 *	@tty: terminal
158 *
159 *	Similar to tty_unthrottle() but will only attempt unthrottle
160 *	if tty->flow_change is TTY_UNTHROTTLE_SAFE. Prevents an accidental
161 *	unthrottle due to race conditions when unthrottling is conditional
162 *	on factors evaluated prior to unthrottling.
163 *
164 *	Returns 0 if tty is unthrottled (or was already unthrottled)
165 */
166
167int tty_unthrottle_safe(struct tty_struct *tty)
168{
169	int ret = 0;
170
171	mutex_lock(&tty->throttle_mutex);
172	if (tty_throttled(tty)) {
173		if (tty->flow_change != TTY_UNTHROTTLE_SAFE)
174			ret = 1;
175		else {
176			clear_bit(TTY_THROTTLED, &tty->flags);
177			if (tty->ops->unthrottle)
178				tty->ops->unthrottle(tty);
179		}
180	}
181	mutex_unlock(&tty->throttle_mutex);
182
183	return ret;
184}
185
186/**
187 *	tty_wait_until_sent	-	wait for I/O to finish
188 *	@tty: tty we are waiting for
189 *	@timeout: how long we will wait
190 *
191 *	Wait for characters pending in a tty driver to hit the wire, or
192 *	for a timeout to occur (eg due to flow control)
193 *
194 *	Locking: none
195 */
196
197void tty_wait_until_sent(struct tty_struct *tty, long timeout)
198{
199	tty_debug_wait_until_sent(tty, "wait until sent, timeout=%ld\n", timeout);
200
201	if (!timeout)
202		timeout = MAX_SCHEDULE_TIMEOUT;
203
204	timeout = wait_event_interruptible_timeout(tty->write_wait,
205			!tty_chars_in_buffer(tty), timeout);
206	if (timeout <= 0)
207		return;
208
209	if (timeout == MAX_SCHEDULE_TIMEOUT)
210		timeout = 0;
211
212	if (tty->ops->wait_until_sent)
213		tty->ops->wait_until_sent(tty, timeout);
214}
215EXPORT_SYMBOL(tty_wait_until_sent);
216
217
218/*
219 *		Termios Helper Methods
220 */
221
222static void unset_locked_termios(struct tty_struct *tty, struct ktermios *old)
223{
224	struct ktermios *termios = &tty->termios;
225	struct ktermios *locked  = &tty->termios_locked;
226	int	i;
227
228#define NOSET_MASK(x, y, z) (x = ((x) & ~(z)) | ((y) & (z)))
229
230	NOSET_MASK(termios->c_iflag, old->c_iflag, locked->c_iflag);
231	NOSET_MASK(termios->c_oflag, old->c_oflag, locked->c_oflag);
232	NOSET_MASK(termios->c_cflag, old->c_cflag, locked->c_cflag);
233	NOSET_MASK(termios->c_lflag, old->c_lflag, locked->c_lflag);
234	termios->c_line = locked->c_line ? old->c_line : termios->c_line;
235	for (i = 0; i < NCCS; i++)
236		termios->c_cc[i] = locked->c_cc[i] ?
237			old->c_cc[i] : termios->c_cc[i];
238	/* FIXME: What should we do for i/ospeed */
239}
240
241/**
242 *	tty_termios_copy_hw	-	copy hardware settings
243 *	@new: New termios
244 *	@old: Old termios
245 *
246 *	Propagate the hardware specific terminal setting bits from
247 *	the old termios structure to the new one. This is used in cases
248 *	where the hardware does not support reconfiguration or as a helper
249 *	in some cases where only minimal reconfiguration is supported
250 */
251
252void tty_termios_copy_hw(struct ktermios *new, struct ktermios *old)
253{
254	/* The bits a dumb device handles in software. Smart devices need
255	   to always provide a set_termios method */
256	new->c_cflag &= HUPCL | CREAD | CLOCAL;
257	new->c_cflag |= old->c_cflag & ~(HUPCL | CREAD | CLOCAL);
258	new->c_ispeed = old->c_ispeed;
259	new->c_ospeed = old->c_ospeed;
260}
261EXPORT_SYMBOL(tty_termios_copy_hw);
262
263/**
264 *	tty_termios_hw_change	-	check for setting change
265 *	@a: termios
266 *	@b: termios to compare
267 *
268 *	Check if any of the bits that affect a dumb device have changed
269 *	between the two termios structures, or a speed change is needed.
270 */
271
272int tty_termios_hw_change(const struct ktermios *a, const struct ktermios *b)
273{
274	if (a->c_ispeed != b->c_ispeed || a->c_ospeed != b->c_ospeed)
275		return 1;
276	if ((a->c_cflag ^ b->c_cflag) & ~(HUPCL | CREAD | CLOCAL))
277		return 1;
278	return 0;
279}
280EXPORT_SYMBOL(tty_termios_hw_change);
281
282/**
283 *	tty_get_char_size	-	get size of a character
284 *	@cflag: termios cflag value
285 *
286 *	Get the size (in bits) of a character depending on @cflag's %CSIZE
287 *	setting.
288 */
289unsigned char tty_get_char_size(unsigned int cflag)
290{
291	switch (cflag & CSIZE) {
292	case CS5:
293		return 5;
294	case CS6:
295		return 6;
296	case CS7:
297		return 7;
298	case CS8:
299	default:
300		return 8;
301	}
302}
303EXPORT_SYMBOL_GPL(tty_get_char_size);
304
305/**
306 *	tty_get_frame_size	-	get size of a frame
307 *	@cflag: termios cflag value
308 *
309 *	Get the size (in bits) of a frame depending on @cflag's %CSIZE, %CSTOPB,
310 *	and %PARENB setting. The result is a sum of character size, start and
311 *	stop bits -- one bit each -- second stop bit (if set), and parity bit
312 *	(if set).
313 */
314unsigned char tty_get_frame_size(unsigned int cflag)
315{
316	unsigned char bits = 2 + tty_get_char_size(cflag);
317
318	if (cflag & CSTOPB)
319		bits++;
320	if (cflag & PARENB)
321		bits++;
 
 
322
323	return bits;
324}
325EXPORT_SYMBOL_GPL(tty_get_frame_size);
326
327/**
328 *	tty_set_termios		-	update termios values
329 *	@tty: tty to update
330 *	@new_termios: desired new value
331 *
332 *	Perform updates to the termios values set on this terminal.
333 *	A master pty's termios should never be set.
334 *
335 *	Locking: termios_rwsem
336 */
337
338int tty_set_termios(struct tty_struct *tty, struct ktermios *new_termios)
339{
340	struct ktermios old_termios;
341	struct tty_ldisc *ld;
342
343	WARN_ON(tty->driver->type == TTY_DRIVER_TYPE_PTY &&
344		tty->driver->subtype == PTY_TYPE_MASTER);
345	/*
346	 *	Perform the actual termios internal changes under lock.
347	 */
348
349
350	/* FIXME: we need to decide on some locking/ordering semantics
351	   for the set_termios notification eventually */
352	down_write(&tty->termios_rwsem);
353	old_termios = tty->termios;
354	tty->termios = *new_termios;
355	unset_locked_termios(tty, &old_termios);
 
 
356
357	if (tty->ops->set_termios)
358		tty->ops->set_termios(tty, &old_termios);
359	else
360		tty_termios_copy_hw(&tty->termios, &old_termios);
361
362	ld = tty_ldisc_ref(tty);
363	if (ld != NULL) {
364		if (ld->ops->set_termios)
365			ld->ops->set_termios(tty, &old_termios);
366		tty_ldisc_deref(ld);
367	}
368	up_write(&tty->termios_rwsem);
369	return 0;
370}
371EXPORT_SYMBOL_GPL(tty_set_termios);
372
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
373/**
374 *	set_termios		-	set termios values for a tty
375 *	@tty: terminal device
376 *	@arg: user data
377 *	@opt: option information
378 *
379 *	Helper function to prepare termios data and run necessary other
380 *	functions before using tty_set_termios to do the actual changes.
381 *
382 *	Locking:
383 *		Called functions take ldisc and termios_rwsem locks
384 */
385
386static int set_termios(struct tty_struct *tty, void __user *arg, int opt)
387{
388	struct ktermios tmp_termios;
389	struct tty_ldisc *ld;
390	int retval = tty_check_change(tty);
391
392	if (retval)
393		return retval;
394
395	down_read(&tty->termios_rwsem);
396	tmp_termios = tty->termios;
397	up_read(&tty->termios_rwsem);
398
399	if (opt & TERMIOS_TERMIO) {
400		if (user_termio_to_kernel_termios(&tmp_termios,
401						(struct termio __user *)arg))
402			return -EFAULT;
403#ifdef TCGETS2
404	} else if (opt & TERMIOS_OLD) {
405		if (user_termios_to_kernel_termios_1(&tmp_termios,
406						(struct termios __user *)arg))
407			return -EFAULT;
408	} else {
409		if (user_termios_to_kernel_termios(&tmp_termios,
410						(struct termios2 __user *)arg))
411			return -EFAULT;
412	}
413#else
414	} else if (user_termios_to_kernel_termios(&tmp_termios,
415					(struct termios __user *)arg))
416		return -EFAULT;
417#endif
418
419	/* If old style Bfoo values are used then load c_ispeed/c_ospeed
420	 * with the real speed so its unconditionally usable */
421	tmp_termios.c_ispeed = tty_termios_input_baud_rate(&tmp_termios);
422	tmp_termios.c_ospeed = tty_termios_baud_rate(&tmp_termios);
423
424	ld = tty_ldisc_ref(tty);
425
426	if (ld != NULL) {
427		if ((opt & TERMIOS_FLUSH) && ld->ops->flush_buffer)
428			ld->ops->flush_buffer(tty);
429		tty_ldisc_deref(ld);
430	}
431
432	if (opt & TERMIOS_WAIT) {
433		tty_wait_until_sent(tty, 0);
434		if (signal_pending(current))
435			return -ERESTARTSYS;
436	}
437
438	tty_set_termios(tty, &tmp_termios);
439
440	/* FIXME: Arguably if tmp_termios == tty->termios AND the
441	   actual requested termios was not tmp_termios then we may
442	   want to return an error as no user requested change has
443	   succeeded */
444	return 0;
445}
446
447static void copy_termios(struct tty_struct *tty, struct ktermios *kterm)
448{
449	down_read(&tty->termios_rwsem);
450	*kterm = tty->termios;
451	up_read(&tty->termios_rwsem);
452}
453
454static void copy_termios_locked(struct tty_struct *tty, struct ktermios *kterm)
455{
456	down_read(&tty->termios_rwsem);
457	*kterm = tty->termios_locked;
458	up_read(&tty->termios_rwsem);
459}
460
461static int get_termio(struct tty_struct *tty, struct termio __user *termio)
462{
463	struct ktermios kterm;
464	copy_termios(tty, &kterm);
465	if (kernel_termios_to_user_termio(termio, &kterm))
466		return -EFAULT;
467	return 0;
468}
469
470#ifdef TIOCGETP
471/*
472 * These are deprecated, but there is limited support..
473 *
474 * The "sg_flags" translation is a joke..
475 */
476static int get_sgflags(struct tty_struct *tty)
477{
478	int flags = 0;
479
480	if (!L_ICANON(tty)) {
481		if (L_ISIG(tty))
482			flags |= 0x02;		/* cbreak */
483		else
484			flags |= 0x20;		/* raw */
485	}
486	if (L_ECHO(tty))
487		flags |= 0x08;			/* echo */
488	if (O_OPOST(tty))
489		if (O_ONLCR(tty))
490			flags |= 0x10;		/* crmod */
491	return flags;
492}
493
494static int get_sgttyb(struct tty_struct *tty, struct sgttyb __user *sgttyb)
495{
496	struct sgttyb tmp;
497
498	down_read(&tty->termios_rwsem);
499	tmp.sg_ispeed = tty->termios.c_ispeed;
500	tmp.sg_ospeed = tty->termios.c_ospeed;
501	tmp.sg_erase = tty->termios.c_cc[VERASE];
502	tmp.sg_kill = tty->termios.c_cc[VKILL];
503	tmp.sg_flags = get_sgflags(tty);
504	up_read(&tty->termios_rwsem);
505
506	return copy_to_user(sgttyb, &tmp, sizeof(tmp)) ? -EFAULT : 0;
507}
508
509static void set_sgflags(struct ktermios *termios, int flags)
510{
511	termios->c_iflag = ICRNL | IXON;
512	termios->c_oflag = 0;
513	termios->c_lflag = ISIG | ICANON;
514	if (flags & 0x02) {	/* cbreak */
515		termios->c_iflag = 0;
516		termios->c_lflag &= ~ICANON;
517	}
518	if (flags & 0x08) {		/* echo */
519		termios->c_lflag |= ECHO | ECHOE | ECHOK |
520				    ECHOCTL | ECHOKE | IEXTEN;
521	}
522	if (flags & 0x10) {		/* crmod */
523		termios->c_oflag |= OPOST | ONLCR;
524	}
525	if (flags & 0x20) {	/* raw */
526		termios->c_iflag = 0;
527		termios->c_lflag &= ~(ISIG | ICANON);
528	}
529	if (!(termios->c_lflag & ICANON)) {
530		termios->c_cc[VMIN] = 1;
531		termios->c_cc[VTIME] = 0;
532	}
533}
534
535/**
536 *	set_sgttyb		-	set legacy terminal values
537 *	@tty: tty structure
538 *	@sgttyb: pointer to old style terminal structure
539 *
540 *	Updates a terminal from the legacy BSD style terminal information
541 *	structure.
542 *
543 *	Locking: termios_rwsem
544 */
545
546static int set_sgttyb(struct tty_struct *tty, struct sgttyb __user *sgttyb)
547{
548	int retval;
549	struct sgttyb tmp;
550	struct ktermios termios;
551
552	retval = tty_check_change(tty);
553	if (retval)
554		return retval;
555
556	if (copy_from_user(&tmp, sgttyb, sizeof(tmp)))
557		return -EFAULT;
558
559	down_write(&tty->termios_rwsem);
560	termios = tty->termios;
561	termios.c_cc[VERASE] = tmp.sg_erase;
562	termios.c_cc[VKILL] = tmp.sg_kill;
563	set_sgflags(&termios, tmp.sg_flags);
564	/* Try and encode into Bfoo format */
565#ifdef BOTHER
566	tty_termios_encode_baud_rate(&termios, termios.c_ispeed,
567						termios.c_ospeed);
568#endif
569	up_write(&tty->termios_rwsem);
570	tty_set_termios(tty, &termios);
571	return 0;
572}
573#endif
574
575#ifdef TIOCGETC
576static int get_tchars(struct tty_struct *tty, struct tchars __user *tchars)
577{
578	struct tchars tmp;
579
580	down_read(&tty->termios_rwsem);
581	tmp.t_intrc = tty->termios.c_cc[VINTR];
582	tmp.t_quitc = tty->termios.c_cc[VQUIT];
583	tmp.t_startc = tty->termios.c_cc[VSTART];
584	tmp.t_stopc = tty->termios.c_cc[VSTOP];
585	tmp.t_eofc = tty->termios.c_cc[VEOF];
586	tmp.t_brkc = tty->termios.c_cc[VEOL2];	/* what is brkc anyway? */
587	up_read(&tty->termios_rwsem);
588	return copy_to_user(tchars, &tmp, sizeof(tmp)) ? -EFAULT : 0;
589}
590
591static int set_tchars(struct tty_struct *tty, struct tchars __user *tchars)
592{
593	struct tchars tmp;
594
595	if (copy_from_user(&tmp, tchars, sizeof(tmp)))
596		return -EFAULT;
597	down_write(&tty->termios_rwsem);
598	tty->termios.c_cc[VINTR] = tmp.t_intrc;
599	tty->termios.c_cc[VQUIT] = tmp.t_quitc;
600	tty->termios.c_cc[VSTART] = tmp.t_startc;
601	tty->termios.c_cc[VSTOP] = tmp.t_stopc;
602	tty->termios.c_cc[VEOF] = tmp.t_eofc;
603	tty->termios.c_cc[VEOL2] = tmp.t_brkc;	/* what is brkc anyway? */
604	up_write(&tty->termios_rwsem);
605	return 0;
606}
607#endif
608
609#ifdef TIOCGLTC
610static int get_ltchars(struct tty_struct *tty, struct ltchars __user *ltchars)
611{
612	struct ltchars tmp;
613
614	down_read(&tty->termios_rwsem);
615	tmp.t_suspc = tty->termios.c_cc[VSUSP];
616	/* what is dsuspc anyway? */
617	tmp.t_dsuspc = tty->termios.c_cc[VSUSP];
618	tmp.t_rprntc = tty->termios.c_cc[VREPRINT];
619	/* what is flushc anyway? */
620	tmp.t_flushc = tty->termios.c_cc[VEOL2];
621	tmp.t_werasc = tty->termios.c_cc[VWERASE];
622	tmp.t_lnextc = tty->termios.c_cc[VLNEXT];
623	up_read(&tty->termios_rwsem);
624	return copy_to_user(ltchars, &tmp, sizeof(tmp)) ? -EFAULT : 0;
625}
626
627static int set_ltchars(struct tty_struct *tty, struct ltchars __user *ltchars)
628{
629	struct ltchars tmp;
630
631	if (copy_from_user(&tmp, ltchars, sizeof(tmp)))
632		return -EFAULT;
633
634	down_write(&tty->termios_rwsem);
635	tty->termios.c_cc[VSUSP] = tmp.t_suspc;
636	/* what is dsuspc anyway? */
637	tty->termios.c_cc[VEOL2] = tmp.t_dsuspc;
638	tty->termios.c_cc[VREPRINT] = tmp.t_rprntc;
639	/* what is flushc anyway? */
640	tty->termios.c_cc[VEOL2] = tmp.t_flushc;
641	tty->termios.c_cc[VWERASE] = tmp.t_werasc;
642	tty->termios.c_cc[VLNEXT] = tmp.t_lnextc;
643	up_write(&tty->termios_rwsem);
644	return 0;
645}
646#endif
647
648/**
649 *	tty_change_softcar	-	carrier change ioctl helper
650 *	@tty: tty to update
651 *	@arg: enable/disable CLOCAL
652 *
653 *	Perform a change to the CLOCAL state and call into the driver
654 *	layer to make it visible. All done with the termios rwsem
655 */
656
657static int tty_change_softcar(struct tty_struct *tty, int arg)
658{
659	int ret = 0;
660	int bit = arg ? CLOCAL : 0;
661	struct ktermios old;
662
663	down_write(&tty->termios_rwsem);
664	old = tty->termios;
665	tty->termios.c_cflag &= ~CLOCAL;
666	tty->termios.c_cflag |= bit;
667	if (tty->ops->set_termios)
668		tty->ops->set_termios(tty, &old);
669	if (C_CLOCAL(tty) != bit)
670		ret = -EINVAL;
671	up_write(&tty->termios_rwsem);
672	return ret;
673}
674
675/**
676 *	tty_mode_ioctl		-	mode related ioctls
677 *	@tty: tty for the ioctl
678 *	@file: file pointer for the tty
679 *	@cmd: command
680 *	@arg: ioctl argument
681 *
682 *	Perform non line discipline specific mode control ioctls. This
683 *	is designed to be called by line disciplines to ensure they provide
684 *	consistent mode setting.
685 */
686
687int tty_mode_ioctl(struct tty_struct *tty, struct file *file,
688			unsigned int cmd, unsigned long arg)
689{
690	struct tty_struct *real_tty;
691	void __user *p = (void __user *)arg;
692	int ret = 0;
693	struct ktermios kterm;
694
695	BUG_ON(file == NULL);
696
697	if (tty->driver->type == TTY_DRIVER_TYPE_PTY &&
698	    tty->driver->subtype == PTY_TYPE_MASTER)
699		real_tty = tty->link;
700	else
701		real_tty = tty;
702
703	switch (cmd) {
704#ifdef TIOCGETP
705	case TIOCGETP:
706		return get_sgttyb(real_tty, (struct sgttyb __user *) arg);
707	case TIOCSETP:
708	case TIOCSETN:
709		return set_sgttyb(real_tty, (struct sgttyb __user *) arg);
710#endif
711#ifdef TIOCGETC
712	case TIOCGETC:
713		return get_tchars(real_tty, p);
714	case TIOCSETC:
715		return set_tchars(real_tty, p);
716#endif
717#ifdef TIOCGLTC
718	case TIOCGLTC:
719		return get_ltchars(real_tty, p);
720	case TIOCSLTC:
721		return set_ltchars(real_tty, p);
722#endif
723	case TCSETSF:
724		return set_termios(real_tty, p,  TERMIOS_FLUSH | TERMIOS_WAIT | TERMIOS_OLD);
725	case TCSETSW:
726		return set_termios(real_tty, p, TERMIOS_WAIT | TERMIOS_OLD);
727	case TCSETS:
728		return set_termios(real_tty, p, TERMIOS_OLD);
729#ifndef TCGETS2
730	case TCGETS:
731		copy_termios(real_tty, &kterm);
732		if (kernel_termios_to_user_termios((struct termios __user *)arg, &kterm))
733			ret = -EFAULT;
734		return ret;
735#else
736	case TCGETS:
737		copy_termios(real_tty, &kterm);
738		if (kernel_termios_to_user_termios_1((struct termios __user *)arg, &kterm))
739			ret = -EFAULT;
740		return ret;
741	case TCGETS2:
742		copy_termios(real_tty, &kterm);
743		if (kernel_termios_to_user_termios((struct termios2 __user *)arg, &kterm))
744			ret = -EFAULT;
745		return ret;
746	case TCSETSF2:
747		return set_termios(real_tty, p,  TERMIOS_FLUSH | TERMIOS_WAIT);
748	case TCSETSW2:
749		return set_termios(real_tty, p, TERMIOS_WAIT);
750	case TCSETS2:
751		return set_termios(real_tty, p, 0);
752#endif
753	case TCGETA:
754		return get_termio(real_tty, p);
755	case TCSETAF:
756		return set_termios(real_tty, p, TERMIOS_FLUSH | TERMIOS_WAIT | TERMIOS_TERMIO);
757	case TCSETAW:
758		return set_termios(real_tty, p, TERMIOS_WAIT | TERMIOS_TERMIO);
759	case TCSETA:
760		return set_termios(real_tty, p, TERMIOS_TERMIO);
761#ifndef TCGETS2
762	case TIOCGLCKTRMIOS:
763		copy_termios_locked(real_tty, &kterm);
764		if (kernel_termios_to_user_termios((struct termios __user *)arg, &kterm))
765			ret = -EFAULT;
766		return ret;
767	case TIOCSLCKTRMIOS:
768		if (!capable(CAP_SYS_ADMIN))
769			return -EPERM;
770		copy_termios_locked(real_tty, &kterm);
771		if (user_termios_to_kernel_termios(&kterm,
772					       (struct termios __user *) arg))
773			return -EFAULT;
774		down_write(&real_tty->termios_rwsem);
775		real_tty->termios_locked = kterm;
776		up_write(&real_tty->termios_rwsem);
777		return 0;
778#else
779	case TIOCGLCKTRMIOS:
780		copy_termios_locked(real_tty, &kterm);
781		if (kernel_termios_to_user_termios_1((struct termios __user *)arg, &kterm))
782			ret = -EFAULT;
783		return ret;
784	case TIOCSLCKTRMIOS:
785		if (!capable(CAP_SYS_ADMIN))
786			return -EPERM;
787		copy_termios_locked(real_tty, &kterm);
788		if (user_termios_to_kernel_termios_1(&kterm,
789					       (struct termios __user *) arg))
790			return -EFAULT;
791		down_write(&real_tty->termios_rwsem);
792		real_tty->termios_locked = kterm;
793		up_write(&real_tty->termios_rwsem);
794		return ret;
795#endif
796#ifdef TCGETX
797	case TCGETX:
798	case TCSETX:
799	case TCSETXW:
800	case TCSETXF:
801		return -ENOTTY;
802#endif
803	case TIOCGSOFTCAR:
804		copy_termios(real_tty, &kterm);
805		ret = put_user((kterm.c_cflag & CLOCAL) ? 1 : 0,
806						(int __user *)arg);
807		return ret;
808	case TIOCSSOFTCAR:
809		if (get_user(arg, (unsigned int __user *) arg))
810			return -EFAULT;
811		return tty_change_softcar(real_tty, arg);
812	default:
813		return -ENOIOCTLCMD;
814	}
815}
816EXPORT_SYMBOL_GPL(tty_mode_ioctl);
817
818
819/* Caller guarantees ldisc reference is held */
820static int __tty_perform_flush(struct tty_struct *tty, unsigned long arg)
821{
822	struct tty_ldisc *ld = tty->ldisc;
823
824	switch (arg) {
825	case TCIFLUSH:
826		if (ld && ld->ops->flush_buffer) {
827			ld->ops->flush_buffer(tty);
828			tty_unthrottle(tty);
829		}
830		break;
831	case TCIOFLUSH:
832		if (ld && ld->ops->flush_buffer) {
833			ld->ops->flush_buffer(tty);
834			tty_unthrottle(tty);
835		}
836		fallthrough;
837	case TCOFLUSH:
838		tty_driver_flush_buffer(tty);
839		break;
840	default:
841		return -EINVAL;
842	}
843	return 0;
844}
845
846int tty_perform_flush(struct tty_struct *tty, unsigned long arg)
847{
848	struct tty_ldisc *ld;
849	int retval = tty_check_change(tty);
850	if (retval)
851		return retval;
852
853	ld = tty_ldisc_ref_wait(tty);
854	retval = __tty_perform_flush(tty, arg);
855	if (ld)
856		tty_ldisc_deref(ld);
857	return retval;
858}
859EXPORT_SYMBOL_GPL(tty_perform_flush);
860
861int n_tty_ioctl_helper(struct tty_struct *tty, struct file *file,
862		       unsigned int cmd, unsigned long arg)
863{
864	int retval;
865
866	switch (cmd) {
867	case TCXONC:
868		retval = tty_check_change(tty);
869		if (retval)
870			return retval;
871		switch (arg) {
872		case TCOOFF:
873			spin_lock_irq(&tty->flow.lock);
874			if (!tty->flow.tco_stopped) {
875				tty->flow.tco_stopped = true;
876				__stop_tty(tty);
877			}
878			spin_unlock_irq(&tty->flow.lock);
879			break;
880		case TCOON:
881			spin_lock_irq(&tty->flow.lock);
882			if (tty->flow.tco_stopped) {
883				tty->flow.tco_stopped = false;
884				__start_tty(tty);
885			}
886			spin_unlock_irq(&tty->flow.lock);
887			break;
888		case TCIOFF:
889			if (STOP_CHAR(tty) != __DISABLED_CHAR)
890				retval = tty_send_xchar(tty, STOP_CHAR(tty));
891			break;
892		case TCION:
893			if (START_CHAR(tty) != __DISABLED_CHAR)
894				retval = tty_send_xchar(tty, START_CHAR(tty));
895			break;
896		default:
897			return -EINVAL;
898		}
899		return retval;
900	case TCFLSH:
901		retval = tty_check_change(tty);
902		if (retval)
903			return retval;
904		return __tty_perform_flush(tty, arg);
905	default:
906		/* Try the mode commands */
907		return tty_mode_ioctl(tty, file, cmd, arg);
908	}
909}
910EXPORT_SYMBOL(n_tty_ioctl_helper);