Răsfoiți Sursa

sandbox: Tidy up terminal restore

For some reason 'u-boot -D' does not restore the terminal correctly when
the 'reset' command is used. Call the terminal restore function explicitly
in this case.

Signed-off-by: Simon Glass <sjg@chromium.org>
Reviewed-by: Joe Hershberger <joe.hershberger@ni.com>
Simon Glass 10 ani în urmă
părinte
comite
8939df092e
3 a modificat fișierele cu 15 adăugiri și 3 ștergeri
  1. 2 0
      arch/sandbox/cpu/cpu.c
  2. 5 3
      arch/sandbox/cpu/os.c
  3. 8 0
      include/os.h

+ 2 - 0
arch/sandbox/cpu/cpu.c

@@ -22,6 +22,8 @@ unsigned long map_len;
 
 void reset_cpu(ulong ignored)
 {
+	/* Do this here while it still has an effect */
+	os_fd_restore();
 	if (state_uninit())
 		os_exit(2);
 

+ 5 - 3
arch/sandbox/cpu/os.c

@@ -107,10 +107,12 @@ void os_exit(int exit_code)
 static struct termios orig_term;
 static bool term_setup;
 
-static void os_fd_restore(void)
+void os_fd_restore(void)
 {
-	if (term_setup)
+	if (term_setup) {
 		tcsetattr(0, TCSANOW, &orig_term);
+		term_setup = false;
+	}
 }
 
 /* Put tty into raw mode so <tab> and <ctrl+c> work */
@@ -120,7 +122,6 @@ void os_tty_raw(int fd, bool allow_sigs)
 
 	if (term_setup)
 		return;
-	term_setup = true;
 
 	/* If not a tty, don't complain */
 	if (tcgetattr(fd, &orig_term))
@@ -134,6 +135,7 @@ void os_tty_raw(int fd, bool allow_sigs)
 	if (tcsetattr(fd, TCSANOW, &term))
 		return;
 
+	term_setup = true;
 	atexit(os_fd_restore);
 }
 

+ 8 - 0
include/os.h

@@ -111,6 +111,14 @@ void os_exit(int exit_code) __attribute__((noreturn));
  */
 void os_tty_raw(int fd, bool allow_sigs);
 
+/**
+ * Restore the tty to its original mode
+ *
+ * Call this to restore the original terminal mode, after it has been changed
+ * by os_tty_raw(). This is an internal function.
+ */
+void os_fd_restore(void);
+
 /**
  * Acquires some memory from the underlying os.
  *