diff options
Diffstat (limited to 'kernel/debug/kdb/kdb_io.c')
| -rw-r--r-- | kernel/debug/kdb/kdb_io.c | 86 | 
1 files changed, 56 insertions, 30 deletions
diff --git a/kernel/debug/kdb/kdb_io.c b/kernel/debug/kdb/kdb_io.c index 96fdaac46a8..7c70812caea 100644 --- a/kernel/debug/kdb/kdb_io.c +++ b/kernel/debug/kdb/kdb_io.c @@ -31,15 +31,21 @@ char kdb_prompt_str[CMD_BUFLEN];  int kdb_trap_printk; -static void kgdb_transition_check(char *buffer) +static int kgdb_transition_check(char *buffer)  { -	int slen = strlen(buffer); -	if (strncmp(buffer, "$?#3f", slen) != 0 && -	    strncmp(buffer, "$qSupported#37", slen) != 0 && -	    strncmp(buffer, "+$qSupported#37", slen) != 0) { +	if (buffer[0] != '+' && buffer[0] != '$') {  		KDB_STATE_SET(KGDB_TRANS);  		kdb_printf("%s", buffer); +	} else { +		int slen = strlen(buffer); +		if (slen > 3 && buffer[slen - 3] == '#') { +			kdb_gdb_state_pass(buffer); +			strcpy(buffer, "kgdb"); +			KDB_STATE_SET(DOING_KGDB); +			return 1; +		}  	} +	return 0;  }  static int kdb_read_get_key(char *buffer, size_t bufsize) @@ -251,6 +257,10 @@ poll_again:  	case 13: /* enter */  		*lastchar++ = '\n';  		*lastchar++ = '\0'; +		if (!KDB_STATE(KGDB_TRANS)) { +			KDB_STATE_SET(KGDB_TRANS); +			kdb_printf("%s", buffer); +		}  		kdb_printf("\n");  		return buffer;  	case 4: /* Del */ @@ -382,22 +392,26 @@ poll_again:  				 * printed characters if we think that  				 * kgdb is connecting, until the check  				 * fails */ -				if (!KDB_STATE(KGDB_TRANS)) -					kgdb_transition_check(buffer); -				else +				if (!KDB_STATE(KGDB_TRANS)) { +					if (kgdb_transition_check(buffer)) +						return buffer; +				} else {  					kdb_printf("%c", key); +				}  			}  			/* Special escape to kgdb */  			if (lastchar - buffer >= 5 &&  			    strcmp(lastchar - 5, "$?#3f") == 0) { +				kdb_gdb_state_pass(lastchar - 5);  				strcpy(buffer, "kgdb");  				KDB_STATE_SET(DOING_KGDB);  				return buffer;  			} -			if (lastchar - buffer >= 14 && -			    strcmp(lastchar - 14, "$qSupported#37") == 0) { +			if (lastchar - buffer >= 11 && +			    strcmp(lastchar - 11, "$qSupported") == 0) { +				kdb_gdb_state_pass(lastchar - 11);  				strcpy(buffer, "kgdb"); -				KDB_STATE_SET(DOING_KGDB2); +				KDB_STATE_SET(DOING_KGDB);  				return buffer;  			}  		} @@ -538,6 +552,7 @@ int vkdb_printf(const char *fmt, va_list ap)  {  	int diag;  	int linecount; +	int colcount;  	int logging, saved_loglevel = 0;  	int saved_trap_printk;  	int got_printf_lock = 0; @@ -570,6 +585,10 @@ int vkdb_printf(const char *fmt, va_list ap)  	if (diag || linecount <= 1)  		linecount = 24; +	diag = kdbgetintenv("COLUMNS", &colcount); +	if (diag || colcount <= 1) +		colcount = 80; +  	diag = kdbgetintenv("LOGGING", &logging);  	if (diag)  		logging = 0; @@ -675,8 +694,8 @@ kdb_printit:  	if (!dbg_kdb_mode && kgdb_connected) {  		gdbstub_msg_write(kdb_buffer, retlen);  	} else { -		if (!dbg_io_ops->is_console) { -			len = strlen(kdb_buffer); +		if (dbg_io_ops && !dbg_io_ops->is_console) { +			len = retlen;  			cp = kdb_buffer;  			while (len--) {  				dbg_io_ops->write_char(*cp); @@ -691,19 +710,34 @@ kdb_printit:  	}  	if (logging) {  		saved_loglevel = console_loglevel; -		console_loglevel = 0; +		console_loglevel = CONSOLE_LOGLEVEL_SILENT;  		printk(KERN_INFO "%s", kdb_buffer);  	} -	if (KDB_STATE(PAGER) && strchr(kdb_buffer, '\n')) -		kdb_nextline++; +	if (KDB_STATE(PAGER)) { +		/* +		 * Check printed string to decide how to bump the +		 * kdb_nextline to control when the more prompt should +		 * show up. +		 */ +		int got = 0; +		len = retlen; +		while (len--) { +			if (kdb_buffer[len] == '\n') { +				kdb_nextline++; +				got = 0; +			} else if (kdb_buffer[len] == '\r') { +				got = 0; +			} else { +				got++; +			} +		} +		kdb_nextline += got / (colcount + 1); +	}  	/* check for having reached the LINES number of printed lines */ -	if (kdb_nextline == linecount) { +	if (kdb_nextline >= linecount) {  		char buf1[16] = ""; -#if defined(CONFIG_SMP) -		char buf2[32]; -#endif  		/* Watch out for recursion here.  Any routine that calls  		 * kdb_printf will come back through here.  And kdb_read @@ -718,18 +752,10 @@ kdb_printit:  		if (moreprompt == NULL)  			moreprompt = "more> "; -#if defined(CONFIG_SMP) -		if (strchr(moreprompt, '%')) { -			sprintf(buf2, moreprompt, get_cpu()); -			put_cpu(); -			moreprompt = buf2; -		} -#endif -  		kdb_input_flush();  		c = console_drivers; -		if (!dbg_io_ops->is_console) { +		if (dbg_io_ops && !dbg_io_ops->is_console) {  			len = strlen(moreprompt);  			cp = moreprompt;  			while (len--) { @@ -762,7 +788,7 @@ kdb_printit:  			kdb_grepping_flag = 0;  			kdb_printf("\n");  		} else if (buf1[0] == ' ') { -			kdb_printf("\n"); +			kdb_printf("\r");  			suspend_grep = 1; /* for this recursion */  		} else if (buf1[0] == '\n') {  			kdb_nextline = linecount - 1;  | 
