cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

kgdbts.c (31354B)


      1// SPDX-License-Identifier: GPL-2.0-only
      2/*
      3 * kgdbts is a test suite for kgdb for the sole purpose of validating
      4 * that key pieces of the kgdb internals are working properly such as
      5 * HW/SW breakpoints, single stepping, and NMI.
      6 *
      7 * Created by: Jason Wessel <jason.wessel@windriver.com>
      8 *
      9 * Copyright (c) 2008 Wind River Systems, Inc.
     10 */
     11/* Information about the kgdb test suite.
     12 * -------------------------------------
     13 *
     14 * The kgdb test suite is designed as a KGDB I/O module which
     15 * simulates the communications that a debugger would have with kgdb.
     16 * The tests are broken up in to a line by line and referenced here as
     17 * a "get" which is kgdb requesting input and "put" which is kgdb
     18 * sending a response.
     19 *
     20 * The kgdb suite can be invoked from the kernel command line
     21 * arguments system or executed dynamically at run time.  The test
     22 * suite uses the variable "kgdbts" to obtain the information about
     23 * which tests to run and to configure the verbosity level.  The
     24 * following are the various characters you can use with the kgdbts=
     25 * line:
     26 *
     27 * When using the "kgdbts=" you only choose one of the following core
     28 * test types:
     29 * A = Run all the core tests silently
     30 * V1 = Run all the core tests with minimal output
     31 * V2 = Run all the core tests in debug mode
     32 *
     33 * You can also specify optional tests:
     34 * N## = Go to sleep with interrupts of for ## seconds
     35 *       to test the HW NMI watchdog
     36 * F## = Break at kernel_clone for ## iterations
     37 * S## = Break at sys_open for ## iterations
     38 * I## = Run the single step test ## iterations
     39 *
     40 * NOTE: that the kernel_clone and sys_open tests are mutually exclusive.
     41 *
     42 * To invoke the kgdb test suite from boot you use a kernel start
     43 * argument as follows:
     44 * 	kgdbts=V1 kgdbwait
     45 * Or if you wanted to perform the NMI test for 6 seconds and kernel_clone
     46 * test for 100 forks, you could use:
     47 * 	kgdbts=V1N6F100 kgdbwait
     48 *
     49 * The test suite can also be invoked at run time with:
     50 *	echo kgdbts=V1N6F100 > /sys/module/kgdbts/parameters/kgdbts
     51 * Or as another example:
     52 *	echo kgdbts=V2 > /sys/module/kgdbts/parameters/kgdbts
     53 *
     54 * When developing a new kgdb arch specific implementation or
     55 * using these tests for the purpose of regression testing,
     56 * several invocations are required.
     57 *
     58 * 1) Boot with the test suite enabled by using the kernel arguments
     59 *       "kgdbts=V1F100 kgdbwait"
     60 *    ## If kgdb arch specific implementation has NMI use
     61 *       "kgdbts=V1N6F100
     62 *
     63 * 2) After the system boot run the basic test.
     64 * echo kgdbts=V1 > /sys/module/kgdbts/parameters/kgdbts
     65 *
     66 * 3) Run the concurrency tests.  It is best to use n+1
     67 *    while loops where n is the number of cpus you have
     68 *    in your system.  The example below uses only two
     69 *    loops.
     70 *
     71 * ## This tests break points on sys_open
     72 * while [ 1 ] ; do find / > /dev/null 2>&1 ; done &
     73 * while [ 1 ] ; do find / > /dev/null 2>&1 ; done &
     74 * echo kgdbts=V1S10000 > /sys/module/kgdbts/parameters/kgdbts
     75 * fg # and hit control-c
     76 * fg # and hit control-c
     77 * ## This tests break points on kernel_clone
     78 * while [ 1 ] ; do date > /dev/null ; done &
     79 * while [ 1 ] ; do date > /dev/null ; done &
     80 * echo kgdbts=V1F1000 > /sys/module/kgdbts/parameters/kgdbts
     81 * fg # and hit control-c
     82 *
     83 */
     84
     85#include <linux/kernel.h>
     86#include <linux/kgdb.h>
     87#include <linux/ctype.h>
     88#include <linux/uaccess.h>
     89#include <linux/syscalls.h>
     90#include <linux/nmi.h>
     91#include <linux/delay.h>
     92#include <linux/kthread.h>
     93#include <linux/module.h>
     94#include <linux/sched/task.h>
     95#include <linux/kallsyms.h>
     96
     97#include <asm/sections.h>
     98
     99#define v1printk(a...) do {		\
    100	if (verbose)			\
    101		printk(KERN_INFO a);	\
    102} while (0)
    103#define v2printk(a...) do {		\
    104	if (verbose > 1) {		\
    105		printk(KERN_INFO a);	\
    106	}				\
    107	touch_nmi_watchdog();		\
    108} while (0)
    109#define eprintk(a...) do {		\
    110	printk(KERN_ERR a);		\
    111	WARN_ON(1);			\
    112} while (0)
    113#define MAX_CONFIG_LEN		40
    114
    115static struct kgdb_io kgdbts_io_ops;
    116static char get_buf[BUFMAX];
    117static int get_buf_cnt;
    118static char put_buf[BUFMAX];
    119static int put_buf_cnt;
    120static char scratch_buf[BUFMAX];
    121static int verbose;
    122static int repeat_test;
    123static int test_complete;
    124static int send_ack;
    125static int final_ack;
    126static int force_hwbrks;
    127static int hwbreaks_ok;
    128static int hw_break_val;
    129static int hw_break_val2;
    130static int cont_instead_of_sstep;
    131static unsigned long cont_thread_id;
    132static unsigned long sstep_thread_id;
    133#if defined(CONFIG_ARM) || defined(CONFIG_MIPS) || defined(CONFIG_SPARC)
    134static int arch_needs_sstep_emulation = 1;
    135#else
    136static int arch_needs_sstep_emulation;
    137#endif
    138static unsigned long cont_addr;
    139static unsigned long sstep_addr;
    140static int restart_from_top_after_write;
    141static int sstep_state;
    142
    143/* Storage for the registers, in GDB format. */
    144static unsigned long kgdbts_gdb_regs[(NUMREGBYTES +
    145					sizeof(unsigned long) - 1) /
    146					sizeof(unsigned long)];
    147static struct pt_regs kgdbts_regs;
    148
    149/* -1 = init not run yet, 0 = unconfigured, 1 = configured. */
    150static int configured		= -1;
    151
    152#ifdef CONFIG_KGDB_TESTS_BOOT_STRING
    153static char config[MAX_CONFIG_LEN] = CONFIG_KGDB_TESTS_BOOT_STRING;
    154#else
    155static char config[MAX_CONFIG_LEN];
    156#endif
    157static struct kparam_string kps = {
    158	.string			= config,
    159	.maxlen			= MAX_CONFIG_LEN,
    160};
    161
    162static void fill_get_buf(char *buf);
    163
    164struct test_struct {
    165	char *get;
    166	char *put;
    167	void (*get_handler)(char *);
    168	int (*put_handler)(char *, char *);
    169};
    170
    171struct test_state {
    172	char *name;
    173	struct test_struct *tst;
    174	int idx;
    175	int (*run_test) (int, int);
    176	int (*validate_put) (char *);
    177};
    178
    179static struct test_state ts;
    180
    181static int kgdbts_unreg_thread(void *ptr)
    182{
    183	/* Wait until the tests are complete and then ungresiter the I/O
    184	 * driver.
    185	 */
    186	while (!final_ack)
    187		msleep_interruptible(1500);
    188	/* Pause for any other threads to exit after final ack. */
    189	msleep_interruptible(1000);
    190	if (configured)
    191		kgdb_unregister_io_module(&kgdbts_io_ops);
    192	configured = 0;
    193
    194	return 0;
    195}
    196
    197/* This is noinline such that it can be used for a single location to
    198 * place a breakpoint
    199 */
    200static noinline void kgdbts_break_test(void)
    201{
    202	v2printk("kgdbts: breakpoint complete\n");
    203}
    204
    205/*
    206 * This is a cached wrapper for kallsyms_lookup_name().
    207 *
    208 * The cache is a big win for several tests. For example it more the doubles
    209 * the cycles per second during the sys_open test. This is not theoretic,
    210 * the performance improvement shows up at human scale, especially when
    211 * testing using emulators.
    212 *
    213 * Obviously neither re-entrant nor thread-safe but that is OK since it
    214 * can only be called from the debug trap (and therefore all other CPUs
    215 * are halted).
    216 */
    217static unsigned long lookup_addr(char *arg)
    218{
    219	static char cached_arg[KSYM_NAME_LEN];
    220	static unsigned long cached_addr;
    221
    222	if (strcmp(arg, cached_arg)) {
    223		strscpy(cached_arg, arg, KSYM_NAME_LEN);
    224		cached_addr = kallsyms_lookup_name(arg);
    225	}
    226
    227	return (unsigned long)dereference_function_descriptor(
    228			(void *)cached_addr);
    229}
    230
    231static void break_helper(char *bp_type, char *arg, unsigned long vaddr)
    232{
    233	unsigned long addr;
    234
    235	if (arg)
    236		addr = lookup_addr(arg);
    237	else
    238		addr = vaddr;
    239
    240	sprintf(scratch_buf, "%s,%lx,%i", bp_type, addr,
    241		BREAK_INSTR_SIZE);
    242	fill_get_buf(scratch_buf);
    243}
    244
    245static void sw_break(char *arg)
    246{
    247	break_helper(force_hwbrks ? "Z1" : "Z0", arg, 0);
    248}
    249
    250static void sw_rem_break(char *arg)
    251{
    252	break_helper(force_hwbrks ? "z1" : "z0", arg, 0);
    253}
    254
    255static void hw_break(char *arg)
    256{
    257	break_helper("Z1", arg, 0);
    258}
    259
    260static void hw_rem_break(char *arg)
    261{
    262	break_helper("z1", arg, 0);
    263}
    264
    265static void hw_write_break(char *arg)
    266{
    267	break_helper("Z2", arg, 0);
    268}
    269
    270static void hw_rem_write_break(char *arg)
    271{
    272	break_helper("z2", arg, 0);
    273}
    274
    275static void hw_access_break(char *arg)
    276{
    277	break_helper("Z4", arg, 0);
    278}
    279
    280static void hw_rem_access_break(char *arg)
    281{
    282	break_helper("z4", arg, 0);
    283}
    284
    285static void hw_break_val_access(void)
    286{
    287	hw_break_val2 = hw_break_val;
    288}
    289
    290static void hw_break_val_write(void)
    291{
    292	hw_break_val++;
    293}
    294
    295static int get_thread_id_continue(char *put_str, char *arg)
    296{
    297	char *ptr = &put_str[11];
    298
    299	if (put_str[1] != 'T' || put_str[2] != '0')
    300		return 1;
    301	kgdb_hex2long(&ptr, &cont_thread_id);
    302	return 0;
    303}
    304
    305static int check_and_rewind_pc(char *put_str, char *arg)
    306{
    307	unsigned long addr = lookup_addr(arg);
    308	unsigned long ip;
    309	int offset = 0;
    310
    311	kgdb_hex2mem(&put_str[1], (char *)kgdbts_gdb_regs,
    312		 NUMREGBYTES);
    313	gdb_regs_to_pt_regs(kgdbts_gdb_regs, &kgdbts_regs);
    314	ip = instruction_pointer(&kgdbts_regs);
    315	v2printk("Stopped at IP: %lx\n", ip);
    316#ifdef GDB_ADJUSTS_BREAK_OFFSET
    317	/* On some arches, a breakpoint stop requires it to be decremented */
    318	if (addr + BREAK_INSTR_SIZE == ip)
    319		offset = -BREAK_INSTR_SIZE;
    320#endif
    321
    322	if (arch_needs_sstep_emulation && sstep_addr &&
    323	    ip + offset == sstep_addr &&
    324	    ((!strcmp(arg, "do_sys_openat2") || !strcmp(arg, "kernel_clone")))) {
    325		/* This is special case for emulated single step */
    326		v2printk("Emul: rewind hit single step bp\n");
    327		restart_from_top_after_write = 1;
    328	} else if (strcmp(arg, "silent") && ip + offset != addr) {
    329		eprintk("kgdbts: BP mismatch %lx expected %lx\n",
    330			   ip + offset, addr);
    331		return 1;
    332	}
    333	/* Readjust the instruction pointer if needed */
    334	ip += offset;
    335	cont_addr = ip;
    336#ifdef GDB_ADJUSTS_BREAK_OFFSET
    337	instruction_pointer_set(&kgdbts_regs, ip);
    338#endif
    339	return 0;
    340}
    341
    342static int check_single_step(char *put_str, char *arg)
    343{
    344	unsigned long addr = lookup_addr(arg);
    345	static int matched_id;
    346
    347	/*
    348	 * From an arch indepent point of view the instruction pointer
    349	 * should be on a different instruction
    350	 */
    351	kgdb_hex2mem(&put_str[1], (char *)kgdbts_gdb_regs,
    352		 NUMREGBYTES);
    353	gdb_regs_to_pt_regs(kgdbts_gdb_regs, &kgdbts_regs);
    354	v2printk("Singlestep stopped at IP: %lx\n",
    355		   instruction_pointer(&kgdbts_regs));
    356
    357	if (sstep_thread_id != cont_thread_id) {
    358		/*
    359		 * Ensure we stopped in the same thread id as before, else the
    360		 * debugger should continue until the original thread that was
    361		 * single stepped is scheduled again, emulating gdb's behavior.
    362		 */
    363		v2printk("ThrID does not match: %lx\n", cont_thread_id);
    364		if (arch_needs_sstep_emulation) {
    365			if (matched_id &&
    366			    instruction_pointer(&kgdbts_regs) != addr)
    367				goto continue_test;
    368			matched_id++;
    369			ts.idx -= 2;
    370			sstep_state = 0;
    371			return 0;
    372		}
    373		cont_instead_of_sstep = 1;
    374		ts.idx -= 4;
    375		return 0;
    376	}
    377continue_test:
    378	matched_id = 0;
    379	if (instruction_pointer(&kgdbts_regs) == addr) {
    380		eprintk("kgdbts: SingleStep failed at %lx\n",
    381			   instruction_pointer(&kgdbts_regs));
    382		return 1;
    383	}
    384
    385	return 0;
    386}
    387
    388static void write_regs(char *arg)
    389{
    390	memset(scratch_buf, 0, sizeof(scratch_buf));
    391	scratch_buf[0] = 'G';
    392	pt_regs_to_gdb_regs(kgdbts_gdb_regs, &kgdbts_regs);
    393	kgdb_mem2hex((char *)kgdbts_gdb_regs, &scratch_buf[1], NUMREGBYTES);
    394	fill_get_buf(scratch_buf);
    395}
    396
    397static void skip_back_repeat_test(char *arg)
    398{
    399	int go_back = simple_strtol(arg, NULL, 10);
    400
    401	repeat_test--;
    402	if (repeat_test <= 0) {
    403		ts.idx++;
    404	} else {
    405		if (repeat_test % 100 == 0)
    406			v1printk("kgdbts:RUN ... %d remaining\n", repeat_test);
    407
    408		ts.idx -= go_back;
    409	}
    410	fill_get_buf(ts.tst[ts.idx].get);
    411}
    412
    413static int got_break(char *put_str, char *arg)
    414{
    415	test_complete = 1;
    416	if (!strncmp(put_str+1, arg, 2)) {
    417		if (!strncmp(arg, "T0", 2))
    418			test_complete = 2;
    419		return 0;
    420	}
    421	return 1;
    422}
    423
    424static void get_cont_catch(char *arg)
    425{
    426	/* Always send detach because the test is completed at this point */
    427	fill_get_buf("D");
    428}
    429
    430static int put_cont_catch(char *put_str, char *arg)
    431{
    432	/* This is at the end of the test and we catch any and all input */
    433	v2printk("kgdbts: cleanup task: %lx\n", sstep_thread_id);
    434	ts.idx--;
    435	return 0;
    436}
    437
    438static int emul_reset(char *put_str, char *arg)
    439{
    440	if (strncmp(put_str, "$OK", 3))
    441		return 1;
    442	if (restart_from_top_after_write) {
    443		restart_from_top_after_write = 0;
    444		ts.idx = -1;
    445	}
    446	return 0;
    447}
    448
    449static void emul_sstep_get(char *arg)
    450{
    451	if (!arch_needs_sstep_emulation) {
    452		if (cont_instead_of_sstep) {
    453			cont_instead_of_sstep = 0;
    454			fill_get_buf("c");
    455		} else {
    456			fill_get_buf(arg);
    457		}
    458		return;
    459	}
    460	switch (sstep_state) {
    461	case 0:
    462		v2printk("Emulate single step\n");
    463		/* Start by looking at the current PC */
    464		fill_get_buf("g");
    465		break;
    466	case 1:
    467		/* set breakpoint */
    468		break_helper("Z0", NULL, sstep_addr);
    469		break;
    470	case 2:
    471		/* Continue */
    472		fill_get_buf("c");
    473		break;
    474	case 3:
    475		/* Clear breakpoint */
    476		break_helper("z0", NULL, sstep_addr);
    477		break;
    478	default:
    479		eprintk("kgdbts: ERROR failed sstep get emulation\n");
    480	}
    481	sstep_state++;
    482}
    483
    484static int emul_sstep_put(char *put_str, char *arg)
    485{
    486	if (!arch_needs_sstep_emulation) {
    487		char *ptr = &put_str[11];
    488		if (put_str[1] != 'T' || put_str[2] != '0')
    489			return 1;
    490		kgdb_hex2long(&ptr, &sstep_thread_id);
    491		return 0;
    492	}
    493	switch (sstep_state) {
    494	case 1:
    495		/* validate the "g" packet to get the IP */
    496		kgdb_hex2mem(&put_str[1], (char *)kgdbts_gdb_regs,
    497			 NUMREGBYTES);
    498		gdb_regs_to_pt_regs(kgdbts_gdb_regs, &kgdbts_regs);
    499		v2printk("Stopped at IP: %lx\n",
    500			 instruction_pointer(&kgdbts_regs));
    501		/* Want to stop at IP + break instruction size by default */
    502		sstep_addr = cont_addr + BREAK_INSTR_SIZE;
    503		break;
    504	case 2:
    505		if (strncmp(put_str, "$OK", 3)) {
    506			eprintk("kgdbts: failed sstep break set\n");
    507			return 1;
    508		}
    509		break;
    510	case 3:
    511		if (strncmp(put_str, "$T0", 3)) {
    512			eprintk("kgdbts: failed continue sstep\n");
    513			return 1;
    514		} else {
    515			char *ptr = &put_str[11];
    516			kgdb_hex2long(&ptr, &sstep_thread_id);
    517		}
    518		break;
    519	case 4:
    520		if (strncmp(put_str, "$OK", 3)) {
    521			eprintk("kgdbts: failed sstep break unset\n");
    522			return 1;
    523		}
    524		/* Single step is complete so continue on! */
    525		sstep_state = 0;
    526		return 0;
    527	default:
    528		eprintk("kgdbts: ERROR failed sstep put emulation\n");
    529	}
    530
    531	/* Continue on the same test line until emulation is complete */
    532	ts.idx--;
    533	return 0;
    534}
    535
    536static int final_ack_set(char *put_str, char *arg)
    537{
    538	if (strncmp(put_str+1, arg, 2))
    539		return 1;
    540	final_ack = 1;
    541	return 0;
    542}
    543/*
    544 * Test to plant a breakpoint and detach, which should clear out the
    545 * breakpoint and restore the original instruction.
    546 */
    547static struct test_struct plant_and_detach_test[] = {
    548	{ "?", "S0*" }, /* Clear break points */
    549	{ "kgdbts_break_test", "OK", sw_break, }, /* set sw breakpoint */
    550	{ "D", "OK" }, /* Detach */
    551	{ "", "" },
    552};
    553
    554/*
    555 * Simple test to write in a software breakpoint, check for the
    556 * correct stop location and detach.
    557 */
    558static struct test_struct sw_breakpoint_test[] = {
    559	{ "?", "S0*" }, /* Clear break points */
    560	{ "kgdbts_break_test", "OK", sw_break, }, /* set sw breakpoint */
    561	{ "c", "T0*", }, /* Continue */
    562	{ "g", "kgdbts_break_test", NULL, check_and_rewind_pc },
    563	{ "write", "OK", write_regs },
    564	{ "kgdbts_break_test", "OK", sw_rem_break }, /*remove breakpoint */
    565	{ "D", "OK" }, /* Detach */
    566	{ "D", "OK", NULL,  got_break }, /* On success we made it here */
    567	{ "", "" },
    568};
    569
    570/*
    571 * Test a known bad memory read location to test the fault handler and
    572 * read bytes 1-8 at the bad address
    573 */
    574static struct test_struct bad_read_test[] = {
    575	{ "?", "S0*" }, /* Clear break points */
    576	{ "m0,1", "E*" }, /* read 1 byte at address 1 */
    577	{ "m0,2", "E*" }, /* read 1 byte at address 2 */
    578	{ "m0,3", "E*" }, /* read 1 byte at address 3 */
    579	{ "m0,4", "E*" }, /* read 1 byte at address 4 */
    580	{ "m0,5", "E*" }, /* read 1 byte at address 5 */
    581	{ "m0,6", "E*" }, /* read 1 byte at address 6 */
    582	{ "m0,7", "E*" }, /* read 1 byte at address 7 */
    583	{ "m0,8", "E*" }, /* read 1 byte at address 8 */
    584	{ "D", "OK" }, /* Detach which removes all breakpoints and continues */
    585	{ "", "" },
    586};
    587
    588/*
    589 * Test for hitting a breakpoint, remove it, single step, plant it
    590 * again and detach.
    591 */
    592static struct test_struct singlestep_break_test[] = {
    593	{ "?", "S0*" }, /* Clear break points */
    594	{ "kgdbts_break_test", "OK", sw_break, }, /* set sw breakpoint */
    595	{ "c", "T0*", NULL, get_thread_id_continue }, /* Continue */
    596	{ "kgdbts_break_test", "OK", sw_rem_break }, /*remove breakpoint */
    597	{ "g", "kgdbts_break_test", NULL, check_and_rewind_pc },
    598	{ "write", "OK", write_regs }, /* Write registers */
    599	{ "s", "T0*", emul_sstep_get, emul_sstep_put }, /* Single step */
    600	{ "g", "kgdbts_break_test", NULL, check_single_step },
    601	{ "kgdbts_break_test", "OK", sw_break, }, /* set sw breakpoint */
    602	{ "c", "T0*", }, /* Continue */
    603	{ "g", "kgdbts_break_test", NULL, check_and_rewind_pc },
    604	{ "write", "OK", write_regs }, /* Write registers */
    605	{ "D", "OK" }, /* Remove all breakpoints and continues */
    606	{ "", "" },
    607};
    608
    609/*
    610 * Test for hitting a breakpoint at kernel_clone for what ever the number
    611 * of iterations required by the variable repeat_test.
    612 */
    613static struct test_struct do_kernel_clone_test[] = {
    614	{ "?", "S0*" }, /* Clear break points */
    615	{ "kernel_clone", "OK", sw_break, }, /* set sw breakpoint */
    616	{ "c", "T0*", NULL, get_thread_id_continue }, /* Continue */
    617	{ "kernel_clone", "OK", sw_rem_break }, /*remove breakpoint */
    618	{ "g", "kernel_clone", NULL, check_and_rewind_pc }, /* check location */
    619	{ "write", "OK", write_regs, emul_reset }, /* Write registers */
    620	{ "s", "T0*", emul_sstep_get, emul_sstep_put }, /* Single step */
    621	{ "g", "kernel_clone", NULL, check_single_step },
    622	{ "kernel_clone", "OK", sw_break, }, /* set sw breakpoint */
    623	{ "7", "T0*", skip_back_repeat_test }, /* Loop based on repeat_test */
    624	{ "D", "OK", NULL, final_ack_set }, /* detach and unregister I/O */
    625	{ "", "", get_cont_catch, put_cont_catch },
    626};
    627
    628/* Test for hitting a breakpoint at sys_open for what ever the number
    629 * of iterations required by the variable repeat_test.
    630 */
    631static struct test_struct sys_open_test[] = {
    632	{ "?", "S0*" }, /* Clear break points */
    633	{ "do_sys_openat2", "OK", sw_break, }, /* set sw breakpoint */
    634	{ "c", "T0*", NULL, get_thread_id_continue }, /* Continue */
    635	{ "do_sys_openat2", "OK", sw_rem_break }, /*remove breakpoint */
    636	{ "g", "do_sys_openat2", NULL, check_and_rewind_pc }, /* check location */
    637	{ "write", "OK", write_regs, emul_reset }, /* Write registers */
    638	{ "s", "T0*", emul_sstep_get, emul_sstep_put }, /* Single step */
    639	{ "g", "do_sys_openat2", NULL, check_single_step },
    640	{ "do_sys_openat2", "OK", sw_break, }, /* set sw breakpoint */
    641	{ "7", "T0*", skip_back_repeat_test }, /* Loop based on repeat_test */
    642	{ "D", "OK", NULL, final_ack_set }, /* detach and unregister I/O */
    643	{ "", "", get_cont_catch, put_cont_catch },
    644};
    645
    646/*
    647 * Test for hitting a simple hw breakpoint
    648 */
    649static struct test_struct hw_breakpoint_test[] = {
    650	{ "?", "S0*" }, /* Clear break points */
    651	{ "kgdbts_break_test", "OK", hw_break, }, /* set hw breakpoint */
    652	{ "c", "T0*", }, /* Continue */
    653	{ "g", "kgdbts_break_test", NULL, check_and_rewind_pc },
    654	{ "write", "OK", write_regs },
    655	{ "kgdbts_break_test", "OK", hw_rem_break }, /*remove breakpoint */
    656	{ "D", "OK" }, /* Detach */
    657	{ "D", "OK", NULL,  got_break }, /* On success we made it here */
    658	{ "", "" },
    659};
    660
    661/*
    662 * Test for hitting a hw write breakpoint
    663 */
    664static struct test_struct hw_write_break_test[] = {
    665	{ "?", "S0*" }, /* Clear break points */
    666	{ "hw_break_val", "OK", hw_write_break, }, /* set hw breakpoint */
    667	{ "c", "T0*", NULL, got_break }, /* Continue */
    668	{ "g", "silent", NULL, check_and_rewind_pc },
    669	{ "write", "OK", write_regs },
    670	{ "hw_break_val", "OK", hw_rem_write_break }, /*remove breakpoint */
    671	{ "D", "OK" }, /* Detach */
    672	{ "D", "OK", NULL,  got_break }, /* On success we made it here */
    673	{ "", "" },
    674};
    675
    676/*
    677 * Test for hitting a hw access breakpoint
    678 */
    679static struct test_struct hw_access_break_test[] = {
    680	{ "?", "S0*" }, /* Clear break points */
    681	{ "hw_break_val", "OK", hw_access_break, }, /* set hw breakpoint */
    682	{ "c", "T0*", NULL, got_break }, /* Continue */
    683	{ "g", "silent", NULL, check_and_rewind_pc },
    684	{ "write", "OK", write_regs },
    685	{ "hw_break_val", "OK", hw_rem_access_break }, /*remove breakpoint */
    686	{ "D", "OK" }, /* Detach */
    687	{ "D", "OK", NULL,  got_break }, /* On success we made it here */
    688	{ "", "" },
    689};
    690
    691/*
    692 * Test for hitting a hw access breakpoint
    693 */
    694static struct test_struct nmi_sleep_test[] = {
    695	{ "?", "S0*" }, /* Clear break points */
    696	{ "c", "T0*", NULL, got_break }, /* Continue */
    697	{ "D", "OK" }, /* Detach */
    698	{ "D", "OK", NULL,  got_break }, /* On success we made it here */
    699	{ "", "" },
    700};
    701
    702static void fill_get_buf(char *buf)
    703{
    704	unsigned char checksum = 0;
    705	int count = 0;
    706	char ch;
    707
    708	strcpy(get_buf, "$");
    709	strcat(get_buf, buf);
    710	while ((ch = buf[count])) {
    711		checksum += ch;
    712		count++;
    713	}
    714	strcat(get_buf, "#");
    715	get_buf[count + 2] = hex_asc_hi(checksum);
    716	get_buf[count + 3] = hex_asc_lo(checksum);
    717	get_buf[count + 4] = '\0';
    718	v2printk("get%i: %s\n", ts.idx, get_buf);
    719}
    720
    721static int validate_simple_test(char *put_str)
    722{
    723	char *chk_str;
    724
    725	if (ts.tst[ts.idx].put_handler)
    726		return ts.tst[ts.idx].put_handler(put_str,
    727			ts.tst[ts.idx].put);
    728
    729	chk_str = ts.tst[ts.idx].put;
    730	if (*put_str == '$')
    731		put_str++;
    732
    733	while (*chk_str != '\0' && *put_str != '\0') {
    734		/* If someone does a * to match the rest of the string, allow
    735		 * it, or stop if the received string is complete.
    736		 */
    737		if (*put_str == '#' || *chk_str == '*')
    738			return 0;
    739		if (*put_str != *chk_str)
    740			return 1;
    741
    742		chk_str++;
    743		put_str++;
    744	}
    745	if (*chk_str == '\0' && (*put_str == '\0' || *put_str == '#'))
    746		return 0;
    747
    748	return 1;
    749}
    750
    751static int run_simple_test(int is_get_char, int chr)
    752{
    753	int ret = 0;
    754	if (is_get_char) {
    755		/* Send an ACK on the get if a prior put completed and set the
    756		 * send ack variable
    757		 */
    758		if (send_ack) {
    759			send_ack = 0;
    760			return '+';
    761		}
    762		/* On the first get char, fill the transmit buffer and then
    763		 * take from the get_string.
    764		 */
    765		if (get_buf_cnt == 0) {
    766			if (ts.tst[ts.idx].get_handler)
    767				ts.tst[ts.idx].get_handler(ts.tst[ts.idx].get);
    768			else
    769				fill_get_buf(ts.tst[ts.idx].get);
    770		}
    771
    772		if (get_buf[get_buf_cnt] == '\0') {
    773			eprintk("kgdbts: ERROR GET: EOB on '%s' at %i\n",
    774			   ts.name, ts.idx);
    775			get_buf_cnt = 0;
    776			fill_get_buf("D");
    777		}
    778		ret = get_buf[get_buf_cnt];
    779		get_buf_cnt++;
    780		return ret;
    781	}
    782
    783	/* This callback is a put char which is when kgdb sends data to
    784	 * this I/O module.
    785	 */
    786	if (ts.tst[ts.idx].get[0] == '\0' && ts.tst[ts.idx].put[0] == '\0' &&
    787	    !ts.tst[ts.idx].get_handler) {
    788		eprintk("kgdbts: ERROR: beyond end of test on"
    789			   " '%s' line %i\n", ts.name, ts.idx);
    790		return 0;
    791	}
    792
    793	if (put_buf_cnt >= BUFMAX) {
    794		eprintk("kgdbts: ERROR: put buffer overflow on"
    795			   " '%s' line %i\n", ts.name, ts.idx);
    796		put_buf_cnt = 0;
    797		return 0;
    798	}
    799	/* Ignore everything until the first valid packet start '$' */
    800	if (put_buf_cnt == 0 && chr != '$')
    801		return 0;
    802
    803	put_buf[put_buf_cnt] = chr;
    804	put_buf_cnt++;
    805
    806	/* End of packet == #XX so look for the '#' */
    807	if (put_buf_cnt > 3 && put_buf[put_buf_cnt - 3] == '#') {
    808		if (put_buf_cnt >= BUFMAX) {
    809			eprintk("kgdbts: ERROR: put buffer overflow on"
    810				" '%s' line %i\n", ts.name, ts.idx);
    811			put_buf_cnt = 0;
    812			return 0;
    813		}
    814		put_buf[put_buf_cnt] = '\0';
    815		v2printk("put%i: %s\n", ts.idx, put_buf);
    816		/* Trigger check here */
    817		if (ts.validate_put && ts.validate_put(put_buf)) {
    818			eprintk("kgdbts: ERROR PUT: end of test "
    819			   "buffer on '%s' line %i expected %s got %s\n",
    820			   ts.name, ts.idx, ts.tst[ts.idx].put, put_buf);
    821		}
    822		ts.idx++;
    823		put_buf_cnt = 0;
    824		get_buf_cnt = 0;
    825		send_ack = 1;
    826	}
    827	return 0;
    828}
    829
    830static void init_simple_test(void)
    831{
    832	memset(&ts, 0, sizeof(ts));
    833	ts.run_test = run_simple_test;
    834	ts.validate_put = validate_simple_test;
    835}
    836
    837static void run_plant_and_detach_test(int is_early)
    838{
    839	char before[BREAK_INSTR_SIZE];
    840	char after[BREAK_INSTR_SIZE];
    841
    842	copy_from_kernel_nofault(before, (char *)kgdbts_break_test,
    843	  BREAK_INSTR_SIZE);
    844	init_simple_test();
    845	ts.tst = plant_and_detach_test;
    846	ts.name = "plant_and_detach_test";
    847	/* Activate test with initial breakpoint */
    848	if (!is_early)
    849		kgdb_breakpoint();
    850	copy_from_kernel_nofault(after, (char *)kgdbts_break_test,
    851			BREAK_INSTR_SIZE);
    852	if (memcmp(before, after, BREAK_INSTR_SIZE)) {
    853		printk(KERN_CRIT "kgdbts: ERROR kgdb corrupted memory\n");
    854		panic("kgdb memory corruption");
    855	}
    856
    857	/* complete the detach test */
    858	if (!is_early)
    859		kgdbts_break_test();
    860}
    861
    862static void run_breakpoint_test(int is_hw_breakpoint)
    863{
    864	test_complete = 0;
    865	init_simple_test();
    866	if (is_hw_breakpoint) {
    867		ts.tst = hw_breakpoint_test;
    868		ts.name = "hw_breakpoint_test";
    869	} else {
    870		ts.tst = sw_breakpoint_test;
    871		ts.name = "sw_breakpoint_test";
    872	}
    873	/* Activate test with initial breakpoint */
    874	kgdb_breakpoint();
    875	/* run code with the break point in it */
    876	kgdbts_break_test();
    877	kgdb_breakpoint();
    878
    879	if (test_complete)
    880		return;
    881
    882	eprintk("kgdbts: ERROR %s test failed\n", ts.name);
    883	if (is_hw_breakpoint)
    884		hwbreaks_ok = 0;
    885}
    886
    887static void run_hw_break_test(int is_write_test)
    888{
    889	test_complete = 0;
    890	init_simple_test();
    891	if (is_write_test) {
    892		ts.tst = hw_write_break_test;
    893		ts.name = "hw_write_break_test";
    894	} else {
    895		ts.tst = hw_access_break_test;
    896		ts.name = "hw_access_break_test";
    897	}
    898	/* Activate test with initial breakpoint */
    899	kgdb_breakpoint();
    900	hw_break_val_access();
    901	if (is_write_test) {
    902		if (test_complete == 2) {
    903			eprintk("kgdbts: ERROR %s broke on access\n",
    904				ts.name);
    905			hwbreaks_ok = 0;
    906		}
    907		hw_break_val_write();
    908	}
    909	kgdb_breakpoint();
    910
    911	if (test_complete == 1)
    912		return;
    913
    914	eprintk("kgdbts: ERROR %s test failed\n", ts.name);
    915	hwbreaks_ok = 0;
    916}
    917
    918static void run_nmi_sleep_test(int nmi_sleep)
    919{
    920	unsigned long flags;
    921
    922	init_simple_test();
    923	ts.tst = nmi_sleep_test;
    924	ts.name = "nmi_sleep_test";
    925	/* Activate test with initial breakpoint */
    926	kgdb_breakpoint();
    927	local_irq_save(flags);
    928	mdelay(nmi_sleep*1000);
    929	touch_nmi_watchdog();
    930	local_irq_restore(flags);
    931	if (test_complete != 2)
    932		eprintk("kgdbts: ERROR nmi_test did not hit nmi\n");
    933	kgdb_breakpoint();
    934	if (test_complete == 1)
    935		return;
    936
    937	eprintk("kgdbts: ERROR %s test failed\n", ts.name);
    938}
    939
    940static void run_bad_read_test(void)
    941{
    942	init_simple_test();
    943	ts.tst = bad_read_test;
    944	ts.name = "bad_read_test";
    945	/* Activate test with initial breakpoint */
    946	kgdb_breakpoint();
    947}
    948
    949static void run_kernel_clone_test(void)
    950{
    951	init_simple_test();
    952	ts.tst = do_kernel_clone_test;
    953	ts.name = "do_kernel_clone_test";
    954	/* Activate test with initial breakpoint */
    955	kgdb_breakpoint();
    956}
    957
    958static void run_sys_open_test(void)
    959{
    960	init_simple_test();
    961	ts.tst = sys_open_test;
    962	ts.name = "sys_open_test";
    963	/* Activate test with initial breakpoint */
    964	kgdb_breakpoint();
    965}
    966
    967static void run_singlestep_break_test(void)
    968{
    969	init_simple_test();
    970	ts.tst = singlestep_break_test;
    971	ts.name = "singlestep_breakpoint_test";
    972	/* Activate test with initial breakpoint */
    973	kgdb_breakpoint();
    974	kgdbts_break_test();
    975	kgdbts_break_test();
    976}
    977
    978static void kgdbts_run_tests(void)
    979{
    980	char *ptr;
    981	int clone_test = 0;
    982	int do_sys_open_test = 0;
    983	int sstep_test = 1000;
    984	int nmi_sleep = 0;
    985	int i;
    986
    987	verbose = 0;
    988	if (strstr(config, "V1"))
    989		verbose = 1;
    990	if (strstr(config, "V2"))
    991		verbose = 2;
    992
    993	ptr = strchr(config, 'F');
    994	if (ptr)
    995		clone_test = simple_strtol(ptr + 1, NULL, 10);
    996	ptr = strchr(config, 'S');
    997	if (ptr)
    998		do_sys_open_test = simple_strtol(ptr + 1, NULL, 10);
    999	ptr = strchr(config, 'N');
   1000	if (ptr)
   1001		nmi_sleep = simple_strtol(ptr+1, NULL, 10);
   1002	ptr = strchr(config, 'I');
   1003	if (ptr)
   1004		sstep_test = simple_strtol(ptr+1, NULL, 10);
   1005
   1006	/* All HW break point tests */
   1007	if (arch_kgdb_ops.flags & KGDB_HW_BREAKPOINT) {
   1008		hwbreaks_ok = 1;
   1009		v1printk("kgdbts:RUN hw breakpoint test\n");
   1010		run_breakpoint_test(1);
   1011		v1printk("kgdbts:RUN hw write breakpoint test\n");
   1012		run_hw_break_test(1);
   1013		v1printk("kgdbts:RUN access write breakpoint test\n");
   1014		run_hw_break_test(0);
   1015	}
   1016
   1017	/* required internal KGDB tests */
   1018	v1printk("kgdbts:RUN plant and detach test\n");
   1019	run_plant_and_detach_test(0);
   1020	v1printk("kgdbts:RUN sw breakpoint test\n");
   1021	run_breakpoint_test(0);
   1022	v1printk("kgdbts:RUN bad memory access test\n");
   1023	run_bad_read_test();
   1024	v1printk("kgdbts:RUN singlestep test %i iterations\n", sstep_test);
   1025	for (i = 0; i < sstep_test; i++) {
   1026		run_singlestep_break_test();
   1027		if (i % 100 == 0)
   1028			v1printk("kgdbts:RUN singlestep [%i/%i]\n",
   1029				 i, sstep_test);
   1030	}
   1031
   1032	/* ===Optional tests=== */
   1033
   1034	if (nmi_sleep) {
   1035		v1printk("kgdbts:RUN NMI sleep %i seconds test\n", nmi_sleep);
   1036		run_nmi_sleep_test(nmi_sleep);
   1037	}
   1038
   1039	/* If the kernel_clone test is run it will be the last test that is
   1040	 * executed because a kernel thread will be spawned at the very
   1041	 * end to unregister the debug hooks.
   1042	 */
   1043	if (clone_test) {
   1044		repeat_test = clone_test;
   1045		printk(KERN_INFO "kgdbts:RUN kernel_clone for %i breakpoints\n",
   1046			repeat_test);
   1047		kthread_run(kgdbts_unreg_thread, NULL, "kgdbts_unreg");
   1048		run_kernel_clone_test();
   1049		return;
   1050	}
   1051
   1052	/* If the sys_open test is run it will be the last test that is
   1053	 * executed because a kernel thread will be spawned at the very
   1054	 * end to unregister the debug hooks.
   1055	 */
   1056	if (do_sys_open_test) {
   1057		repeat_test = do_sys_open_test;
   1058		printk(KERN_INFO "kgdbts:RUN sys_open for %i breakpoints\n",
   1059			repeat_test);
   1060		kthread_run(kgdbts_unreg_thread, NULL, "kgdbts_unreg");
   1061		run_sys_open_test();
   1062		return;
   1063	}
   1064	/* Shutdown and unregister */
   1065	kgdb_unregister_io_module(&kgdbts_io_ops);
   1066	configured = 0;
   1067}
   1068
   1069static int kgdbts_option_setup(char *opt)
   1070{
   1071	if (strlen(opt) >= MAX_CONFIG_LEN) {
   1072		printk(KERN_ERR "kgdbts: config string too long\n");
   1073		return 1;
   1074	}
   1075	strcpy(config, opt);
   1076	return 1;
   1077}
   1078
   1079__setup("kgdbts=", kgdbts_option_setup);
   1080
   1081static int configure_kgdbts(void)
   1082{
   1083	int err = 0;
   1084
   1085	if (!strlen(config) || isspace(config[0]))
   1086		goto noconfig;
   1087
   1088	final_ack = 0;
   1089	run_plant_and_detach_test(1);
   1090
   1091	err = kgdb_register_io_module(&kgdbts_io_ops);
   1092	if (err) {
   1093		configured = 0;
   1094		return err;
   1095	}
   1096	configured = 1;
   1097	kgdbts_run_tests();
   1098
   1099	return err;
   1100
   1101noconfig:
   1102	config[0] = 0;
   1103	configured = 0;
   1104
   1105	return err;
   1106}
   1107
   1108static int __init init_kgdbts(void)
   1109{
   1110	/* Already configured? */
   1111	if (configured == 1)
   1112		return 0;
   1113
   1114	return configure_kgdbts();
   1115}
   1116device_initcall(init_kgdbts);
   1117
   1118static int kgdbts_get_char(void)
   1119{
   1120	int val = 0;
   1121
   1122	if (ts.run_test)
   1123		val = ts.run_test(1, 0);
   1124
   1125	return val;
   1126}
   1127
   1128static void kgdbts_put_char(u8 chr)
   1129{
   1130	if (ts.run_test)
   1131		ts.run_test(0, chr);
   1132}
   1133
   1134static int param_set_kgdbts_var(const char *kmessage,
   1135				const struct kernel_param *kp)
   1136{
   1137	size_t len = strlen(kmessage);
   1138
   1139	if (len >= MAX_CONFIG_LEN) {
   1140		printk(KERN_ERR "kgdbts: config string too long\n");
   1141		return -ENOSPC;
   1142	}
   1143
   1144	/* Only copy in the string if the init function has not run yet */
   1145	if (configured < 0) {
   1146		strcpy(config, kmessage);
   1147		return 0;
   1148	}
   1149
   1150	if (configured == 1) {
   1151		printk(KERN_ERR "kgdbts: ERROR: Already configured and running.\n");
   1152		return -EBUSY;
   1153	}
   1154
   1155	strcpy(config, kmessage);
   1156	/* Chop out \n char as a result of echo */
   1157	if (len && config[len - 1] == '\n')
   1158		config[len - 1] = '\0';
   1159
   1160	/* Go and configure with the new params. */
   1161	return configure_kgdbts();
   1162}
   1163
   1164static void kgdbts_pre_exp_handler(void)
   1165{
   1166	/* Increment the module count when the debugger is active */
   1167	if (!kgdb_connected)
   1168		try_module_get(THIS_MODULE);
   1169}
   1170
   1171static void kgdbts_post_exp_handler(void)
   1172{
   1173	/* decrement the module count when the debugger detaches */
   1174	if (!kgdb_connected)
   1175		module_put(THIS_MODULE);
   1176}
   1177
   1178static struct kgdb_io kgdbts_io_ops = {
   1179	.name			= "kgdbts",
   1180	.read_char		= kgdbts_get_char,
   1181	.write_char		= kgdbts_put_char,
   1182	.pre_exception		= kgdbts_pre_exp_handler,
   1183	.post_exception		= kgdbts_post_exp_handler,
   1184};
   1185
   1186/*
   1187 * not really modular, but the easiest way to keep compat with existing
   1188 * bootargs behaviour is to continue using module_param here.
   1189 */
   1190module_param_call(kgdbts, param_set_kgdbts_var, param_get_string, &kps, 0644);
   1191MODULE_PARM_DESC(kgdbts, "<A|V1|V2>[F#|S#][N#]");