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