@@ -1039,6 +1039,20 @@ static const struct printf_spec default_dec04_spec = {
10391039 .flags = ZEROPAD ,
10401040};
10411041
1042+ static noinline_for_stack
1043+ char * hex_range (char * buf , char * end , u64 start_val , u64 end_val ,
1044+ struct printf_spec spec )
1045+ {
1046+ buf = number (buf , end , start_val , spec );
1047+ if (start_val == end_val )
1048+ return buf ;
1049+
1050+ if (buf < end )
1051+ * buf = '-' ;
1052+ ++ buf ;
1053+ return number (buf , end , end_val , spec );
1054+ }
1055+
10421056static noinline_for_stack
10431057char * resource_string (char * buf , char * end , struct resource * res ,
10441058 struct printf_spec spec , const char * fmt )
@@ -1115,11 +1129,7 @@ char *resource_string(char *buf, char *end, struct resource *res,
11151129 p = string_nocheck (p , pend , "size " , str_spec );
11161130 p = number (p , pend , resource_size (res ), * specp );
11171131 } else {
1118- p = number (p , pend , res -> start , * specp );
1119- if (res -> start != res -> end ) {
1120- * p ++ = '-' ;
1121- p = number (p , pend , res -> end , * specp );
1122- }
1132+ p = hex_range (p , pend , res -> start , res -> end , * specp );
11231133 }
11241134 if (decode ) {
11251135 if (res -> flags & IORESOURCE_MEM_64 )
@@ -1140,6 +1150,31 @@ char *resource_string(char *buf, char *end, struct resource *res,
11401150 return string_nocheck (buf , end , sym , spec );
11411151}
11421152
1153+ static noinline_for_stack
1154+ char * range_string (char * buf , char * end , const struct range * range ,
1155+ struct printf_spec spec , const char * fmt )
1156+ {
1157+ char sym [sizeof ("[range 0x0123456789abcdef-0x0123456789abcdef]" )];
1158+ char * p = sym , * pend = sym + sizeof (sym );
1159+
1160+ struct printf_spec range_spec = {
1161+ .field_width = 2 + 2 * sizeof (range -> start ), /* 0x + 2 * 8 */
1162+ .flags = SPECIAL | SMALL | ZEROPAD ,
1163+ .base = 16 ,
1164+ .precision = -1 ,
1165+ };
1166+
1167+ if (check_pointer (& buf , end , range , spec ))
1168+ return buf ;
1169+
1170+ p = string_nocheck (p , pend , "[range " , default_str_spec );
1171+ p = hex_range (p , pend , range -> start , range -> end , range_spec );
1172+ * p ++ = ']' ;
1173+ * p = '\0' ;
1174+
1175+ return string_nocheck (buf , end , sym , spec );
1176+ }
1177+
11431178static noinline_for_stack
11441179char * hex_string (char * buf , char * end , u8 * addr , struct printf_spec spec ,
11451180 const char * fmt )
@@ -2229,6 +2264,15 @@ char *fwnode_string(char *buf, char *end, struct fwnode_handle *fwnode,
22292264 return widen_string (buf , buf - buf_start , end , spec );
22302265}
22312266
2267+ static noinline_for_stack
2268+ char * resource_or_range (const char * fmt , char * buf , char * end , void * ptr ,
2269+ struct printf_spec spec )
2270+ {
2271+ if (* fmt == 'r' && fmt [1 ] == 'a' )
2272+ return range_string (buf , end , ptr , spec , fmt );
2273+ return resource_string (buf , end , ptr , spec , fmt );
2274+ }
2275+
22322276int __init no_hash_pointers_enable (char * str )
22332277{
22342278 if (no_hash_pointers )
@@ -2277,6 +2321,7 @@ char *rust_fmt_argument(char *buf, char *end, void *ptr);
22772321 * - 'Bb' as above with module build ID (for use in backtraces)
22782322 * - 'R' For decoded struct resource, e.g., [mem 0x0-0x1f 64bit pref]
22792323 * - 'r' For raw struct resource, e.g., [mem 0x0-0x1f flags 0x201]
2324+ * - 'ra' For struct ranges, e.g., [range 0x0000000000000000 - 0x00000000000000ff]
22802325 * - 'b[l]' For a bitmap, the number of bits is determined by the field
22812326 * width which must be explicitly specified either as part of the
22822327 * format string '%32b[l]' or through '%*b[l]', [l] selects
@@ -2401,7 +2446,7 @@ char *pointer(const char *fmt, char *buf, char *end, void *ptr,
24012446 return symbol_string (buf , end , ptr , spec , fmt );
24022447 case 'R' :
24032448 case 'r' :
2404- return resource_string ( buf , end , ptr , spec , fmt );
2449+ return resource_or_range ( fmt , buf , end , ptr , spec );
24052450 case 'h' :
24062451 return hex_string (buf , end , ptr , spec , fmt );
24072452 case 'b' :
0 commit comments