1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
|
--- hw/xfree86/os-support/bsd/bsd_init.c.orig 2022-01-02 23:41:56.000000000 +0100
+++ hw/xfree86/os-support/bsd/bsd_init.c 2022-06-29 11:57:25.596851000 +0200
@@ -48,6 +48,8 @@ static int initialVT = -1;
#if defined (SYSCONS_SUPPORT) || defined (PCVT_SUPPORT)
static int VTnum = -1;
static int initialVT = -1;
+static struct termios tty_attr; /* tty state to restore */
+static int tty_mode; /* kbd mode to restore */
#endif
#ifdef PCCONS_SUPPORT
@@ -230,6 +232,9 @@ xf86OpenConsole()
* Add cases for other *BSD that behave the same.
*/
#if defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
+#if defined(__sparc64__)
+ pci_system_init_dev_mem(fd);
+#endif
uname(&uts);
i = atof(uts.release) * 100;
if (i >= 310)
@@ -253,6 +258,7 @@ xf86OpenConsole()
#endif
acquire_vt:
if (!xf86Info.ShareVTs) {
+ struct termios nTty;
/*
* now get the VT
*/
@@ -287,6 +293,26 @@ xf86OpenConsole()
if (ioctl(xf86Info.consoleFd, KDSETMODE, KD_GRAPHICS) < 0) {
FatalError("xf86OpenConsole: KDSETMODE KD_GRAPHICS failed");
}
+
+ tcgetattr(xf86Info.consoleFd, &tty_attr);
+ ioctl(xf86Info.consoleFd, KDGKBMODE, &tty_mode);
+
+ /* disable special keys */
+ if (ioctl(xf86Info.consoleFd, KDSKBMODE, K_RAW) < 0) {
+ FatalError("xf86OpenConsole: KDSKBMODE K_RAW failed (%s)",
+ strerror(errno));
+ }
+
+ nTty = tty_attr;
+ nTty.c_iflag = IGNPAR | IGNBRK;
+ nTty.c_oflag = 0;
+ nTty.c_cflag = CREAD | CS8;
+ nTty.c_lflag = 0;
+ nTty.c_cc[VTIME] = 0;
+ nTty.c_cc[VMIN] = 1;
+ cfsetispeed(&nTty, 9600);
+ cfsetospeed(&nTty, 9600);
+ tcsetattr(xf86Info.consoleFd, TCSANOW, &nTty);
}
else { /* xf86Info.ShareVTs */
close(xf86Info.consoleFd);
@@ -594,6 +620,8 @@ xf86CloseConsole()
case SYSCONS:
case PCVT:
ioctl(xf86Info.consoleFd, KDSETMODE, KD_TEXT); /* Back to text mode */
+ ioctl(xf86Info.consoleFd, KDSKBMODE, tty_mode);
+ tcsetattr(xf86Info.consoleFd, TCSANOW, &tty_attr);
if (ioctl(xf86Info.consoleFd, VT_GETMODE, &VT) != -1) {
VT.mode = VT_AUTO;
ioctl(xf86Info.consoleFd, VT_SETMODE, &VT); /* dflt vt handling */
|