xref: /openbmc/linux/drivers/tty/serial/kgdboc.c (revision 4800cd83)
1 /*
2  * Based on the same principle as kgdboe using the NETPOLL api, this
3  * driver uses a console polling api to implement a gdb serial inteface
4  * which is multiplexed on a console port.
5  *
6  * Maintainer: Jason Wessel <jason.wessel@windriver.com>
7  *
8  * 2007-2008 (c) Jason Wessel - Wind River Systems, Inc.
9  *
10  * This file is licensed under the terms of the GNU General Public
11  * License version 2. This program is licensed "as is" without any
12  * warranty of any kind, whether express or implied.
13  */
14 #include <linux/kernel.h>
15 #include <linux/ctype.h>
16 #include <linux/kgdb.h>
17 #include <linux/kdb.h>
18 #include <linux/tty.h>
19 #include <linux/console.h>
20 #include <linux/vt_kern.h>
21 #include <linux/input.h>
22 
23 #define MAX_CONFIG_LEN		40
24 
25 static struct kgdb_io		kgdboc_io_ops;
26 
27 /* -1 = init not run yet, 0 = unconfigured, 1 = configured. */
28 static int configured		= -1;
29 
30 static char config[MAX_CONFIG_LEN];
31 static struct kparam_string kps = {
32 	.string			= config,
33 	.maxlen			= MAX_CONFIG_LEN,
34 };
35 
36 static int kgdboc_use_kms;  /* 1 if we use kernel mode switching */
37 static struct tty_driver	*kgdb_tty_driver;
38 static int			kgdb_tty_line;
39 
40 #ifdef CONFIG_KDB_KEYBOARD
41 static int kgdboc_reset_connect(struct input_handler *handler,
42 				struct input_dev *dev,
43 				const struct input_device_id *id)
44 {
45 	input_reset_device(dev);
46 
47 	/* Retrun an error - we do not want to bind, just to reset */
48 	return -ENODEV;
49 }
50 
51 static void kgdboc_reset_disconnect(struct input_handle *handle)
52 {
53 	/* We do not expect anyone to actually bind to us */
54 	BUG();
55 }
56 
57 static const struct input_device_id kgdboc_reset_ids[] = {
58 	{
59 		.flags = INPUT_DEVICE_ID_MATCH_EVBIT,
60 		.evbit = { BIT_MASK(EV_KEY) },
61 	},
62 	{ }
63 };
64 
65 static struct input_handler kgdboc_reset_handler = {
66 	.connect	= kgdboc_reset_connect,
67 	.disconnect	= kgdboc_reset_disconnect,
68 	.name		= "kgdboc_reset",
69 	.id_table	= kgdboc_reset_ids,
70 };
71 
72 static DEFINE_MUTEX(kgdboc_reset_mutex);
73 
74 static void kgdboc_restore_input_helper(struct work_struct *dummy)
75 {
76 	/*
77 	 * We need to take a mutex to prevent several instances of
78 	 * this work running on different CPUs so they don't try
79 	 * to register again already registered handler.
80 	 */
81 	mutex_lock(&kgdboc_reset_mutex);
82 
83 	if (input_register_handler(&kgdboc_reset_handler) == 0)
84 		input_unregister_handler(&kgdboc_reset_handler);
85 
86 	mutex_unlock(&kgdboc_reset_mutex);
87 }
88 
89 static DECLARE_WORK(kgdboc_restore_input_work, kgdboc_restore_input_helper);
90 
91 static void kgdboc_restore_input(void)
92 {
93 	if (likely(system_state == SYSTEM_RUNNING))
94 		schedule_work(&kgdboc_restore_input_work);
95 }
96 
97 static int kgdboc_register_kbd(char **cptr)
98 {
99 	if (strncmp(*cptr, "kbd", 3) == 0) {
100 		if (kdb_poll_idx < KDB_POLL_FUNC_MAX) {
101 			kdb_poll_funcs[kdb_poll_idx] = kdb_get_kbd_char;
102 			kdb_poll_idx++;
103 			if (cptr[0][3] == ',')
104 				*cptr += 4;
105 			else
106 				return 1;
107 		}
108 	}
109 	return 0;
110 }
111 
112 static void kgdboc_unregister_kbd(void)
113 {
114 	int i;
115 
116 	for (i = 0; i < kdb_poll_idx; i++) {
117 		if (kdb_poll_funcs[i] == kdb_get_kbd_char) {
118 			kdb_poll_idx--;
119 			kdb_poll_funcs[i] = kdb_poll_funcs[kdb_poll_idx];
120 			kdb_poll_funcs[kdb_poll_idx] = NULL;
121 			i--;
122 		}
123 	}
124 	flush_work_sync(&kgdboc_restore_input_work);
125 }
126 #else /* ! CONFIG_KDB_KEYBOARD */
127 #define kgdboc_register_kbd(x) 0
128 #define kgdboc_unregister_kbd()
129 #define kgdboc_restore_input()
130 #endif /* ! CONFIG_KDB_KEYBOARD */
131 
132 static int kgdboc_option_setup(char *opt)
133 {
134 	if (strlen(opt) > MAX_CONFIG_LEN) {
135 		printk(KERN_ERR "kgdboc: config string too long\n");
136 		return -ENOSPC;
137 	}
138 	strcpy(config, opt);
139 
140 	return 0;
141 }
142 
143 __setup("kgdboc=", kgdboc_option_setup);
144 
145 static void cleanup_kgdboc(void)
146 {
147 	kgdboc_unregister_kbd();
148 	if (configured == 1)
149 		kgdb_unregister_io_module(&kgdboc_io_ops);
150 }
151 
152 static int configure_kgdboc(void)
153 {
154 	struct tty_driver *p;
155 	int tty_line = 0;
156 	int err;
157 	char *cptr = config;
158 	struct console *cons;
159 
160 	err = kgdboc_option_setup(config);
161 	if (err || !strlen(config) || isspace(config[0]))
162 		goto noconfig;
163 
164 	err = -ENODEV;
165 	kgdboc_io_ops.is_console = 0;
166 	kgdb_tty_driver = NULL;
167 
168 	kgdboc_use_kms = 0;
169 	if (strncmp(cptr, "kms,", 4) == 0) {
170 		cptr += 4;
171 		kgdboc_use_kms = 1;
172 	}
173 
174 	if (kgdboc_register_kbd(&cptr))
175 		goto do_register;
176 
177 	p = tty_find_polling_driver(cptr, &tty_line);
178 	if (!p)
179 		goto noconfig;
180 
181 	cons = console_drivers;
182 	while (cons) {
183 		int idx;
184 		if (cons->device && cons->device(cons, &idx) == p &&
185 		    idx == tty_line) {
186 			kgdboc_io_ops.is_console = 1;
187 			break;
188 		}
189 		cons = cons->next;
190 	}
191 
192 	kgdb_tty_driver = p;
193 	kgdb_tty_line = tty_line;
194 
195 do_register:
196 	err = kgdb_register_io_module(&kgdboc_io_ops);
197 	if (err)
198 		goto noconfig;
199 
200 	configured = 1;
201 
202 	return 0;
203 
204 noconfig:
205 	config[0] = 0;
206 	configured = 0;
207 	cleanup_kgdboc();
208 
209 	return err;
210 }
211 
212 static int __init init_kgdboc(void)
213 {
214 	/* Already configured? */
215 	if (configured == 1)
216 		return 0;
217 
218 	return configure_kgdboc();
219 }
220 
221 static int kgdboc_get_char(void)
222 {
223 	if (!kgdb_tty_driver)
224 		return -1;
225 	return kgdb_tty_driver->ops->poll_get_char(kgdb_tty_driver,
226 						kgdb_tty_line);
227 }
228 
229 static void kgdboc_put_char(u8 chr)
230 {
231 	if (!kgdb_tty_driver)
232 		return;
233 	kgdb_tty_driver->ops->poll_put_char(kgdb_tty_driver,
234 					kgdb_tty_line, chr);
235 }
236 
237 static int param_set_kgdboc_var(const char *kmessage, struct kernel_param *kp)
238 {
239 	int len = strlen(kmessage);
240 
241 	if (len >= MAX_CONFIG_LEN) {
242 		printk(KERN_ERR "kgdboc: config string too long\n");
243 		return -ENOSPC;
244 	}
245 
246 	/* Only copy in the string if the init function has not run yet */
247 	if (configured < 0) {
248 		strcpy(config, kmessage);
249 		return 0;
250 	}
251 
252 	if (kgdb_connected) {
253 		printk(KERN_ERR
254 		       "kgdboc: Cannot reconfigure while KGDB is connected.\n");
255 
256 		return -EBUSY;
257 	}
258 
259 	strcpy(config, kmessage);
260 	/* Chop out \n char as a result of echo */
261 	if (config[len - 1] == '\n')
262 		config[len - 1] = '\0';
263 
264 	if (configured == 1)
265 		cleanup_kgdboc();
266 
267 	/* Go and configure with the new params. */
268 	return configure_kgdboc();
269 }
270 
271 static int dbg_restore_graphics;
272 
273 static void kgdboc_pre_exp_handler(void)
274 {
275 	if (!dbg_restore_graphics && kgdboc_use_kms) {
276 		dbg_restore_graphics = 1;
277 		con_debug_enter(vc_cons[fg_console].d);
278 	}
279 	/* Increment the module count when the debugger is active */
280 	if (!kgdb_connected)
281 		try_module_get(THIS_MODULE);
282 }
283 
284 static void kgdboc_post_exp_handler(void)
285 {
286 	/* decrement the module count when the debugger detaches */
287 	if (!kgdb_connected)
288 		module_put(THIS_MODULE);
289 	if (kgdboc_use_kms && dbg_restore_graphics) {
290 		dbg_restore_graphics = 0;
291 		con_debug_leave();
292 	}
293 	kgdboc_restore_input();
294 }
295 
296 static struct kgdb_io kgdboc_io_ops = {
297 	.name			= "kgdboc",
298 	.read_char		= kgdboc_get_char,
299 	.write_char		= kgdboc_put_char,
300 	.pre_exception		= kgdboc_pre_exp_handler,
301 	.post_exception		= kgdboc_post_exp_handler,
302 };
303 
304 #ifdef CONFIG_KGDB_SERIAL_CONSOLE
305 /* This is only available if kgdboc is a built in for early debugging */
306 static int __init kgdboc_early_init(char *opt)
307 {
308 	/* save the first character of the config string because the
309 	 * init routine can destroy it.
310 	 */
311 	char save_ch;
312 
313 	kgdboc_option_setup(opt);
314 	save_ch = config[0];
315 	init_kgdboc();
316 	config[0] = save_ch;
317 	return 0;
318 }
319 
320 early_param("ekgdboc", kgdboc_early_init);
321 #endif /* CONFIG_KGDB_SERIAL_CONSOLE */
322 
323 module_init(init_kgdboc);
324 module_exit(cleanup_kgdboc);
325 module_param_call(kgdboc, param_set_kgdboc_var, param_get_string, &kps, 0644);
326 MODULE_PARM_DESC(kgdboc, "<serial_device>[,baud]");
327 MODULE_DESCRIPTION("KGDB Console TTY Driver");
328 MODULE_LICENSE("GPL");
329