1 /*
2 * Copyright 2010, Michael Lotz, mmlr@mlotz.ch.
3 * Copyright 2004, Axel Dörfler, axeld@pinc-software.de.
4 * Distributed under the terms of the MIT License.
5 */
6
7 #include <new>
8
9 #include <stdio.h>
10 #include <stdlib.h>
11 #include <string.h>
12
13 #include <lock.h>
14
15 #include <tty/tty_module.h>
16
17 #include "tty_private.h"
18
19 struct mutex gGlobalTTYLock;
20 struct mutex gTTYCookieLock;
21 struct recursive_lock gTTYRequestLock;
22
23
24 static void
dump_tty_settings(struct tty_settings & settings)25 dump_tty_settings(struct tty_settings& settings)
26 {
27 kprintf(" pgrp_id: %" B_PRId32 "\n", settings.pgrp_id);
28 kprintf(" session_id: %" B_PRId32 "\n", settings.session_id);
29
30 kprintf(" termios:\n");
31 kprintf(" c_iflag: 0x%08" B_PRIx32 "\n", settings.termios.c_iflag);
32 kprintf(" c_oflag: 0x%08" B_PRIx32 "\n", settings.termios.c_oflag);
33 kprintf(" c_cflag: 0x%08" B_PRIx32 "\n", settings.termios.c_cflag);
34 kprintf(" c_lflag: 0x%08" B_PRIx32 "\n", settings.termios.c_lflag);
35 kprintf(" c_line: %d\n", settings.termios.c_line);
36 kprintf(" c_ispeed: %u\n", settings.termios.c_ispeed);
37 kprintf(" c_ospeed: %u\n", settings.termios.c_ospeed);
38 for (int i = 0; i < NCCS; i++)
39 kprintf(" c_cc[%02d]: %d\n", i, settings.termios.c_cc[i]);
40
41 kprintf(" wsize: %u x %u c, %u x %u pxl\n",
42 settings.window_size.ws_row, settings.window_size.ws_col,
43 settings.window_size.ws_xpixel, settings.window_size.ws_ypixel);
44 }
45
46
47 static void
dump_tty_struct(struct tty & tty)48 dump_tty_struct(struct tty& tty)
49 {
50 kprintf(" tty @: %p\n", &tty);
51 kprintf(" is_master: %s\n", tty.is_master ? "true" : "false");
52 kprintf(" open_count: %" B_PRId32 "\n", tty.open_count);
53 kprintf(" select_pool: %p\n", tty.select_pool);
54 kprintf(" pending_eof: %" B_PRIu32 "\n", tty.pending_eof);
55
56 kprintf(" input_buffer:\n");
57 kprintf(" first: %" B_PRId32 "\n", tty.input_buffer.first);
58 kprintf(" in: %lu\n", tty.input_buffer.in);
59 kprintf(" size: %lu\n", tty.input_buffer.size);
60 kprintf(" buffer: %p\n", tty.input_buffer.buffer);
61
62 kprintf(" reader queue:\n");
63 tty.reader_queue.Dump(" ");
64 kprintf(" writer queue:\n");
65 tty.writer_queue.Dump(" ");
66
67 dump_tty_settings(*tty.settings);
68
69 kprintf(" cookies: ");
70 TTYCookieList::Iterator it = tty.cookies.GetIterator();
71 while (tty_cookie* cookie = it.Next())
72 kprintf(" %p", cookie);
73 kprintf("\n");
74 }
75
76
77 static int
dump_tty(int argc,char ** argv)78 dump_tty(int argc, char** argv)
79 {
80 if (argc < 2) {
81 kprintf("Usage: %s <tty address>\n", argv[0]);
82 return 0;
83 }
84
85 char* endpointer;
86 uintptr_t index = strtoul(argv[1], &endpointer, 0);
87 if (*endpointer != '\0') {
88 kprintf("Invalid tty index.\n");
89 return 0;
90 }
91
92 struct tty* tty = (struct tty*)index;
93 dump_tty_struct(*tty);
94
95 return 0;
96 }
97
98
99 void
tty_add_debugger_commands()100 tty_add_debugger_commands()
101 {
102 add_debugger_command("tty", &dump_tty, "Dump info on a tty");
103 }
104
105
106 void
tty_remove_debugger_commands()107 tty_remove_debugger_commands()
108 {
109 remove_debugger_command("tty", &dump_tty);
110 }
111
112
113 static status_t
init_tty_module()114 init_tty_module()
115 {
116 // create the request mutex
117 recursive_lock_init(&gTTYRequestLock, "tty requests");
118
119 // create the global mutex
120 mutex_init(&gGlobalTTYLock, "tty global");
121
122 // create the cookie mutex
123 mutex_init(&gTTYCookieLock, "tty cookies");
124
125 tty_add_debugger_commands();
126
127 return B_OK;
128 }
129
130
131 static void
uninit_tty_module()132 uninit_tty_module()
133 {
134 tty_remove_debugger_commands();
135
136 recursive_lock_destroy(&gTTYRequestLock);
137 mutex_destroy(&gTTYCookieLock);
138 mutex_destroy(&gGlobalTTYLock);
139 }
140
141
142 static int32
tty_module_std_ops(int32 op,...)143 tty_module_std_ops(int32 op, ...)
144 {
145 switch (op) {
146 case B_MODULE_INIT:
147 return init_tty_module();
148
149 case B_MODULE_UNINIT:
150 uninit_tty_module();
151 return B_OK;
152 }
153
154 return B_BAD_VALUE;
155 }
156
157
158 static struct tty_module_info sTTYModule = {
159 {
160 B_TTY_MODULE_NAME,
161 0, //B_KEEP_LOADED,
162 tty_module_std_ops
163 },
164
165 &tty_create,
166 &tty_destroy,
167 &tty_create_cookie,
168 &tty_close_cookie,
169 &tty_destroy_cookie,
170 &tty_read,
171 &tty_write,
172 &tty_control,
173 &tty_select,
174 &tty_deselect,
175 &tty_hardware_signal
176 };
177
178
179 module_info *modules[] = {
180 (module_info *)&sTTYModule,
181 NULL
182 };
183