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
19struct mutex gGlobalTTYLock;
20struct mutex gTTYCookieLock;
21struct recursive_lock gTTYRequestLock;
22
23
24static void
25dump_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
47static void
48dump_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
77static int
78dump_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
99void
100tty_add_debugger_commands()
101{
102	add_debugger_command("tty", &dump_tty, "Dump info on a tty");
103}
104
105
106void
107tty_remove_debugger_commands()
108{
109	remove_debugger_command("tty", &dump_tty);
110}
111
112
113static status_t
114init_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
131static void
132uninit_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
142static int32
143tty_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
158static 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
179module_info *modules[] = {
180	(module_info *)&sTTYModule,
181	NULL
182};
183