diff options
Diffstat (limited to 'lib/test_printf.c')
-rw-r--r-- | lib/test_printf.c | 108 |
1 files changed, 70 insertions, 38 deletions
diff --git a/lib/test_printf.c b/lib/test_printf.c index 563f10e6876a..71ebfa43ad05 100644 --- a/lib/test_printf.c +++ b/lib/test_printf.c | |||
@@ -24,24 +24,6 @@ | |||
24 | #define PAD_SIZE 16 | 24 | #define PAD_SIZE 16 |
25 | #define FILL_CHAR '$' | 25 | #define FILL_CHAR '$' |
26 | 26 | ||
27 | #define PTR1 ((void*)0x01234567) | ||
28 | #define PTR2 ((void*)(long)(int)0xfedcba98) | ||
29 | |||
30 | #if BITS_PER_LONG == 64 | ||
31 | #define PTR1_ZEROES "000000000" | ||
32 | #define PTR1_SPACES " " | ||
33 | #define PTR1_STR "1234567" | ||
34 | #define PTR2_STR "fffffffffedcba98" | ||
35 | #define PTR_WIDTH 16 | ||
36 | #else | ||
37 | #define PTR1_ZEROES "0" | ||
38 | #define PTR1_SPACES " " | ||
39 | #define PTR1_STR "1234567" | ||
40 | #define PTR2_STR "fedcba98" | ||
41 | #define PTR_WIDTH 8 | ||
42 | #endif | ||
43 | #define PTR_WIDTH_STR stringify(PTR_WIDTH) | ||
44 | |||
45 | static unsigned total_tests __initdata; | 27 | static unsigned total_tests __initdata; |
46 | static unsigned failed_tests __initdata; | 28 | static unsigned failed_tests __initdata; |
47 | static char *test_buffer __initdata; | 29 | static char *test_buffer __initdata; |
@@ -217,30 +199,79 @@ test_string(void) | |||
217 | test("a | | ", "%-3.s|%-3.0s|%-3.*s", "a", "b", 0, "c"); | 199 | test("a | | ", "%-3.s|%-3.0s|%-3.*s", "a", "b", 0, "c"); |
218 | } | 200 | } |
219 | 201 | ||
202 | #define PLAIN_BUF_SIZE 64 /* leave some space so we don't oops */ | ||
203 | |||
204 | #if BITS_PER_LONG == 64 | ||
205 | |||
206 | #define PTR_WIDTH 16 | ||
207 | #define PTR ((void *)0xffff0123456789ab) | ||
208 | #define PTR_STR "ffff0123456789ab" | ||
209 | #define ZEROS "00000000" /* hex 32 zero bits */ | ||
210 | |||
211 | static int __init | ||
212 | plain_format(void) | ||
213 | { | ||
214 | char buf[PLAIN_BUF_SIZE]; | ||
215 | int nchars; | ||
216 | |||
217 | nchars = snprintf(buf, PLAIN_BUF_SIZE, "%p", PTR); | ||
218 | |||
219 | if (nchars != PTR_WIDTH || strncmp(buf, ZEROS, strlen(ZEROS)) != 0) | ||
220 | return -1; | ||
221 | |||
222 | return 0; | ||
223 | } | ||
224 | |||
225 | #else | ||
226 | |||
227 | #define PTR_WIDTH 8 | ||
228 | #define PTR ((void *)0x456789ab) | ||
229 | #define PTR_STR "456789ab" | ||
230 | |||
231 | static int __init | ||
232 | plain_format(void) | ||
233 | { | ||
234 | /* Format is implicitly tested for 32 bit machines by plain_hash() */ | ||
235 | return 0; | ||
236 | } | ||
237 | |||
238 | #endif /* BITS_PER_LONG == 64 */ | ||
239 | |||
240 | static int __init | ||
241 | plain_hash(void) | ||
242 | { | ||
243 | char buf[PLAIN_BUF_SIZE]; | ||
244 | int nchars; | ||
245 | |||
246 | nchars = snprintf(buf, PLAIN_BUF_SIZE, "%p", PTR); | ||
247 | |||
248 | if (nchars != PTR_WIDTH || strncmp(buf, PTR_STR, PTR_WIDTH) == 0) | ||
249 | return -1; | ||
250 | |||
251 | return 0; | ||
252 | } | ||
253 | |||
254 | /* | ||
255 | * We can't use test() to test %p because we don't know what output to expect | ||
256 | * after an address is hashed. | ||
257 | */ | ||
220 | static void __init | 258 | static void __init |
221 | plain(void) | 259 | plain(void) |
222 | { | 260 | { |
223 | test(PTR1_ZEROES PTR1_STR " " PTR2_STR, "%p %p", PTR1, PTR2); | 261 | int err; |
224 | /* | ||
225 | * The field width is overloaded for some %p extensions to | ||
226 | * pass another piece of information. For plain pointers, the | ||
227 | * behaviour is slightly odd: One cannot pass either the 0 | ||
228 | * flag nor a precision to %p without gcc complaining, and if | ||
229 | * one explicitly gives a field width, the number is no longer | ||
230 | * zero-padded. | ||
231 | */ | ||
232 | test("|" PTR1_STR PTR1_SPACES " | " PTR1_SPACES PTR1_STR "|", | ||
233 | "|%-*p|%*p|", PTR_WIDTH+2, PTR1, PTR_WIDTH+2, PTR1); | ||
234 | test("|" PTR2_STR " | " PTR2_STR "|", | ||
235 | "|%-*p|%*p|", PTR_WIDTH+2, PTR2, PTR_WIDTH+2, PTR2); | ||
236 | 262 | ||
237 | /* | 263 | err = plain_hash(); |
238 | * Unrecognized %p extensions are treated as plain %p, but the | 264 | if (err) { |
239 | * alphanumeric suffix is ignored (that is, does not occur in | 265 | pr_warn("plain 'p' does not appear to be hashed\n"); |
240 | * the output.) | 266 | failed_tests++; |
241 | */ | 267 | return; |
242 | test("|"PTR1_ZEROES PTR1_STR"|", "|%p0y|", PTR1); | 268 | } |
243 | test("|"PTR2_STR"|", "|%p0y|", PTR2); | 269 | |
270 | err = plain_format(); | ||
271 | if (err) { | ||
272 | pr_warn("hashing plain 'p' has unexpected format\n"); | ||
273 | failed_tests++; | ||
274 | } | ||
244 | } | 275 | } |
245 | 276 | ||
246 | static void __init | 277 | static void __init |
@@ -251,6 +282,7 @@ symbol_ptr(void) | |||
251 | static void __init | 282 | static void __init |
252 | kernel_ptr(void) | 283 | kernel_ptr(void) |
253 | { | 284 | { |
285 | /* We can't test this without access to kptr_restrict. */ | ||
254 | } | 286 | } |
255 | 287 | ||
256 | static void __init | 288 | static void __init |