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

gdbstub.c (26353B)


      1// SPDX-License-Identifier: GPL-2.0-only
      2/*
      3 * Kernel Debug Core
      4 *
      5 * Maintainer: Jason Wessel <jason.wessel@windriver.com>
      6 *
      7 * Copyright (C) 2000-2001 VERITAS Software Corporation.
      8 * Copyright (C) 2002-2004 Timesys Corporation
      9 * Copyright (C) 2003-2004 Amit S. Kale <amitkale@linsyssoft.com>
     10 * Copyright (C) 2004 Pavel Machek <pavel@ucw.cz>
     11 * Copyright (C) 2004-2006 Tom Rini <trini@kernel.crashing.org>
     12 * Copyright (C) 2004-2006 LinSysSoft Technologies Pvt. Ltd.
     13 * Copyright (C) 2005-2009 Wind River Systems, Inc.
     14 * Copyright (C) 2007 MontaVista Software, Inc.
     15 * Copyright (C) 2008 Red Hat, Inc., Ingo Molnar <mingo@redhat.com>
     16 *
     17 * Contributors at various stages not listed above:
     18 *  Jason Wessel ( jason.wessel@windriver.com )
     19 *  George Anzinger <george@mvista.com>
     20 *  Anurekh Saxena (anurekh.saxena@timesys.com)
     21 *  Lake Stevens Instrument Division (Glenn Engel)
     22 *  Jim Kingdon, Cygnus Support.
     23 *
     24 * Original KGDB stub: David Grothe <dave@gcom.com>,
     25 * Tigran Aivazian <tigran@sco.com>
     26 */
     27
     28#include <linux/kernel.h>
     29#include <linux/sched/signal.h>
     30#include <linux/kgdb.h>
     31#include <linux/kdb.h>
     32#include <linux/serial_core.h>
     33#include <linux/reboot.h>
     34#include <linux/uaccess.h>
     35#include <asm/cacheflush.h>
     36#include <asm/unaligned.h>
     37#include "debug_core.h"
     38
     39#define KGDB_MAX_THREAD_QUERY 17
     40
     41/* Our I/O buffers. */
     42static char			remcom_in_buffer[BUFMAX];
     43static char			remcom_out_buffer[BUFMAX];
     44static int			gdbstub_use_prev_in_buf;
     45static int			gdbstub_prev_in_buf_pos;
     46
     47/* Storage for the registers, in GDB format. */
     48static unsigned long		gdb_regs[(NUMREGBYTES +
     49					sizeof(unsigned long) - 1) /
     50					sizeof(unsigned long)];
     51
     52/*
     53 * GDB remote protocol parser:
     54 */
     55
     56#ifdef CONFIG_KGDB_KDB
     57static int gdbstub_read_wait(void)
     58{
     59	int ret = -1;
     60	int i;
     61
     62	if (unlikely(gdbstub_use_prev_in_buf)) {
     63		if (gdbstub_prev_in_buf_pos < gdbstub_use_prev_in_buf)
     64			return remcom_in_buffer[gdbstub_prev_in_buf_pos++];
     65		else
     66			gdbstub_use_prev_in_buf = 0;
     67	}
     68
     69	/* poll any additional I/O interfaces that are defined */
     70	while (ret < 0)
     71		for (i = 0; kdb_poll_funcs[i] != NULL; i++) {
     72			ret = kdb_poll_funcs[i]();
     73			if (ret > 0)
     74				break;
     75		}
     76	return ret;
     77}
     78#else
     79static int gdbstub_read_wait(void)
     80{
     81	int ret = dbg_io_ops->read_char();
     82	while (ret == NO_POLL_CHAR)
     83		ret = dbg_io_ops->read_char();
     84	return ret;
     85}
     86#endif
     87/* scan for the sequence $<data>#<checksum> */
     88static void get_packet(char *buffer)
     89{
     90	unsigned char checksum;
     91	unsigned char xmitcsum;
     92	int count;
     93	char ch;
     94
     95	do {
     96		/*
     97		 * Spin and wait around for the start character, ignore all
     98		 * other characters:
     99		 */
    100		while ((ch = (gdbstub_read_wait())) != '$')
    101			/* nothing */;
    102
    103		kgdb_connected = 1;
    104		checksum = 0;
    105		xmitcsum = -1;
    106
    107		count = 0;
    108
    109		/*
    110		 * now, read until a # or end of buffer is found:
    111		 */
    112		while (count < (BUFMAX - 1)) {
    113			ch = gdbstub_read_wait();
    114			if (ch == '#')
    115				break;
    116			checksum = checksum + ch;
    117			buffer[count] = ch;
    118			count = count + 1;
    119		}
    120
    121		if (ch == '#') {
    122			xmitcsum = hex_to_bin(gdbstub_read_wait()) << 4;
    123			xmitcsum += hex_to_bin(gdbstub_read_wait());
    124
    125			if (checksum != xmitcsum)
    126				/* failed checksum */
    127				dbg_io_ops->write_char('-');
    128			else
    129				/* successful transfer */
    130				dbg_io_ops->write_char('+');
    131			if (dbg_io_ops->flush)
    132				dbg_io_ops->flush();
    133		}
    134		buffer[count] = 0;
    135	} while (checksum != xmitcsum);
    136}
    137
    138/*
    139 * Send the packet in buffer.
    140 * Check for gdb connection if asked for.
    141 */
    142static void put_packet(char *buffer)
    143{
    144	unsigned char checksum;
    145	int count;
    146	char ch;
    147
    148	/*
    149	 * $<packet info>#<checksum>.
    150	 */
    151	while (1) {
    152		dbg_io_ops->write_char('$');
    153		checksum = 0;
    154		count = 0;
    155
    156		while ((ch = buffer[count])) {
    157			dbg_io_ops->write_char(ch);
    158			checksum += ch;
    159			count++;
    160		}
    161
    162		dbg_io_ops->write_char('#');
    163		dbg_io_ops->write_char(hex_asc_hi(checksum));
    164		dbg_io_ops->write_char(hex_asc_lo(checksum));
    165		if (dbg_io_ops->flush)
    166			dbg_io_ops->flush();
    167
    168		/* Now see what we get in reply. */
    169		ch = gdbstub_read_wait();
    170
    171		if (ch == 3)
    172			ch = gdbstub_read_wait();
    173
    174		/* If we get an ACK, we are done. */
    175		if (ch == '+')
    176			return;
    177
    178		/*
    179		 * If we get the start of another packet, this means
    180		 * that GDB is attempting to reconnect.  We will NAK
    181		 * the packet being sent, and stop trying to send this
    182		 * packet.
    183		 */
    184		if (ch == '$') {
    185			dbg_io_ops->write_char('-');
    186			if (dbg_io_ops->flush)
    187				dbg_io_ops->flush();
    188			return;
    189		}
    190	}
    191}
    192
    193static char gdbmsgbuf[BUFMAX + 1];
    194
    195void gdbstub_msg_write(const char *s, int len)
    196{
    197	char *bufptr;
    198	int wcount;
    199	int i;
    200
    201	if (len == 0)
    202		len = strlen(s);
    203
    204	/* 'O'utput */
    205	gdbmsgbuf[0] = 'O';
    206
    207	/* Fill and send buffers... */
    208	while (len > 0) {
    209		bufptr = gdbmsgbuf + 1;
    210
    211		/* Calculate how many this time */
    212		if ((len << 1) > (BUFMAX - 2))
    213			wcount = (BUFMAX - 2) >> 1;
    214		else
    215			wcount = len;
    216
    217		/* Pack in hex chars */
    218		for (i = 0; i < wcount; i++)
    219			bufptr = hex_byte_pack(bufptr, s[i]);
    220		*bufptr = '\0';
    221
    222		/* Move up */
    223		s += wcount;
    224		len -= wcount;
    225
    226		/* Write packet */
    227		put_packet(gdbmsgbuf);
    228	}
    229}
    230
    231/*
    232 * Convert the memory pointed to by mem into hex, placing result in
    233 * buf.  Return a pointer to the last char put in buf (null). May
    234 * return an error.
    235 */
    236char *kgdb_mem2hex(char *mem, char *buf, int count)
    237{
    238	char *tmp;
    239	int err;
    240
    241	/*
    242	 * We use the upper half of buf as an intermediate buffer for the
    243	 * raw memory copy.  Hex conversion will work against this one.
    244	 */
    245	tmp = buf + count;
    246
    247	err = copy_from_kernel_nofault(tmp, mem, count);
    248	if (err)
    249		return NULL;
    250	while (count > 0) {
    251		buf = hex_byte_pack(buf, *tmp);
    252		tmp++;
    253		count--;
    254	}
    255	*buf = 0;
    256
    257	return buf;
    258}
    259
    260/*
    261 * Convert the hex array pointed to by buf into binary to be placed in
    262 * mem.  Return a pointer to the character AFTER the last byte
    263 * written.  May return an error.
    264 */
    265int kgdb_hex2mem(char *buf, char *mem, int count)
    266{
    267	char *tmp_raw;
    268	char *tmp_hex;
    269
    270	/*
    271	 * We use the upper half of buf as an intermediate buffer for the
    272	 * raw memory that is converted from hex.
    273	 */
    274	tmp_raw = buf + count * 2;
    275
    276	tmp_hex = tmp_raw - 1;
    277	while (tmp_hex >= buf) {
    278		tmp_raw--;
    279		*tmp_raw = hex_to_bin(*tmp_hex--);
    280		*tmp_raw |= hex_to_bin(*tmp_hex--) << 4;
    281	}
    282
    283	return copy_to_kernel_nofault(mem, tmp_raw, count);
    284}
    285
    286/*
    287 * While we find nice hex chars, build a long_val.
    288 * Return number of chars processed.
    289 */
    290int kgdb_hex2long(char **ptr, unsigned long *long_val)
    291{
    292	int hex_val;
    293	int num = 0;
    294	int negate = 0;
    295
    296	*long_val = 0;
    297
    298	if (**ptr == '-') {
    299		negate = 1;
    300		(*ptr)++;
    301	}
    302	while (**ptr) {
    303		hex_val = hex_to_bin(**ptr);
    304		if (hex_val < 0)
    305			break;
    306
    307		*long_val = (*long_val << 4) | hex_val;
    308		num++;
    309		(*ptr)++;
    310	}
    311
    312	if (negate)
    313		*long_val = -*long_val;
    314
    315	return num;
    316}
    317
    318/*
    319 * Copy the binary array pointed to by buf into mem.  Fix $, #, and
    320 * 0x7d escaped with 0x7d. Return -EFAULT on failure or 0 on success.
    321 * The input buf is overwritten with the result to write to mem.
    322 */
    323static int kgdb_ebin2mem(char *buf, char *mem, int count)
    324{
    325	int size = 0;
    326	char *c = buf;
    327
    328	while (count-- > 0) {
    329		c[size] = *buf++;
    330		if (c[size] == 0x7d)
    331			c[size] = *buf++ ^ 0x20;
    332		size++;
    333	}
    334
    335	return copy_to_kernel_nofault(mem, c, size);
    336}
    337
    338#if DBG_MAX_REG_NUM > 0
    339void pt_regs_to_gdb_regs(unsigned long *gdb_regs, struct pt_regs *regs)
    340{
    341	int i;
    342	int idx = 0;
    343	char *ptr = (char *)gdb_regs;
    344
    345	for (i = 0; i < DBG_MAX_REG_NUM; i++) {
    346		dbg_get_reg(i, ptr + idx, regs);
    347		idx += dbg_reg_def[i].size;
    348	}
    349}
    350
    351void gdb_regs_to_pt_regs(unsigned long *gdb_regs, struct pt_regs *regs)
    352{
    353	int i;
    354	int idx = 0;
    355	char *ptr = (char *)gdb_regs;
    356
    357	for (i = 0; i < DBG_MAX_REG_NUM; i++) {
    358		dbg_set_reg(i, ptr + idx, regs);
    359		idx += dbg_reg_def[i].size;
    360	}
    361}
    362#endif /* DBG_MAX_REG_NUM > 0 */
    363
    364/* Write memory due to an 'M' or 'X' packet. */
    365static int write_mem_msg(int binary)
    366{
    367	char *ptr = &remcom_in_buffer[1];
    368	unsigned long addr;
    369	unsigned long length;
    370	int err;
    371
    372	if (kgdb_hex2long(&ptr, &addr) > 0 && *(ptr++) == ',' &&
    373	    kgdb_hex2long(&ptr, &length) > 0 && *(ptr++) == ':') {
    374		if (binary)
    375			err = kgdb_ebin2mem(ptr, (char *)addr, length);
    376		else
    377			err = kgdb_hex2mem(ptr, (char *)addr, length);
    378		if (err)
    379			return err;
    380		if (CACHE_FLUSH_IS_SAFE)
    381			flush_icache_range(addr, addr + length);
    382		return 0;
    383	}
    384
    385	return -EINVAL;
    386}
    387
    388static void error_packet(char *pkt, int error)
    389{
    390	error = -error;
    391	pkt[0] = 'E';
    392	pkt[1] = hex_asc[(error / 10)];
    393	pkt[2] = hex_asc[(error % 10)];
    394	pkt[3] = '\0';
    395}
    396
    397/*
    398 * Thread ID accessors. We represent a flat TID space to GDB, where
    399 * the per CPU idle threads (which under Linux all have PID 0) are
    400 * remapped to negative TIDs.
    401 */
    402
    403#define BUF_THREAD_ID_SIZE	8
    404
    405static char *pack_threadid(char *pkt, unsigned char *id)
    406{
    407	unsigned char *limit;
    408	int lzero = 1;
    409
    410	limit = id + (BUF_THREAD_ID_SIZE / 2);
    411	while (id < limit) {
    412		if (!lzero || *id != 0) {
    413			pkt = hex_byte_pack(pkt, *id);
    414			lzero = 0;
    415		}
    416		id++;
    417	}
    418
    419	if (lzero)
    420		pkt = hex_byte_pack(pkt, 0);
    421
    422	return pkt;
    423}
    424
    425static void int_to_threadref(unsigned char *id, int value)
    426{
    427	put_unaligned_be32(value, id);
    428}
    429
    430static struct task_struct *getthread(struct pt_regs *regs, int tid)
    431{
    432	/*
    433	 * Non-positive TIDs are remapped to the cpu shadow information
    434	 */
    435	if (tid == 0 || tid == -1)
    436		tid = -atomic_read(&kgdb_active) - 2;
    437	if (tid < -1 && tid > -NR_CPUS - 2) {
    438		if (kgdb_info[-tid - 2].task)
    439			return kgdb_info[-tid - 2].task;
    440		else
    441			return idle_task(-tid - 2);
    442	}
    443	if (tid <= 0) {
    444		printk(KERN_ERR "KGDB: Internal thread select error\n");
    445		dump_stack();
    446		return NULL;
    447	}
    448
    449	/*
    450	 * find_task_by_pid_ns() does not take the tasklist lock anymore
    451	 * but is nicely RCU locked - hence is a pretty resilient
    452	 * thing to use:
    453	 */
    454	return find_task_by_pid_ns(tid, &init_pid_ns);
    455}
    456
    457
    458/*
    459 * Remap normal tasks to their real PID,
    460 * CPU shadow threads are mapped to -CPU - 2
    461 */
    462static inline int shadow_pid(int realpid)
    463{
    464	if (realpid)
    465		return realpid;
    466
    467	return -raw_smp_processor_id() - 2;
    468}
    469
    470/*
    471 * All the functions that start with gdb_cmd are the various
    472 * operations to implement the handlers for the gdbserial protocol
    473 * where KGDB is communicating with an external debugger
    474 */
    475
    476/* Handle the '?' status packets */
    477static void gdb_cmd_status(struct kgdb_state *ks)
    478{
    479	/*
    480	 * We know that this packet is only sent
    481	 * during initial connect.  So to be safe,
    482	 * we clear out our breakpoints now in case
    483	 * GDB is reconnecting.
    484	 */
    485	dbg_remove_all_break();
    486
    487	remcom_out_buffer[0] = 'S';
    488	hex_byte_pack(&remcom_out_buffer[1], ks->signo);
    489}
    490
    491static void gdb_get_regs_helper(struct kgdb_state *ks)
    492{
    493	struct task_struct *thread;
    494	void *local_debuggerinfo;
    495	int i;
    496
    497	thread = kgdb_usethread;
    498	if (!thread) {
    499		thread = kgdb_info[ks->cpu].task;
    500		local_debuggerinfo = kgdb_info[ks->cpu].debuggerinfo;
    501	} else {
    502		local_debuggerinfo = NULL;
    503		for_each_online_cpu(i) {
    504			/*
    505			 * Try to find the task on some other
    506			 * or possibly this node if we do not
    507			 * find the matching task then we try
    508			 * to approximate the results.
    509			 */
    510			if (thread == kgdb_info[i].task)
    511				local_debuggerinfo = kgdb_info[i].debuggerinfo;
    512		}
    513	}
    514
    515	/*
    516	 * All threads that don't have debuggerinfo should be
    517	 * in schedule() sleeping, since all other CPUs
    518	 * are in kgdb_wait, and thus have debuggerinfo.
    519	 */
    520	if (local_debuggerinfo) {
    521		pt_regs_to_gdb_regs(gdb_regs, local_debuggerinfo);
    522	} else {
    523		/*
    524		 * Pull stuff saved during switch_to; nothing
    525		 * else is accessible (or even particularly
    526		 * relevant).
    527		 *
    528		 * This should be enough for a stack trace.
    529		 */
    530		sleeping_thread_to_gdb_regs(gdb_regs, thread);
    531	}
    532}
    533
    534/* Handle the 'g' get registers request */
    535static void gdb_cmd_getregs(struct kgdb_state *ks)
    536{
    537	gdb_get_regs_helper(ks);
    538	kgdb_mem2hex((char *)gdb_regs, remcom_out_buffer, NUMREGBYTES);
    539}
    540
    541/* Handle the 'G' set registers request */
    542static void gdb_cmd_setregs(struct kgdb_state *ks)
    543{
    544	kgdb_hex2mem(&remcom_in_buffer[1], (char *)gdb_regs, NUMREGBYTES);
    545
    546	if (kgdb_usethread && kgdb_usethread != current) {
    547		error_packet(remcom_out_buffer, -EINVAL);
    548	} else {
    549		gdb_regs_to_pt_regs(gdb_regs, ks->linux_regs);
    550		strcpy(remcom_out_buffer, "OK");
    551	}
    552}
    553
    554/* Handle the 'm' memory read bytes */
    555static void gdb_cmd_memread(struct kgdb_state *ks)
    556{
    557	char *ptr = &remcom_in_buffer[1];
    558	unsigned long length;
    559	unsigned long addr;
    560	char *err;
    561
    562	if (kgdb_hex2long(&ptr, &addr) > 0 && *ptr++ == ',' &&
    563					kgdb_hex2long(&ptr, &length) > 0) {
    564		err = kgdb_mem2hex((char *)addr, remcom_out_buffer, length);
    565		if (!err)
    566			error_packet(remcom_out_buffer, -EINVAL);
    567	} else {
    568		error_packet(remcom_out_buffer, -EINVAL);
    569	}
    570}
    571
    572/* Handle the 'M' memory write bytes */
    573static void gdb_cmd_memwrite(struct kgdb_state *ks)
    574{
    575	int err = write_mem_msg(0);
    576
    577	if (err)
    578		error_packet(remcom_out_buffer, err);
    579	else
    580		strcpy(remcom_out_buffer, "OK");
    581}
    582
    583#if DBG_MAX_REG_NUM > 0
    584static char *gdb_hex_reg_helper(int regnum, char *out)
    585{
    586	int i;
    587	int offset = 0;
    588
    589	for (i = 0; i < regnum; i++)
    590		offset += dbg_reg_def[i].size;
    591	return kgdb_mem2hex((char *)gdb_regs + offset, out,
    592			    dbg_reg_def[i].size);
    593}
    594
    595/* Handle the 'p' individual register get */
    596static void gdb_cmd_reg_get(struct kgdb_state *ks)
    597{
    598	unsigned long regnum;
    599	char *ptr = &remcom_in_buffer[1];
    600
    601	kgdb_hex2long(&ptr, &regnum);
    602	if (regnum >= DBG_MAX_REG_NUM) {
    603		error_packet(remcom_out_buffer, -EINVAL);
    604		return;
    605	}
    606	gdb_get_regs_helper(ks);
    607	gdb_hex_reg_helper(regnum, remcom_out_buffer);
    608}
    609
    610/* Handle the 'P' individual register set */
    611static void gdb_cmd_reg_set(struct kgdb_state *ks)
    612{
    613	unsigned long regnum;
    614	char *ptr = &remcom_in_buffer[1];
    615	int i = 0;
    616
    617	kgdb_hex2long(&ptr, &regnum);
    618	if (*ptr++ != '=' ||
    619	    !(!kgdb_usethread || kgdb_usethread == current) ||
    620	    !dbg_get_reg(regnum, gdb_regs, ks->linux_regs)) {
    621		error_packet(remcom_out_buffer, -EINVAL);
    622		return;
    623	}
    624	memset(gdb_regs, 0, sizeof(gdb_regs));
    625	while (i < sizeof(gdb_regs) * 2)
    626		if (hex_to_bin(ptr[i]) >= 0)
    627			i++;
    628		else
    629			break;
    630	i = i / 2;
    631	kgdb_hex2mem(ptr, (char *)gdb_regs, i);
    632	dbg_set_reg(regnum, gdb_regs, ks->linux_regs);
    633	strcpy(remcom_out_buffer, "OK");
    634}
    635#endif /* DBG_MAX_REG_NUM > 0 */
    636
    637/* Handle the 'X' memory binary write bytes */
    638static void gdb_cmd_binwrite(struct kgdb_state *ks)
    639{
    640	int err = write_mem_msg(1);
    641
    642	if (err)
    643		error_packet(remcom_out_buffer, err);
    644	else
    645		strcpy(remcom_out_buffer, "OK");
    646}
    647
    648/* Handle the 'D' or 'k', detach or kill packets */
    649static void gdb_cmd_detachkill(struct kgdb_state *ks)
    650{
    651	int error;
    652
    653	/* The detach case */
    654	if (remcom_in_buffer[0] == 'D') {
    655		error = dbg_remove_all_break();
    656		if (error < 0) {
    657			error_packet(remcom_out_buffer, error);
    658		} else {
    659			strcpy(remcom_out_buffer, "OK");
    660			kgdb_connected = 0;
    661		}
    662		put_packet(remcom_out_buffer);
    663	} else {
    664		/*
    665		 * Assume the kill case, with no exit code checking,
    666		 * trying to force detach the debugger:
    667		 */
    668		dbg_remove_all_break();
    669		kgdb_connected = 0;
    670	}
    671}
    672
    673/* Handle the 'R' reboot packets */
    674static int gdb_cmd_reboot(struct kgdb_state *ks)
    675{
    676	/* For now, only honor R0 */
    677	if (strcmp(remcom_in_buffer, "R0") == 0) {
    678		printk(KERN_CRIT "Executing emergency reboot\n");
    679		strcpy(remcom_out_buffer, "OK");
    680		put_packet(remcom_out_buffer);
    681
    682		/*
    683		 * Execution should not return from
    684		 * machine_emergency_restart()
    685		 */
    686		machine_emergency_restart();
    687		kgdb_connected = 0;
    688
    689		return 1;
    690	}
    691	return 0;
    692}
    693
    694/* Handle the 'q' query packets */
    695static void gdb_cmd_query(struct kgdb_state *ks)
    696{
    697	struct task_struct *g;
    698	struct task_struct *p;
    699	unsigned char thref[BUF_THREAD_ID_SIZE];
    700	char *ptr;
    701	int i;
    702	int cpu;
    703	int finished = 0;
    704
    705	switch (remcom_in_buffer[1]) {
    706	case 's':
    707	case 'f':
    708		if (memcmp(remcom_in_buffer + 2, "ThreadInfo", 10))
    709			break;
    710
    711		i = 0;
    712		remcom_out_buffer[0] = 'm';
    713		ptr = remcom_out_buffer + 1;
    714		if (remcom_in_buffer[1] == 'f') {
    715			/* Each cpu is a shadow thread */
    716			for_each_online_cpu(cpu) {
    717				ks->thr_query = 0;
    718				int_to_threadref(thref, -cpu - 2);
    719				ptr = pack_threadid(ptr, thref);
    720				*(ptr++) = ',';
    721				i++;
    722			}
    723		}
    724
    725		for_each_process_thread(g, p) {
    726			if (i >= ks->thr_query && !finished) {
    727				int_to_threadref(thref, p->pid);
    728				ptr = pack_threadid(ptr, thref);
    729				*(ptr++) = ',';
    730				ks->thr_query++;
    731				if (ks->thr_query % KGDB_MAX_THREAD_QUERY == 0)
    732					finished = 1;
    733			}
    734			i++;
    735		}
    736
    737		*(--ptr) = '\0';
    738		break;
    739
    740	case 'C':
    741		/* Current thread id */
    742		strcpy(remcom_out_buffer, "QC");
    743		ks->threadid = shadow_pid(current->pid);
    744		int_to_threadref(thref, ks->threadid);
    745		pack_threadid(remcom_out_buffer + 2, thref);
    746		break;
    747	case 'T':
    748		if (memcmp(remcom_in_buffer + 1, "ThreadExtraInfo,", 16))
    749			break;
    750
    751		ks->threadid = 0;
    752		ptr = remcom_in_buffer + 17;
    753		kgdb_hex2long(&ptr, &ks->threadid);
    754		if (!getthread(ks->linux_regs, ks->threadid)) {
    755			error_packet(remcom_out_buffer, -EINVAL);
    756			break;
    757		}
    758		if ((int)ks->threadid > 0) {
    759			kgdb_mem2hex(getthread(ks->linux_regs,
    760					ks->threadid)->comm,
    761					remcom_out_buffer, 16);
    762		} else {
    763			static char tmpstr[23 + BUF_THREAD_ID_SIZE];
    764
    765			sprintf(tmpstr, "shadowCPU%d",
    766					(int)(-ks->threadid - 2));
    767			kgdb_mem2hex(tmpstr, remcom_out_buffer, strlen(tmpstr));
    768		}
    769		break;
    770#ifdef CONFIG_KGDB_KDB
    771	case 'R':
    772		if (strncmp(remcom_in_buffer, "qRcmd,", 6) == 0) {
    773			int len = strlen(remcom_in_buffer + 6);
    774
    775			if ((len % 2) != 0) {
    776				strcpy(remcom_out_buffer, "E01");
    777				break;
    778			}
    779			kgdb_hex2mem(remcom_in_buffer + 6,
    780				     remcom_out_buffer, len);
    781			len = len / 2;
    782			remcom_out_buffer[len++] = 0;
    783
    784			kdb_common_init_state(ks);
    785			kdb_parse(remcom_out_buffer);
    786			kdb_common_deinit_state();
    787
    788			strcpy(remcom_out_buffer, "OK");
    789		}
    790		break;
    791#endif
    792#ifdef CONFIG_HAVE_ARCH_KGDB_QXFER_PKT
    793	case 'S':
    794		if (!strncmp(remcom_in_buffer, "qSupported:", 11))
    795			strcpy(remcom_out_buffer, kgdb_arch_gdb_stub_feature);
    796		break;
    797	case 'X':
    798		if (!strncmp(remcom_in_buffer, "qXfer:", 6))
    799			kgdb_arch_handle_qxfer_pkt(remcom_in_buffer,
    800						   remcom_out_buffer);
    801		break;
    802#endif
    803	default:
    804		break;
    805	}
    806}
    807
    808/* Handle the 'H' task query packets */
    809static void gdb_cmd_task(struct kgdb_state *ks)
    810{
    811	struct task_struct *thread;
    812	char *ptr;
    813
    814	switch (remcom_in_buffer[1]) {
    815	case 'g':
    816		ptr = &remcom_in_buffer[2];
    817		kgdb_hex2long(&ptr, &ks->threadid);
    818		thread = getthread(ks->linux_regs, ks->threadid);
    819		if (!thread && ks->threadid > 0) {
    820			error_packet(remcom_out_buffer, -EINVAL);
    821			break;
    822		}
    823		kgdb_usethread = thread;
    824		ks->kgdb_usethreadid = ks->threadid;
    825		strcpy(remcom_out_buffer, "OK");
    826		break;
    827	case 'c':
    828		ptr = &remcom_in_buffer[2];
    829		kgdb_hex2long(&ptr, &ks->threadid);
    830		if (!ks->threadid) {
    831			kgdb_contthread = NULL;
    832		} else {
    833			thread = getthread(ks->linux_regs, ks->threadid);
    834			if (!thread && ks->threadid > 0) {
    835				error_packet(remcom_out_buffer, -EINVAL);
    836				break;
    837			}
    838			kgdb_contthread = thread;
    839		}
    840		strcpy(remcom_out_buffer, "OK");
    841		break;
    842	}
    843}
    844
    845/* Handle the 'T' thread query packets */
    846static void gdb_cmd_thread(struct kgdb_state *ks)
    847{
    848	char *ptr = &remcom_in_buffer[1];
    849	struct task_struct *thread;
    850
    851	kgdb_hex2long(&ptr, &ks->threadid);
    852	thread = getthread(ks->linux_regs, ks->threadid);
    853	if (thread)
    854		strcpy(remcom_out_buffer, "OK");
    855	else
    856		error_packet(remcom_out_buffer, -EINVAL);
    857}
    858
    859/* Handle the 'z' or 'Z' breakpoint remove or set packets */
    860static void gdb_cmd_break(struct kgdb_state *ks)
    861{
    862	/*
    863	 * Since GDB-5.3, it's been drafted that '0' is a software
    864	 * breakpoint, '1' is a hardware breakpoint, so let's do that.
    865	 */
    866	char *bpt_type = &remcom_in_buffer[1];
    867	char *ptr = &remcom_in_buffer[2];
    868	unsigned long addr;
    869	unsigned long length;
    870	int error = 0;
    871
    872	if (arch_kgdb_ops.set_hw_breakpoint && *bpt_type >= '1') {
    873		/* Unsupported */
    874		if (*bpt_type > '4')
    875			return;
    876	} else {
    877		if (*bpt_type != '0' && *bpt_type != '1')
    878			/* Unsupported. */
    879			return;
    880	}
    881
    882	/*
    883	 * Test if this is a hardware breakpoint, and
    884	 * if we support it:
    885	 */
    886	if (*bpt_type == '1' && !(arch_kgdb_ops.flags & KGDB_HW_BREAKPOINT))
    887		/* Unsupported. */
    888		return;
    889
    890	if (*(ptr++) != ',') {
    891		error_packet(remcom_out_buffer, -EINVAL);
    892		return;
    893	}
    894	if (!kgdb_hex2long(&ptr, &addr)) {
    895		error_packet(remcom_out_buffer, -EINVAL);
    896		return;
    897	}
    898	if (*(ptr++) != ',' ||
    899		!kgdb_hex2long(&ptr, &length)) {
    900		error_packet(remcom_out_buffer, -EINVAL);
    901		return;
    902	}
    903
    904	if (remcom_in_buffer[0] == 'Z' && *bpt_type == '0')
    905		error = dbg_set_sw_break(addr);
    906	else if (remcom_in_buffer[0] == 'z' && *bpt_type == '0')
    907		error = dbg_remove_sw_break(addr);
    908	else if (remcom_in_buffer[0] == 'Z')
    909		error = arch_kgdb_ops.set_hw_breakpoint(addr,
    910			(int)length, *bpt_type - '0');
    911	else if (remcom_in_buffer[0] == 'z')
    912		error = arch_kgdb_ops.remove_hw_breakpoint(addr,
    913			(int) length, *bpt_type - '0');
    914
    915	if (error == 0)
    916		strcpy(remcom_out_buffer, "OK");
    917	else
    918		error_packet(remcom_out_buffer, error);
    919}
    920
    921/* Handle the 'C' signal / exception passing packets */
    922static int gdb_cmd_exception_pass(struct kgdb_state *ks)
    923{
    924	/* C09 == pass exception
    925	 * C15 == detach kgdb, pass exception
    926	 */
    927	if (remcom_in_buffer[1] == '0' && remcom_in_buffer[2] == '9') {
    928
    929		ks->pass_exception = 1;
    930		remcom_in_buffer[0] = 'c';
    931
    932	} else if (remcom_in_buffer[1] == '1' && remcom_in_buffer[2] == '5') {
    933
    934		ks->pass_exception = 1;
    935		remcom_in_buffer[0] = 'D';
    936		dbg_remove_all_break();
    937		kgdb_connected = 0;
    938		return 1;
    939
    940	} else {
    941		gdbstub_msg_write("KGDB only knows signal 9 (pass)"
    942			" and 15 (pass and disconnect)\n"
    943			"Executing a continue without signal passing\n", 0);
    944		remcom_in_buffer[0] = 'c';
    945	}
    946
    947	/* Indicate fall through */
    948	return -1;
    949}
    950
    951/*
    952 * This function performs all gdbserial command processing
    953 */
    954int gdb_serial_stub(struct kgdb_state *ks)
    955{
    956	int error = 0;
    957	int tmp;
    958
    959	/* Initialize comm buffer and globals. */
    960	memset(remcom_out_buffer, 0, sizeof(remcom_out_buffer));
    961	kgdb_usethread = kgdb_info[ks->cpu].task;
    962	ks->kgdb_usethreadid = shadow_pid(kgdb_info[ks->cpu].task->pid);
    963	ks->pass_exception = 0;
    964
    965	if (kgdb_connected) {
    966		unsigned char thref[BUF_THREAD_ID_SIZE];
    967		char *ptr;
    968
    969		/* Reply to host that an exception has occurred */
    970		ptr = remcom_out_buffer;
    971		*ptr++ = 'T';
    972		ptr = hex_byte_pack(ptr, ks->signo);
    973		ptr += strlen(strcpy(ptr, "thread:"));
    974		int_to_threadref(thref, shadow_pid(current->pid));
    975		ptr = pack_threadid(ptr, thref);
    976		*ptr++ = ';';
    977		put_packet(remcom_out_buffer);
    978	}
    979
    980	while (1) {
    981		error = 0;
    982
    983		/* Clear the out buffer. */
    984		memset(remcom_out_buffer, 0, sizeof(remcom_out_buffer));
    985
    986		get_packet(remcom_in_buffer);
    987
    988		switch (remcom_in_buffer[0]) {
    989		case '?': /* gdbserial status */
    990			gdb_cmd_status(ks);
    991			break;
    992		case 'g': /* return the value of the CPU registers */
    993			gdb_cmd_getregs(ks);
    994			break;
    995		case 'G': /* set the value of the CPU registers - return OK */
    996			gdb_cmd_setregs(ks);
    997			break;
    998		case 'm': /* mAA..AA,LLLL  Read LLLL bytes at address AA..AA */
    999			gdb_cmd_memread(ks);
   1000			break;
   1001		case 'M': /* MAA..AA,LLLL: Write LLLL bytes at address AA..AA */
   1002			gdb_cmd_memwrite(ks);
   1003			break;
   1004#if DBG_MAX_REG_NUM > 0
   1005		case 'p': /* pXX Return gdb register XX (in hex) */
   1006			gdb_cmd_reg_get(ks);
   1007			break;
   1008		case 'P': /* PXX=aaaa Set gdb register XX to aaaa (in hex) */
   1009			gdb_cmd_reg_set(ks);
   1010			break;
   1011#endif /* DBG_MAX_REG_NUM > 0 */
   1012		case 'X': /* XAA..AA,LLLL: Write LLLL bytes at address AA..AA */
   1013			gdb_cmd_binwrite(ks);
   1014			break;
   1015			/* kill or detach. KGDB should treat this like a
   1016			 * continue.
   1017			 */
   1018		case 'D': /* Debugger detach */
   1019		case 'k': /* Debugger detach via kill */
   1020			gdb_cmd_detachkill(ks);
   1021			goto default_handle;
   1022		case 'R': /* Reboot */
   1023			if (gdb_cmd_reboot(ks))
   1024				goto default_handle;
   1025			break;
   1026		case 'q': /* query command */
   1027			gdb_cmd_query(ks);
   1028			break;
   1029		case 'H': /* task related */
   1030			gdb_cmd_task(ks);
   1031			break;
   1032		case 'T': /* Query thread status */
   1033			gdb_cmd_thread(ks);
   1034			break;
   1035		case 'z': /* Break point remove */
   1036		case 'Z': /* Break point set */
   1037			gdb_cmd_break(ks);
   1038			break;
   1039#ifdef CONFIG_KGDB_KDB
   1040		case '3': /* Escape into back into kdb */
   1041			if (remcom_in_buffer[1] == '\0') {
   1042				gdb_cmd_detachkill(ks);
   1043				return DBG_PASS_EVENT;
   1044			}
   1045			fallthrough;
   1046#endif
   1047		case 'C': /* Exception passing */
   1048			tmp = gdb_cmd_exception_pass(ks);
   1049			if (tmp > 0)
   1050				goto default_handle;
   1051			if (tmp == 0)
   1052				break;
   1053			fallthrough;	/* on tmp < 0 */
   1054		case 'c': /* Continue packet */
   1055		case 's': /* Single step packet */
   1056			if (kgdb_contthread && kgdb_contthread != current) {
   1057				/* Can't switch threads in kgdb */
   1058				error_packet(remcom_out_buffer, -EINVAL);
   1059				break;
   1060			}
   1061			fallthrough;	/* to default processing */
   1062		default:
   1063default_handle:
   1064			error = kgdb_arch_handle_exception(ks->ex_vector,
   1065						ks->signo,
   1066						ks->err_code,
   1067						remcom_in_buffer,
   1068						remcom_out_buffer,
   1069						ks->linux_regs);
   1070			/*
   1071			 * Leave cmd processing on error, detach,
   1072			 * kill, continue, or single step.
   1073			 */
   1074			if (error >= 0 || remcom_in_buffer[0] == 'D' ||
   1075			    remcom_in_buffer[0] == 'k') {
   1076				error = 0;
   1077				goto kgdb_exit;
   1078			}
   1079
   1080		}
   1081
   1082		/* reply to the request */
   1083		put_packet(remcom_out_buffer);
   1084	}
   1085
   1086kgdb_exit:
   1087	if (ks->pass_exception)
   1088		error = 1;
   1089	return error;
   1090}
   1091
   1092int gdbstub_state(struct kgdb_state *ks, char *cmd)
   1093{
   1094	int error;
   1095
   1096	switch (cmd[0]) {
   1097	case 'e':
   1098		error = kgdb_arch_handle_exception(ks->ex_vector,
   1099						   ks->signo,
   1100						   ks->err_code,
   1101						   remcom_in_buffer,
   1102						   remcom_out_buffer,
   1103						   ks->linux_regs);
   1104		return error;
   1105	case 's':
   1106	case 'c':
   1107		strscpy(remcom_in_buffer, cmd, sizeof(remcom_in_buffer));
   1108		return 0;
   1109	case '$':
   1110		strscpy(remcom_in_buffer, cmd, sizeof(remcom_in_buffer));
   1111		gdbstub_use_prev_in_buf = strlen(remcom_in_buffer);
   1112		gdbstub_prev_in_buf_pos = 0;
   1113		return 0;
   1114	}
   1115	dbg_io_ops->write_char('+');
   1116	put_packet(remcom_out_buffer);
   1117	return 0;
   1118}
   1119
   1120/**
   1121 * gdbstub_exit - Send an exit message to GDB
   1122 * @status: The exit code to report.
   1123 */
   1124void gdbstub_exit(int status)
   1125{
   1126	unsigned char checksum, ch, buffer[3];
   1127	int loop;
   1128
   1129	if (!kgdb_connected)
   1130		return;
   1131	kgdb_connected = 0;
   1132
   1133	if (!dbg_io_ops || dbg_kdb_mode)
   1134		return;
   1135
   1136	buffer[0] = 'W';
   1137	buffer[1] = hex_asc_hi(status);
   1138	buffer[2] = hex_asc_lo(status);
   1139
   1140	dbg_io_ops->write_char('$');
   1141	checksum = 0;
   1142
   1143	for (loop = 0; loop < 3; loop++) {
   1144		ch = buffer[loop];
   1145		checksum += ch;
   1146		dbg_io_ops->write_char(ch);
   1147	}
   1148
   1149	dbg_io_ops->write_char('#');
   1150	dbg_io_ops->write_char(hex_asc_hi(checksum));
   1151	dbg_io_ops->write_char(hex_asc_lo(checksum));
   1152
   1153	/* make sure the output is flushed, lest the bootloader clobber it */
   1154	if (dbg_io_ops->flush)
   1155		dbg_io_ops->flush();
   1156}