xref: /OK3568_Linux_fs/kernel/drivers/tty/serial/kgdboc.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  * Based on the same principle as kgdboe using the NETPOLL api, this
4*4882a593Smuzhiyun  * driver uses a console polling api to implement a gdb serial inteface
5*4882a593Smuzhiyun  * which is multiplexed on a console port.
6*4882a593Smuzhiyun  *
7*4882a593Smuzhiyun  * Maintainer: Jason Wessel <jason.wessel@windriver.com>
8*4882a593Smuzhiyun  *
9*4882a593Smuzhiyun  * 2007-2008 (c) Jason Wessel - Wind River Systems, Inc.
10*4882a593Smuzhiyun  */
11*4882a593Smuzhiyun 
12*4882a593Smuzhiyun #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
13*4882a593Smuzhiyun 
14*4882a593Smuzhiyun #include <linux/kernel.h>
15*4882a593Smuzhiyun #include <linux/ctype.h>
16*4882a593Smuzhiyun #include <linux/kgdb.h>
17*4882a593Smuzhiyun #include <linux/kdb.h>
18*4882a593Smuzhiyun #include <linux/tty.h>
19*4882a593Smuzhiyun #include <linux/console.h>
20*4882a593Smuzhiyun #include <linux/vt_kern.h>
21*4882a593Smuzhiyun #include <linux/input.h>
22*4882a593Smuzhiyun #include <linux/module.h>
23*4882a593Smuzhiyun #include <linux/platform_device.h>
24*4882a593Smuzhiyun #include <linux/serial_core.h>
25*4882a593Smuzhiyun 
26*4882a593Smuzhiyun #define MAX_CONFIG_LEN		40
27*4882a593Smuzhiyun 
28*4882a593Smuzhiyun static struct kgdb_io		kgdboc_io_ops;
29*4882a593Smuzhiyun 
30*4882a593Smuzhiyun /* -1 = init not run yet, 0 = unconfigured, 1 = configured. */
31*4882a593Smuzhiyun static int configured		= -1;
32*4882a593Smuzhiyun static DEFINE_MUTEX(config_mutex);
33*4882a593Smuzhiyun 
34*4882a593Smuzhiyun static char config[MAX_CONFIG_LEN];
35*4882a593Smuzhiyun static struct kparam_string kps = {
36*4882a593Smuzhiyun 	.string			= config,
37*4882a593Smuzhiyun 	.maxlen			= MAX_CONFIG_LEN,
38*4882a593Smuzhiyun };
39*4882a593Smuzhiyun 
40*4882a593Smuzhiyun static int kgdboc_use_kms;  /* 1 if we use kernel mode switching */
41*4882a593Smuzhiyun static struct tty_driver	*kgdb_tty_driver;
42*4882a593Smuzhiyun static int			kgdb_tty_line;
43*4882a593Smuzhiyun 
44*4882a593Smuzhiyun static struct platform_device *kgdboc_pdev;
45*4882a593Smuzhiyun 
46*4882a593Smuzhiyun #if IS_BUILTIN(CONFIG_KGDB_SERIAL_CONSOLE)
47*4882a593Smuzhiyun static struct kgdb_io		kgdboc_earlycon_io_ops;
48*4882a593Smuzhiyun static int                      (*earlycon_orig_exit)(struct console *con);
49*4882a593Smuzhiyun #endif /* IS_BUILTIN(CONFIG_KGDB_SERIAL_CONSOLE) */
50*4882a593Smuzhiyun 
51*4882a593Smuzhiyun #ifdef CONFIG_KDB_KEYBOARD
kgdboc_reset_connect(struct input_handler * handler,struct input_dev * dev,const struct input_device_id * id)52*4882a593Smuzhiyun static int kgdboc_reset_connect(struct input_handler *handler,
53*4882a593Smuzhiyun 				struct input_dev *dev,
54*4882a593Smuzhiyun 				const struct input_device_id *id)
55*4882a593Smuzhiyun {
56*4882a593Smuzhiyun 	input_reset_device(dev);
57*4882a593Smuzhiyun 
58*4882a593Smuzhiyun 	/* Return an error - we do not want to bind, just to reset */
59*4882a593Smuzhiyun 	return -ENODEV;
60*4882a593Smuzhiyun }
61*4882a593Smuzhiyun 
kgdboc_reset_disconnect(struct input_handle * handle)62*4882a593Smuzhiyun static void kgdboc_reset_disconnect(struct input_handle *handle)
63*4882a593Smuzhiyun {
64*4882a593Smuzhiyun 	/* We do not expect anyone to actually bind to us */
65*4882a593Smuzhiyun 	BUG();
66*4882a593Smuzhiyun }
67*4882a593Smuzhiyun 
68*4882a593Smuzhiyun static const struct input_device_id kgdboc_reset_ids[] = {
69*4882a593Smuzhiyun 	{
70*4882a593Smuzhiyun 		.flags = INPUT_DEVICE_ID_MATCH_EVBIT,
71*4882a593Smuzhiyun 		.evbit = { BIT_MASK(EV_KEY) },
72*4882a593Smuzhiyun 	},
73*4882a593Smuzhiyun 	{ }
74*4882a593Smuzhiyun };
75*4882a593Smuzhiyun 
76*4882a593Smuzhiyun static struct input_handler kgdboc_reset_handler = {
77*4882a593Smuzhiyun 	.connect	= kgdboc_reset_connect,
78*4882a593Smuzhiyun 	.disconnect	= kgdboc_reset_disconnect,
79*4882a593Smuzhiyun 	.name		= "kgdboc_reset",
80*4882a593Smuzhiyun 	.id_table	= kgdboc_reset_ids,
81*4882a593Smuzhiyun };
82*4882a593Smuzhiyun 
83*4882a593Smuzhiyun static DEFINE_MUTEX(kgdboc_reset_mutex);
84*4882a593Smuzhiyun 
kgdboc_restore_input_helper(struct work_struct * dummy)85*4882a593Smuzhiyun static void kgdboc_restore_input_helper(struct work_struct *dummy)
86*4882a593Smuzhiyun {
87*4882a593Smuzhiyun 	/*
88*4882a593Smuzhiyun 	 * We need to take a mutex to prevent several instances of
89*4882a593Smuzhiyun 	 * this work running on different CPUs so they don't try
90*4882a593Smuzhiyun 	 * to register again already registered handler.
91*4882a593Smuzhiyun 	 */
92*4882a593Smuzhiyun 	mutex_lock(&kgdboc_reset_mutex);
93*4882a593Smuzhiyun 
94*4882a593Smuzhiyun 	if (input_register_handler(&kgdboc_reset_handler) == 0)
95*4882a593Smuzhiyun 		input_unregister_handler(&kgdboc_reset_handler);
96*4882a593Smuzhiyun 
97*4882a593Smuzhiyun 	mutex_unlock(&kgdboc_reset_mutex);
98*4882a593Smuzhiyun }
99*4882a593Smuzhiyun 
100*4882a593Smuzhiyun static DECLARE_WORK(kgdboc_restore_input_work, kgdboc_restore_input_helper);
101*4882a593Smuzhiyun 
kgdboc_restore_input(void)102*4882a593Smuzhiyun static void kgdboc_restore_input(void)
103*4882a593Smuzhiyun {
104*4882a593Smuzhiyun 	if (likely(system_state == SYSTEM_RUNNING))
105*4882a593Smuzhiyun 		schedule_work(&kgdboc_restore_input_work);
106*4882a593Smuzhiyun }
107*4882a593Smuzhiyun 
kgdboc_register_kbd(char ** cptr)108*4882a593Smuzhiyun static int kgdboc_register_kbd(char **cptr)
109*4882a593Smuzhiyun {
110*4882a593Smuzhiyun 	if (strncmp(*cptr, "kbd", 3) == 0 ||
111*4882a593Smuzhiyun 		strncmp(*cptr, "kdb", 3) == 0) {
112*4882a593Smuzhiyun 		if (kdb_poll_idx < KDB_POLL_FUNC_MAX) {
113*4882a593Smuzhiyun 			kdb_poll_funcs[kdb_poll_idx] = kdb_get_kbd_char;
114*4882a593Smuzhiyun 			kdb_poll_idx++;
115*4882a593Smuzhiyun 			if (cptr[0][3] == ',')
116*4882a593Smuzhiyun 				*cptr += 4;
117*4882a593Smuzhiyun 			else
118*4882a593Smuzhiyun 				return 1;
119*4882a593Smuzhiyun 		}
120*4882a593Smuzhiyun 	}
121*4882a593Smuzhiyun 	return 0;
122*4882a593Smuzhiyun }
123*4882a593Smuzhiyun 
kgdboc_unregister_kbd(void)124*4882a593Smuzhiyun static void kgdboc_unregister_kbd(void)
125*4882a593Smuzhiyun {
126*4882a593Smuzhiyun 	int i;
127*4882a593Smuzhiyun 
128*4882a593Smuzhiyun 	for (i = 0; i < kdb_poll_idx; i++) {
129*4882a593Smuzhiyun 		if (kdb_poll_funcs[i] == kdb_get_kbd_char) {
130*4882a593Smuzhiyun 			kdb_poll_idx--;
131*4882a593Smuzhiyun 			kdb_poll_funcs[i] = kdb_poll_funcs[kdb_poll_idx];
132*4882a593Smuzhiyun 			kdb_poll_funcs[kdb_poll_idx] = NULL;
133*4882a593Smuzhiyun 			i--;
134*4882a593Smuzhiyun 		}
135*4882a593Smuzhiyun 	}
136*4882a593Smuzhiyun 	flush_work(&kgdboc_restore_input_work);
137*4882a593Smuzhiyun }
138*4882a593Smuzhiyun #else /* ! CONFIG_KDB_KEYBOARD */
139*4882a593Smuzhiyun #define kgdboc_register_kbd(x) 0
140*4882a593Smuzhiyun #define kgdboc_unregister_kbd()
141*4882a593Smuzhiyun #define kgdboc_restore_input()
142*4882a593Smuzhiyun #endif /* ! CONFIG_KDB_KEYBOARD */
143*4882a593Smuzhiyun 
144*4882a593Smuzhiyun #if IS_BUILTIN(CONFIG_KGDB_SERIAL_CONSOLE)
cleanup_earlycon(void)145*4882a593Smuzhiyun static void cleanup_earlycon(void)
146*4882a593Smuzhiyun {
147*4882a593Smuzhiyun 	if (kgdboc_earlycon_io_ops.cons)
148*4882a593Smuzhiyun 		kgdb_unregister_io_module(&kgdboc_earlycon_io_ops);
149*4882a593Smuzhiyun }
150*4882a593Smuzhiyun #else /* !IS_BUILTIN(CONFIG_KGDB_SERIAL_CONSOLE) */
cleanup_earlycon(void)151*4882a593Smuzhiyun static inline void cleanup_earlycon(void) { }
152*4882a593Smuzhiyun #endif /* !IS_BUILTIN(CONFIG_KGDB_SERIAL_CONSOLE) */
153*4882a593Smuzhiyun 
cleanup_kgdboc(void)154*4882a593Smuzhiyun static void cleanup_kgdboc(void)
155*4882a593Smuzhiyun {
156*4882a593Smuzhiyun 	cleanup_earlycon();
157*4882a593Smuzhiyun 
158*4882a593Smuzhiyun 	if (configured != 1)
159*4882a593Smuzhiyun 		return;
160*4882a593Smuzhiyun 
161*4882a593Smuzhiyun 	if (kgdb_unregister_nmi_console())
162*4882a593Smuzhiyun 		return;
163*4882a593Smuzhiyun 	kgdboc_unregister_kbd();
164*4882a593Smuzhiyun 	kgdb_unregister_io_module(&kgdboc_io_ops);
165*4882a593Smuzhiyun }
166*4882a593Smuzhiyun 
configure_kgdboc(void)167*4882a593Smuzhiyun static int configure_kgdboc(void)
168*4882a593Smuzhiyun {
169*4882a593Smuzhiyun 	struct tty_driver *p;
170*4882a593Smuzhiyun 	int tty_line = 0;
171*4882a593Smuzhiyun 	int err = -ENODEV;
172*4882a593Smuzhiyun 	char *cptr = config;
173*4882a593Smuzhiyun 	struct console *cons;
174*4882a593Smuzhiyun 
175*4882a593Smuzhiyun 	if (!strlen(config) || isspace(config[0])) {
176*4882a593Smuzhiyun 		err = 0;
177*4882a593Smuzhiyun 		goto noconfig;
178*4882a593Smuzhiyun 	}
179*4882a593Smuzhiyun 
180*4882a593Smuzhiyun 	kgdboc_io_ops.cons = NULL;
181*4882a593Smuzhiyun 	kgdb_tty_driver = NULL;
182*4882a593Smuzhiyun 
183*4882a593Smuzhiyun 	kgdboc_use_kms = 0;
184*4882a593Smuzhiyun 	if (strncmp(cptr, "kms,", 4) == 0) {
185*4882a593Smuzhiyun 		cptr += 4;
186*4882a593Smuzhiyun 		kgdboc_use_kms = 1;
187*4882a593Smuzhiyun 	}
188*4882a593Smuzhiyun 
189*4882a593Smuzhiyun 	if (kgdboc_register_kbd(&cptr))
190*4882a593Smuzhiyun 		goto do_register;
191*4882a593Smuzhiyun 
192*4882a593Smuzhiyun 	p = tty_find_polling_driver(cptr, &tty_line);
193*4882a593Smuzhiyun 	if (!p)
194*4882a593Smuzhiyun 		goto noconfig;
195*4882a593Smuzhiyun 
196*4882a593Smuzhiyun 	for_each_console(cons) {
197*4882a593Smuzhiyun 		int idx;
198*4882a593Smuzhiyun 		if (cons->device && cons->device(cons, &idx) == p &&
199*4882a593Smuzhiyun 		    idx == tty_line) {
200*4882a593Smuzhiyun 			kgdboc_io_ops.cons = cons;
201*4882a593Smuzhiyun 			break;
202*4882a593Smuzhiyun 		}
203*4882a593Smuzhiyun 	}
204*4882a593Smuzhiyun 
205*4882a593Smuzhiyun 	kgdb_tty_driver = p;
206*4882a593Smuzhiyun 	kgdb_tty_line = tty_line;
207*4882a593Smuzhiyun 
208*4882a593Smuzhiyun do_register:
209*4882a593Smuzhiyun 	err = kgdb_register_io_module(&kgdboc_io_ops);
210*4882a593Smuzhiyun 	if (err)
211*4882a593Smuzhiyun 		goto noconfig;
212*4882a593Smuzhiyun 
213*4882a593Smuzhiyun 	err = kgdb_register_nmi_console();
214*4882a593Smuzhiyun 	if (err)
215*4882a593Smuzhiyun 		goto nmi_con_failed;
216*4882a593Smuzhiyun 
217*4882a593Smuzhiyun 	configured = 1;
218*4882a593Smuzhiyun 
219*4882a593Smuzhiyun 	return 0;
220*4882a593Smuzhiyun 
221*4882a593Smuzhiyun nmi_con_failed:
222*4882a593Smuzhiyun 	kgdb_unregister_io_module(&kgdboc_io_ops);
223*4882a593Smuzhiyun noconfig:
224*4882a593Smuzhiyun 	kgdboc_unregister_kbd();
225*4882a593Smuzhiyun 	configured = 0;
226*4882a593Smuzhiyun 
227*4882a593Smuzhiyun 	return err;
228*4882a593Smuzhiyun }
229*4882a593Smuzhiyun 
kgdboc_probe(struct platform_device * pdev)230*4882a593Smuzhiyun static int kgdboc_probe(struct platform_device *pdev)
231*4882a593Smuzhiyun {
232*4882a593Smuzhiyun 	int ret = 0;
233*4882a593Smuzhiyun 
234*4882a593Smuzhiyun 	mutex_lock(&config_mutex);
235*4882a593Smuzhiyun 	if (configured != 1) {
236*4882a593Smuzhiyun 		ret = configure_kgdboc();
237*4882a593Smuzhiyun 
238*4882a593Smuzhiyun 		/* Convert "no device" to "defer" so we'll keep trying */
239*4882a593Smuzhiyun 		if (ret == -ENODEV)
240*4882a593Smuzhiyun 			ret = -EPROBE_DEFER;
241*4882a593Smuzhiyun 	}
242*4882a593Smuzhiyun 	mutex_unlock(&config_mutex);
243*4882a593Smuzhiyun 
244*4882a593Smuzhiyun 	return ret;
245*4882a593Smuzhiyun }
246*4882a593Smuzhiyun 
247*4882a593Smuzhiyun static struct platform_driver kgdboc_platform_driver = {
248*4882a593Smuzhiyun 	.probe = kgdboc_probe,
249*4882a593Smuzhiyun 	.driver = {
250*4882a593Smuzhiyun 		.name = "kgdboc",
251*4882a593Smuzhiyun 		.suppress_bind_attrs = true,
252*4882a593Smuzhiyun 	},
253*4882a593Smuzhiyun };
254*4882a593Smuzhiyun 
init_kgdboc(void)255*4882a593Smuzhiyun static int __init init_kgdboc(void)
256*4882a593Smuzhiyun {
257*4882a593Smuzhiyun 	int ret;
258*4882a593Smuzhiyun 
259*4882a593Smuzhiyun 	/*
260*4882a593Smuzhiyun 	 * kgdboc is a little bit of an odd "platform_driver".  It can be
261*4882a593Smuzhiyun 	 * up and running long before the platform_driver object is
262*4882a593Smuzhiyun 	 * created and thus doesn't actually store anything in it.  There's
263*4882a593Smuzhiyun 	 * only one instance of kgdb so anything is stored as global state.
264*4882a593Smuzhiyun 	 * The platform_driver is only created so that we can leverage the
265*4882a593Smuzhiyun 	 * kernel's mechanisms (like -EPROBE_DEFER) to call us when our
266*4882a593Smuzhiyun 	 * underlying tty is ready.  Here we init our platform driver and
267*4882a593Smuzhiyun 	 * then create the single kgdboc instance.
268*4882a593Smuzhiyun 	 */
269*4882a593Smuzhiyun 	ret = platform_driver_register(&kgdboc_platform_driver);
270*4882a593Smuzhiyun 	if (ret)
271*4882a593Smuzhiyun 		return ret;
272*4882a593Smuzhiyun 
273*4882a593Smuzhiyun 	kgdboc_pdev = platform_device_alloc("kgdboc", PLATFORM_DEVID_NONE);
274*4882a593Smuzhiyun 	if (!kgdboc_pdev) {
275*4882a593Smuzhiyun 		ret = -ENOMEM;
276*4882a593Smuzhiyun 		goto err_did_register;
277*4882a593Smuzhiyun 	}
278*4882a593Smuzhiyun 
279*4882a593Smuzhiyun 	ret = platform_device_add(kgdboc_pdev);
280*4882a593Smuzhiyun 	if (!ret)
281*4882a593Smuzhiyun 		return 0;
282*4882a593Smuzhiyun 
283*4882a593Smuzhiyun 	platform_device_put(kgdboc_pdev);
284*4882a593Smuzhiyun 
285*4882a593Smuzhiyun err_did_register:
286*4882a593Smuzhiyun 	platform_driver_unregister(&kgdboc_platform_driver);
287*4882a593Smuzhiyun 	return ret;
288*4882a593Smuzhiyun }
289*4882a593Smuzhiyun 
exit_kgdboc(void)290*4882a593Smuzhiyun static void exit_kgdboc(void)
291*4882a593Smuzhiyun {
292*4882a593Smuzhiyun 	mutex_lock(&config_mutex);
293*4882a593Smuzhiyun 	cleanup_kgdboc();
294*4882a593Smuzhiyun 	mutex_unlock(&config_mutex);
295*4882a593Smuzhiyun 
296*4882a593Smuzhiyun 	platform_device_unregister(kgdboc_pdev);
297*4882a593Smuzhiyun 	platform_driver_unregister(&kgdboc_platform_driver);
298*4882a593Smuzhiyun }
299*4882a593Smuzhiyun 
kgdboc_get_char(void)300*4882a593Smuzhiyun static int kgdboc_get_char(void)
301*4882a593Smuzhiyun {
302*4882a593Smuzhiyun 	if (!kgdb_tty_driver)
303*4882a593Smuzhiyun 		return -1;
304*4882a593Smuzhiyun 	return kgdb_tty_driver->ops->poll_get_char(kgdb_tty_driver,
305*4882a593Smuzhiyun 						kgdb_tty_line);
306*4882a593Smuzhiyun }
307*4882a593Smuzhiyun 
kgdboc_put_char(u8 chr)308*4882a593Smuzhiyun static void kgdboc_put_char(u8 chr)
309*4882a593Smuzhiyun {
310*4882a593Smuzhiyun 	if (!kgdb_tty_driver)
311*4882a593Smuzhiyun 		return;
312*4882a593Smuzhiyun 	kgdb_tty_driver->ops->poll_put_char(kgdb_tty_driver,
313*4882a593Smuzhiyun 					kgdb_tty_line, chr);
314*4882a593Smuzhiyun }
315*4882a593Smuzhiyun 
param_set_kgdboc_var(const char * kmessage,const struct kernel_param * kp)316*4882a593Smuzhiyun static int param_set_kgdboc_var(const char *kmessage,
317*4882a593Smuzhiyun 				const struct kernel_param *kp)
318*4882a593Smuzhiyun {
319*4882a593Smuzhiyun 	size_t len = strlen(kmessage);
320*4882a593Smuzhiyun 	int ret = 0;
321*4882a593Smuzhiyun 
322*4882a593Smuzhiyun 	if (len >= MAX_CONFIG_LEN) {
323*4882a593Smuzhiyun 		pr_err("config string too long\n");
324*4882a593Smuzhiyun 		return -ENOSPC;
325*4882a593Smuzhiyun 	}
326*4882a593Smuzhiyun 
327*4882a593Smuzhiyun 	if (kgdb_connected) {
328*4882a593Smuzhiyun 		pr_err("Cannot reconfigure while KGDB is connected.\n");
329*4882a593Smuzhiyun 		return -EBUSY;
330*4882a593Smuzhiyun 	}
331*4882a593Smuzhiyun 
332*4882a593Smuzhiyun 	mutex_lock(&config_mutex);
333*4882a593Smuzhiyun 
334*4882a593Smuzhiyun 	strcpy(config, kmessage);
335*4882a593Smuzhiyun 	/* Chop out \n char as a result of echo */
336*4882a593Smuzhiyun 	if (len && config[len - 1] == '\n')
337*4882a593Smuzhiyun 		config[len - 1] = '\0';
338*4882a593Smuzhiyun 
339*4882a593Smuzhiyun 	if (configured == 1)
340*4882a593Smuzhiyun 		cleanup_kgdboc();
341*4882a593Smuzhiyun 
342*4882a593Smuzhiyun 	/*
343*4882a593Smuzhiyun 	 * Configure with the new params as long as init already ran.
344*4882a593Smuzhiyun 	 * Note that we can get called before init if someone loads us
345*4882a593Smuzhiyun 	 * with "modprobe kgdboc kgdboc=..." or if they happen to use the
346*4882a593Smuzhiyun 	 * the odd syntax of "kgdboc.kgdboc=..." on the kernel command.
347*4882a593Smuzhiyun 	 */
348*4882a593Smuzhiyun 	if (configured >= 0)
349*4882a593Smuzhiyun 		ret = configure_kgdboc();
350*4882a593Smuzhiyun 
351*4882a593Smuzhiyun 	/*
352*4882a593Smuzhiyun 	 * If we couldn't configure then clear out the config.  Note that
353*4882a593Smuzhiyun 	 * specifying an invalid config on the kernel command line vs.
354*4882a593Smuzhiyun 	 * through sysfs have slightly different behaviors.  If we fail
355*4882a593Smuzhiyun 	 * to configure what was specified on the kernel command line
356*4882a593Smuzhiyun 	 * we'll leave it in the 'config' and return -EPROBE_DEFER from
357*4882a593Smuzhiyun 	 * our probe.  When specified through sysfs userspace is
358*4882a593Smuzhiyun 	 * responsible for loading the tty driver before setting up.
359*4882a593Smuzhiyun 	 */
360*4882a593Smuzhiyun 	if (ret)
361*4882a593Smuzhiyun 		config[0] = '\0';
362*4882a593Smuzhiyun 
363*4882a593Smuzhiyun 	mutex_unlock(&config_mutex);
364*4882a593Smuzhiyun 
365*4882a593Smuzhiyun 	return ret;
366*4882a593Smuzhiyun }
367*4882a593Smuzhiyun 
368*4882a593Smuzhiyun static int dbg_restore_graphics;
369*4882a593Smuzhiyun 
kgdboc_pre_exp_handler(void)370*4882a593Smuzhiyun static void kgdboc_pre_exp_handler(void)
371*4882a593Smuzhiyun {
372*4882a593Smuzhiyun 	if (!dbg_restore_graphics && kgdboc_use_kms) {
373*4882a593Smuzhiyun 		dbg_restore_graphics = 1;
374*4882a593Smuzhiyun 		con_debug_enter(vc_cons[fg_console].d);
375*4882a593Smuzhiyun 	}
376*4882a593Smuzhiyun 	/* Increment the module count when the debugger is active */
377*4882a593Smuzhiyun 	if (!kgdb_connected)
378*4882a593Smuzhiyun 		try_module_get(THIS_MODULE);
379*4882a593Smuzhiyun }
380*4882a593Smuzhiyun 
kgdboc_post_exp_handler(void)381*4882a593Smuzhiyun static void kgdboc_post_exp_handler(void)
382*4882a593Smuzhiyun {
383*4882a593Smuzhiyun 	/* decrement the module count when the debugger detaches */
384*4882a593Smuzhiyun 	if (!kgdb_connected)
385*4882a593Smuzhiyun 		module_put(THIS_MODULE);
386*4882a593Smuzhiyun 	if (kgdboc_use_kms && dbg_restore_graphics) {
387*4882a593Smuzhiyun 		dbg_restore_graphics = 0;
388*4882a593Smuzhiyun 		con_debug_leave();
389*4882a593Smuzhiyun 	}
390*4882a593Smuzhiyun 	kgdboc_restore_input();
391*4882a593Smuzhiyun }
392*4882a593Smuzhiyun 
393*4882a593Smuzhiyun static struct kgdb_io kgdboc_io_ops = {
394*4882a593Smuzhiyun 	.name			= "kgdboc",
395*4882a593Smuzhiyun 	.read_char		= kgdboc_get_char,
396*4882a593Smuzhiyun 	.write_char		= kgdboc_put_char,
397*4882a593Smuzhiyun 	.pre_exception		= kgdboc_pre_exp_handler,
398*4882a593Smuzhiyun 	.post_exception		= kgdboc_post_exp_handler,
399*4882a593Smuzhiyun };
400*4882a593Smuzhiyun 
401*4882a593Smuzhiyun #if IS_BUILTIN(CONFIG_KGDB_SERIAL_CONSOLE)
kgdboc_option_setup(char * opt)402*4882a593Smuzhiyun static int kgdboc_option_setup(char *opt)
403*4882a593Smuzhiyun {
404*4882a593Smuzhiyun 	if (!opt) {
405*4882a593Smuzhiyun 		pr_err("config string not provided\n");
406*4882a593Smuzhiyun 		return 1;
407*4882a593Smuzhiyun 	}
408*4882a593Smuzhiyun 
409*4882a593Smuzhiyun 	if (strlen(opt) >= MAX_CONFIG_LEN) {
410*4882a593Smuzhiyun 		pr_err("config string too long\n");
411*4882a593Smuzhiyun 		return 1;
412*4882a593Smuzhiyun 	}
413*4882a593Smuzhiyun 	strcpy(config, opt);
414*4882a593Smuzhiyun 
415*4882a593Smuzhiyun 	return 1;
416*4882a593Smuzhiyun }
417*4882a593Smuzhiyun 
418*4882a593Smuzhiyun __setup("kgdboc=", kgdboc_option_setup);
419*4882a593Smuzhiyun 
420*4882a593Smuzhiyun 
421*4882a593Smuzhiyun /* This is only available if kgdboc is a built in for early debugging */
kgdboc_early_init(char * opt)422*4882a593Smuzhiyun static int __init kgdboc_early_init(char *opt)
423*4882a593Smuzhiyun {
424*4882a593Smuzhiyun 	kgdboc_option_setup(opt);
425*4882a593Smuzhiyun 	configure_kgdboc();
426*4882a593Smuzhiyun 	return 0;
427*4882a593Smuzhiyun }
428*4882a593Smuzhiyun 
429*4882a593Smuzhiyun early_param("ekgdboc", kgdboc_early_init);
430*4882a593Smuzhiyun 
kgdboc_earlycon_get_char(void)431*4882a593Smuzhiyun static int kgdboc_earlycon_get_char(void)
432*4882a593Smuzhiyun {
433*4882a593Smuzhiyun 	char c;
434*4882a593Smuzhiyun 
435*4882a593Smuzhiyun 	if (!kgdboc_earlycon_io_ops.cons->read(kgdboc_earlycon_io_ops.cons,
436*4882a593Smuzhiyun 					       &c, 1))
437*4882a593Smuzhiyun 		return NO_POLL_CHAR;
438*4882a593Smuzhiyun 
439*4882a593Smuzhiyun 	return c;
440*4882a593Smuzhiyun }
441*4882a593Smuzhiyun 
kgdboc_earlycon_put_char(u8 chr)442*4882a593Smuzhiyun static void kgdboc_earlycon_put_char(u8 chr)
443*4882a593Smuzhiyun {
444*4882a593Smuzhiyun 	kgdboc_earlycon_io_ops.cons->write(kgdboc_earlycon_io_ops.cons, &chr,
445*4882a593Smuzhiyun 					   1);
446*4882a593Smuzhiyun }
447*4882a593Smuzhiyun 
kgdboc_earlycon_pre_exp_handler(void)448*4882a593Smuzhiyun static void kgdboc_earlycon_pre_exp_handler(void)
449*4882a593Smuzhiyun {
450*4882a593Smuzhiyun 	struct console *con;
451*4882a593Smuzhiyun 	static bool already_warned;
452*4882a593Smuzhiyun 
453*4882a593Smuzhiyun 	if (already_warned)
454*4882a593Smuzhiyun 		return;
455*4882a593Smuzhiyun 
456*4882a593Smuzhiyun 	/*
457*4882a593Smuzhiyun 	 * When the first normal console comes up the kernel will take all
458*4882a593Smuzhiyun 	 * the boot consoles out of the list.  Really, we should stop using
459*4882a593Smuzhiyun 	 * the boot console when it does that but until a TTY is registered
460*4882a593Smuzhiyun 	 * we have no other choice so we keep using it.  Since not all
461*4882a593Smuzhiyun 	 * serial drivers might be OK with this, print a warning once per
462*4882a593Smuzhiyun 	 * boot if we detect this case.
463*4882a593Smuzhiyun 	 */
464*4882a593Smuzhiyun 	for_each_console(con)
465*4882a593Smuzhiyun 		if (con == kgdboc_earlycon_io_ops.cons)
466*4882a593Smuzhiyun 			return;
467*4882a593Smuzhiyun 
468*4882a593Smuzhiyun 	already_warned = true;
469*4882a593Smuzhiyun 	pr_warn("kgdboc_earlycon is still using bootconsole\n");
470*4882a593Smuzhiyun }
471*4882a593Smuzhiyun 
kgdboc_earlycon_deferred_exit(struct console * con)472*4882a593Smuzhiyun static int kgdboc_earlycon_deferred_exit(struct console *con)
473*4882a593Smuzhiyun {
474*4882a593Smuzhiyun 	/*
475*4882a593Smuzhiyun 	 * If we get here it means the boot console is going away but we
476*4882a593Smuzhiyun 	 * don't yet have a suitable replacement.  Don't pass through to
477*4882a593Smuzhiyun 	 * the original exit routine.  We'll call it later in our deinit()
478*4882a593Smuzhiyun 	 * function.  For now, restore the original exit() function pointer
479*4882a593Smuzhiyun 	 * as a sentinal that we've hit this point.
480*4882a593Smuzhiyun 	 */
481*4882a593Smuzhiyun 	con->exit = earlycon_orig_exit;
482*4882a593Smuzhiyun 
483*4882a593Smuzhiyun 	return 0;
484*4882a593Smuzhiyun }
485*4882a593Smuzhiyun 
kgdboc_earlycon_deinit(void)486*4882a593Smuzhiyun static void kgdboc_earlycon_deinit(void)
487*4882a593Smuzhiyun {
488*4882a593Smuzhiyun 	if (!kgdboc_earlycon_io_ops.cons)
489*4882a593Smuzhiyun 		return;
490*4882a593Smuzhiyun 
491*4882a593Smuzhiyun 	if (kgdboc_earlycon_io_ops.cons->exit == kgdboc_earlycon_deferred_exit)
492*4882a593Smuzhiyun 		/*
493*4882a593Smuzhiyun 		 * kgdboc_earlycon is exiting but original boot console exit
494*4882a593Smuzhiyun 		 * was never called (AKA kgdboc_earlycon_deferred_exit()
495*4882a593Smuzhiyun 		 * didn't ever run).  Undo our trap.
496*4882a593Smuzhiyun 		 */
497*4882a593Smuzhiyun 		kgdboc_earlycon_io_ops.cons->exit = earlycon_orig_exit;
498*4882a593Smuzhiyun 	else if (kgdboc_earlycon_io_ops.cons->exit)
499*4882a593Smuzhiyun 		/*
500*4882a593Smuzhiyun 		 * We skipped calling the exit() routine so we could try to
501*4882a593Smuzhiyun 		 * keep using the boot console even after it went away.  We're
502*4882a593Smuzhiyun 		 * finally done so call the function now.
503*4882a593Smuzhiyun 		 */
504*4882a593Smuzhiyun 		kgdboc_earlycon_io_ops.cons->exit(kgdboc_earlycon_io_ops.cons);
505*4882a593Smuzhiyun 
506*4882a593Smuzhiyun 	kgdboc_earlycon_io_ops.cons = NULL;
507*4882a593Smuzhiyun }
508*4882a593Smuzhiyun 
509*4882a593Smuzhiyun static struct kgdb_io kgdboc_earlycon_io_ops = {
510*4882a593Smuzhiyun 	.name			= "kgdboc_earlycon",
511*4882a593Smuzhiyun 	.read_char		= kgdboc_earlycon_get_char,
512*4882a593Smuzhiyun 	.write_char		= kgdboc_earlycon_put_char,
513*4882a593Smuzhiyun 	.pre_exception		= kgdboc_earlycon_pre_exp_handler,
514*4882a593Smuzhiyun 	.deinit			= kgdboc_earlycon_deinit,
515*4882a593Smuzhiyun };
516*4882a593Smuzhiyun 
517*4882a593Smuzhiyun #define MAX_CONSOLE_NAME_LEN (sizeof((struct console *) 0)->name)
518*4882a593Smuzhiyun static char kgdboc_earlycon_param[MAX_CONSOLE_NAME_LEN] __initdata;
519*4882a593Smuzhiyun static bool kgdboc_earlycon_late_enable __initdata;
520*4882a593Smuzhiyun 
kgdboc_earlycon_init(char * opt)521*4882a593Smuzhiyun static int __init kgdboc_earlycon_init(char *opt)
522*4882a593Smuzhiyun {
523*4882a593Smuzhiyun 	struct console *con;
524*4882a593Smuzhiyun 
525*4882a593Smuzhiyun 	kdb_init(KDB_INIT_EARLY);
526*4882a593Smuzhiyun 
527*4882a593Smuzhiyun 	/*
528*4882a593Smuzhiyun 	 * Look for a matching console, or if the name was left blank just
529*4882a593Smuzhiyun 	 * pick the first one we find.
530*4882a593Smuzhiyun 	 */
531*4882a593Smuzhiyun 	console_lock();
532*4882a593Smuzhiyun 	for_each_console(con) {
533*4882a593Smuzhiyun 		if (con->write && con->read &&
534*4882a593Smuzhiyun 		    (con->flags & (CON_BOOT | CON_ENABLED)) &&
535*4882a593Smuzhiyun 		    (!opt || !opt[0] || strcmp(con->name, opt) == 0))
536*4882a593Smuzhiyun 			break;
537*4882a593Smuzhiyun 	}
538*4882a593Smuzhiyun 
539*4882a593Smuzhiyun 	if (!con) {
540*4882a593Smuzhiyun 		/*
541*4882a593Smuzhiyun 		 * Both earlycon and kgdboc_earlycon are initialized during
542*4882a593Smuzhiyun 		 * early parameter parsing. We cannot guarantee earlycon gets
543*4882a593Smuzhiyun 		 * in first and, in any case, on ACPI systems earlycon may
544*4882a593Smuzhiyun 		 * defer its own initialization (usually to somewhere within
545*4882a593Smuzhiyun 		 * setup_arch() ). To cope with either of these situations
546*4882a593Smuzhiyun 		 * we can defer our own initialization to a little later in
547*4882a593Smuzhiyun 		 * the boot.
548*4882a593Smuzhiyun 		 */
549*4882a593Smuzhiyun 		if (!kgdboc_earlycon_late_enable) {
550*4882a593Smuzhiyun 			pr_info("No suitable earlycon yet, will try later\n");
551*4882a593Smuzhiyun 			if (opt)
552*4882a593Smuzhiyun 				strscpy(kgdboc_earlycon_param, opt,
553*4882a593Smuzhiyun 					sizeof(kgdboc_earlycon_param));
554*4882a593Smuzhiyun 			kgdboc_earlycon_late_enable = true;
555*4882a593Smuzhiyun 		} else {
556*4882a593Smuzhiyun 			pr_info("Couldn't find kgdb earlycon\n");
557*4882a593Smuzhiyun 		}
558*4882a593Smuzhiyun 		goto unlock;
559*4882a593Smuzhiyun 	}
560*4882a593Smuzhiyun 
561*4882a593Smuzhiyun 	kgdboc_earlycon_io_ops.cons = con;
562*4882a593Smuzhiyun 	pr_info("Going to register kgdb with earlycon '%s'\n", con->name);
563*4882a593Smuzhiyun 	if (kgdb_register_io_module(&kgdboc_earlycon_io_ops) != 0) {
564*4882a593Smuzhiyun 		kgdboc_earlycon_io_ops.cons = NULL;
565*4882a593Smuzhiyun 		pr_info("Failed to register kgdb with earlycon\n");
566*4882a593Smuzhiyun 	} else {
567*4882a593Smuzhiyun 		/* Trap exit so we can keep earlycon longer if needed. */
568*4882a593Smuzhiyun 		earlycon_orig_exit = con->exit;
569*4882a593Smuzhiyun 		con->exit = kgdboc_earlycon_deferred_exit;
570*4882a593Smuzhiyun 	}
571*4882a593Smuzhiyun 
572*4882a593Smuzhiyun unlock:
573*4882a593Smuzhiyun 	console_unlock();
574*4882a593Smuzhiyun 
575*4882a593Smuzhiyun 	/* Non-zero means malformed option so we always return zero */
576*4882a593Smuzhiyun 	return 0;
577*4882a593Smuzhiyun }
578*4882a593Smuzhiyun 
579*4882a593Smuzhiyun early_param("kgdboc_earlycon", kgdboc_earlycon_init);
580*4882a593Smuzhiyun 
581*4882a593Smuzhiyun /*
582*4882a593Smuzhiyun  * This is only intended for the late adoption of an early console.
583*4882a593Smuzhiyun  *
584*4882a593Smuzhiyun  * It is not a reliable way to adopt regular consoles because we can not
585*4882a593Smuzhiyun  * control what order console initcalls are made and, in any case, many
586*4882a593Smuzhiyun  * regular consoles are registered much later in the boot process than
587*4882a593Smuzhiyun  * the console initcalls!
588*4882a593Smuzhiyun  */
kgdboc_earlycon_late_init(void)589*4882a593Smuzhiyun static int __init kgdboc_earlycon_late_init(void)
590*4882a593Smuzhiyun {
591*4882a593Smuzhiyun 	if (kgdboc_earlycon_late_enable)
592*4882a593Smuzhiyun 		kgdboc_earlycon_init(kgdboc_earlycon_param);
593*4882a593Smuzhiyun 	return 0;
594*4882a593Smuzhiyun }
595*4882a593Smuzhiyun console_initcall(kgdboc_earlycon_late_init);
596*4882a593Smuzhiyun 
597*4882a593Smuzhiyun #endif /* IS_BUILTIN(CONFIG_KGDB_SERIAL_CONSOLE) */
598*4882a593Smuzhiyun 
599*4882a593Smuzhiyun module_init(init_kgdboc);
600*4882a593Smuzhiyun module_exit(exit_kgdboc);
601*4882a593Smuzhiyun module_param_call(kgdboc, param_set_kgdboc_var, param_get_string, &kps, 0644);
602*4882a593Smuzhiyun MODULE_PARM_DESC(kgdboc, "<serial_device>[,baud]");
603*4882a593Smuzhiyun MODULE_DESCRIPTION("KGDB Console TTY Driver");
604*4882a593Smuzhiyun MODULE_LICENSE("GPL");
605