va_high_addr_switch.sh 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. #!/bin/bash
  2. # SPDX-License-Identifier: GPL-2.0
  3. #
  4. # Copyright (C) 2022 Adam Sindelar (Meta) <adam@wowsignal.io>
  5. #
  6. # This is a test for mmap behavior with 5-level paging. This script wraps the
  7. # real test to check that the kernel is configured to support at least 5
  8. # pagetable levels.
  9. # 1 means the test failed
  10. exitcode=1
  11. # Kselftest framework requirement - SKIP code is 4.
  12. ksft_skip=4
  13. fail()
  14. {
  15. echo "$1"
  16. exit $exitcode
  17. }
  18. check_supported_x86_64()
  19. {
  20. local config="/proc/config.gz"
  21. [[ -f "${config}" ]] || config="/boot/config-$(uname -r)"
  22. [[ -f "${config}" ]] || fail "Cannot find kernel config in /proc or /boot"
  23. # gzip -dcfq automatically handles both compressed and plaintext input.
  24. # See man 1 gzip under '-f'.
  25. local pg_table_levels=$(gzip -dcfq "${config}" | grep PGTABLE_LEVELS | cut -d'=' -f 2)
  26. local cpu_supports_pl5=$(awk '/^flags/ {if (/la57/) {print 0;}
  27. else {print 1}; exit}' /proc/cpuinfo 2>/dev/null)
  28. if [[ "${pg_table_levels}" -lt 5 ]]; then
  29. echo "$0: PGTABLE_LEVELS=${pg_table_levels}, must be >= 5 to run this test"
  30. exit $ksft_skip
  31. elif [[ "${cpu_supports_pl5}" -ne 0 ]]; then
  32. echo "$0: CPU does not have the necessary la57 flag to support page table level 5"
  33. exit $ksft_skip
  34. fi
  35. }
  36. check_test_requirements()
  37. {
  38. # The test supports x86_64 and powerpc64. We currently have no useful
  39. # eligibility check for powerpc64, and the test itself will reject other
  40. # architectures.
  41. case `uname -m` in
  42. "x86_64")
  43. check_supported_x86_64
  44. ;;
  45. *)
  46. return 0
  47. ;;
  48. esac
  49. }
  50. check_test_requirements
  51. ./va_high_addr_switch --run-hugetlb