diff options
Diffstat (limited to 'scripts')
| -rwxr-xr-x | scripts/leaking_addresses.pl | 32 |
1 files changed, 25 insertions, 7 deletions
diff --git a/scripts/leaking_addresses.pl b/scripts/leaking_addresses.pl index b3ffbf8022ce..35d6dd9fdced 100755 --- a/scripts/leaking_addresses.pl +++ b/scripts/leaking_addresses.pl | |||
| @@ -20,6 +20,7 @@ use Term::ANSIColor qw(:constants); | |||
| 20 | use Getopt::Long qw(:config no_auto_abbrev); | 20 | use Getopt::Long qw(:config no_auto_abbrev); |
| 21 | use Config; | 21 | use Config; |
| 22 | use bigint qw/hex/; | 22 | use bigint qw/hex/; |
| 23 | use feature 'state'; | ||
| 23 | 24 | ||
| 24 | my $P = $0; | 25 | my $P = $0; |
| 25 | my $V = '0.01'; | 26 | my $V = '0.01'; |
| @@ -296,13 +297,7 @@ sub may_leak_address | |||
| 296 | return 0; | 297 | return 0; |
| 297 | } | 298 | } |
| 298 | 299 | ||
| 299 | # One of these is guaranteed to be true. | 300 | $address_re = get_address_re(); |
| 300 | if (is_x86_64()) { | ||
| 301 | $address_re = '\b(0x)?ffff[[:xdigit:]]{12}\b'; | ||
| 302 | } elsif (is_ppc64()) { | ||
| 303 | $address_re = '\b(0x)?[89abcdef]00[[:xdigit:]]{13}\b'; | ||
| 304 | } | ||
| 305 | |||
| 306 | while (/($address_re)/g) { | 301 | while (/($address_re)/g) { |
| 307 | if (!is_false_positive($1)) { | 302 | if (!is_false_positive($1)) { |
| 308 | return 1; | 303 | return 1; |
| @@ -312,6 +307,29 @@ sub may_leak_address | |||
| 312 | return 0; | 307 | return 0; |
| 313 | } | 308 | } |
| 314 | 309 | ||
| 310 | sub get_address_re | ||
| 311 | { | ||
| 312 | if (is_x86_64()) { | ||
| 313 | return get_x86_64_re(); | ||
| 314 | } elsif (is_ppc64()) { | ||
| 315 | return '\b(0x)?[89abcdef]00[[:xdigit:]]{13}\b'; | ||
| 316 | } | ||
| 317 | } | ||
| 318 | |||
| 319 | sub get_x86_64_re | ||
| 320 | { | ||
| 321 | # We handle page table levels but only if explicitly configured using | ||
| 322 | # CONFIG_PGTABLE_LEVELS. If config file parsing fails or config option | ||
| 323 | # is not found we default to using address regular expression suitable | ||
| 324 | # for 4 page table levels. | ||
| 325 | state $ptl = get_kernel_config_option('CONFIG_PGTABLE_LEVELS'); | ||
| 326 | |||
| 327 | if ($ptl == 5) { | ||
| 328 | return '\b(0x)?ff[[:xdigit:]]{14}\b'; | ||
| 329 | } | ||
| 330 | return '\b(0x)?ffff[[:xdigit:]]{12}\b'; | ||
| 331 | } | ||
| 332 | |||
| 315 | sub parse_dmesg | 333 | sub parse_dmesg |
| 316 | { | 334 | { |
| 317 | open my $cmd, '-|', 'dmesg'; | 335 | open my $cmd, '-|', 'dmesg'; |
