diff options
Diffstat (limited to 'lib/vsprintf.c')
| -rw-r--r-- | lib/vsprintf.c | 13 | 
1 files changed, 13 insertions, 0 deletions
diff --git a/lib/vsprintf.c b/lib/vsprintf.c index 3c1853a9d1c0..c414a8d9f1ea 100644 --- a/lib/vsprintf.c +++ b/lib/vsprintf.c @@ -2246,6 +2246,9 @@ int __init no_hash_pointers_enable(char *str)  }  early_param("no_hash_pointers", no_hash_pointers_enable); +/* Used for Rust formatting ('%pA'). */ +char *rust_fmt_argument(char *buf, char *end, void *ptr); +  /*   * Show a '%p' thing.  A kernel extension is that the '%p' is followed   * by an extra set of alphanumeric characters that are extended format @@ -2372,6 +2375,10 @@ early_param("no_hash_pointers", no_hash_pointers_enable);   *   * Note: The default behaviour (unadorned %p) is to hash the address,   * rendering it useful as a unique identifier. + * + * There is also a '%pA' format specifier, but it is only intended to be used + * from Rust code to format core::fmt::Arguments. Do *not* use it from C. + * See rust/kernel/print.rs for details.   */  static noinline_for_stack  char *pointer(const char *fmt, char *buf, char *end, void *ptr, @@ -2444,6 +2451,12 @@ char *pointer(const char *fmt, char *buf, char *end, void *ptr,  		return device_node_string(buf, end, ptr, spec, fmt + 1);  	case 'f':  		return fwnode_string(buf, end, ptr, spec, fmt + 1); +	case 'A': +		if (!IS_ENABLED(CONFIG_RUST)) { +			WARN_ONCE(1, "Please remove %%pA from non-Rust code\n"); +			return error_string(buf, end, "(%pA?)", spec); +		} +		return rust_fmt_argument(buf, end, ptr);  	case 'x':  		return pointer_string(buf, end, ptr, spec);  	case 'e':  |