printk: add support of hh length modifier for printk
Impact: new feature, extend vsprintf format strings hh is used as length modifier for signed char or unsigned char. It is supported by glibc, we add kernel support now. Signed-off-by: Zhao Lei <zhaolei@cn.fujitsu.com> Acked-by: Lai Jiangshan <laijs@cn.fujitsu.com> Acked-by: Frederic Weisbecker <fweisbec@gmail.com> Cc: torvalds@linux-foundation.org Cc: Steven Rostedt <rostedt@goodmis.org> LKML-Reference: <49CC9739.30107@cn.fujitsu.com> Signed-off-by: Ingo Molnar <mingo@elte.hu>
This commit is contained in:
		
							parent
							
								
									022624a758
								
							
						
					
					
						commit
						a4e94ef0dd
					
				| @ -408,6 +408,8 @@ enum format_type { | ||||
| 	FORMAT_TYPE_LONG_LONG, | ||||
| 	FORMAT_TYPE_ULONG, | ||||
| 	FORMAT_TYPE_LONG, | ||||
| 	FORMAT_TYPE_UBYTE, | ||||
| 	FORMAT_TYPE_BYTE, | ||||
| 	FORMAT_TYPE_USHORT, | ||||
| 	FORMAT_TYPE_SHORT, | ||||
| 	FORMAT_TYPE_UINT, | ||||
| @ -853,11 +855,15 @@ qualifier: | ||||
| 	spec->qualifier = -1; | ||||
| 	if (*fmt == 'h' || *fmt == 'l' || *fmt == 'L' || | ||||
| 	    *fmt == 'Z' || *fmt == 'z' || *fmt == 't') { | ||||
| 		spec->qualifier = *fmt; | ||||
| 		++fmt; | ||||
| 		if (spec->qualifier == 'l' && *fmt == 'l') { | ||||
| 			spec->qualifier = 'L'; | ||||
| 			++fmt; | ||||
| 		spec->qualifier = *fmt++; | ||||
| 		if (unlikely(spec->qualifier == *fmt)) { | ||||
| 			if (spec->qualifier == 'l') { | ||||
| 				spec->qualifier = 'L'; | ||||
| 				++fmt; | ||||
| 			} else if (spec->qualifier == 'h') { | ||||
| 				spec->qualifier = 'H'; | ||||
| 				++fmt; | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| @ -919,6 +925,11 @@ qualifier: | ||||
| 		spec->type = FORMAT_TYPE_SIZE_T; | ||||
| 	} else if (spec->qualifier == 't') { | ||||
| 		spec->type = FORMAT_TYPE_PTRDIFF; | ||||
| 	} else if (spec->qualifier == 'H') { | ||||
| 		if (spec->flags & SIGN) | ||||
| 			spec->type = FORMAT_TYPE_BYTE; | ||||
| 		else | ||||
| 			spec->type = FORMAT_TYPE_UBYTE; | ||||
| 	} else if (spec->qualifier == 'h') { | ||||
| 		if (spec->flags & SIGN) | ||||
| 			spec->type = FORMAT_TYPE_SHORT; | ||||
| @ -1087,6 +1098,12 @@ int vsnprintf(char *buf, size_t size, const char *fmt, va_list args) | ||||
| 			case FORMAT_TYPE_PTRDIFF: | ||||
| 				num = va_arg(args, ptrdiff_t); | ||||
| 				break; | ||||
| 			case FORMAT_TYPE_UBYTE: | ||||
| 				num = (unsigned char) va_arg(args, int); | ||||
| 				break; | ||||
| 			case FORMAT_TYPE_BYTE: | ||||
| 				num = (signed char) va_arg(args, int); | ||||
| 				break; | ||||
| 			case FORMAT_TYPE_USHORT: | ||||
| 				num = (unsigned short) va_arg(args, int); | ||||
| 				break; | ||||
| @ -1363,6 +1380,10 @@ do {									\ | ||||
| 			case FORMAT_TYPE_PTRDIFF: | ||||
| 				save_arg(ptrdiff_t); | ||||
| 				break; | ||||
| 			case FORMAT_TYPE_UBYTE: | ||||
| 			case FORMAT_TYPE_BYTE: | ||||
| 				save_arg(char); | ||||
| 				break; | ||||
| 			case FORMAT_TYPE_USHORT: | ||||
| 			case FORMAT_TYPE_SHORT: | ||||
| 				save_arg(short); | ||||
| @ -1538,6 +1559,12 @@ int bstr_printf(char *buf, size_t size, const char *fmt, const u32 *bin_buf) | ||||
| 			case FORMAT_TYPE_PTRDIFF: | ||||
| 				num = get_arg(ptrdiff_t); | ||||
| 				break; | ||||
| 			case FORMAT_TYPE_UBYTE: | ||||
| 				num = get_arg(unsigned char); | ||||
| 				break; | ||||
| 			case FORMAT_TYPE_BYTE: | ||||
| 				num = get_arg(signed char); | ||||
| 				break; | ||||
| 			case FORMAT_TYPE_USHORT: | ||||
| 				num = get_arg(unsigned short); | ||||
| 				break; | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user