mac: Make the system page size a run-time property

This enables x86_64 Chrome to run under Rosetta binary translation on
arm64 macOS systems.

The system page size is no longer considered a compile-time constant on
macOS. It may be determined dynamically at run time through the
vm_page_size variable. The related vm_page_shift and vm_page_mask
variables are also available.

On arm64, the system page size is currently 16kB. On x86_64, it’s 4kB.
x86 code running translated on currently available arm64 systems (the
Apple Developer Transition Kit) is subjected to the arm64 system’s
native 16kB page size, meaning that code built with an expectation of
4kB pages, previously correct for native x86_64, will not work correctly
in the translated environment. This is significant because the DTK is
the only mac-arm64 system available for testing now, and it’s become
important to test x86_64 Chrome under Rosetta translation on arm64.

To overcome this limitation, the system page size and related constants
are, on macOS, made to be determined at run time on the basis of the
variables provided for this purpose by the system.

In order to make this change without violating Google’s and Chrome’s
prohibition against load-time initializers, the variables that had been
used to convey page size information need to become functions. On all
platforms except for macOS, the functions remain constexpr, are marked
to be always inlined, and continue to return the same compile
time-determined value they had in the past, so while it appears
invasive, this change is in fact physically a no-op on these platforms.
On macOS, it is a functional no-op change, except when running x86_64
code on arm64 under Rosetta translation, where it causes correct values
to be used for the run-time environment.

Adopting a compile-time 16kB page size on mac-x86_64 was considered but
rejected due to the potential for memory footprint and performance
impact. That approach would result in a behavior change for native
x86_64 users, which constitute the vast majority of consumers of the
x86_64 build, for the benefit of the comparatively small number of arm64
users running x86_64 Chrome under translation. This is undesirable,
particularly for a change that may need to be merged to more stable
branches.

Apple documentation links:

https://download.developer.apple.com/Documentation/Universal_App_Quick_Start_Program_Resources/DTK_Release_notes.pdf

“Rosetta 2 Behaviors…Applications that depend on a 4K memory page size
will not run. Examples of this may include some web browsers and
language runtimes.”

Also:

https://developer.apple.com/documentation/apple_silicon/addressing_architectural_differences_in_your_macos_code#3616877
https://developer.apple.com/videos/play/wwdc2020/10214/?time=544 (9:04)

Bug: 1102194
Code-Word: disaster
CQ-Include-Trybots: luci.chromium.try:mac-arm64-rel
Change-Id: I143f38f06444f96eb8a82ede34f2a44ea48318fb
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2361202
Commit-Queue: Mark Mentovai <mark@chromium.org>
Reviewed-by: Kentaro Hara <haraken@chromium.org>
Reviewed-by: Benoit L <lizeb@chromium.org>
Reviewed-by: Chris Palmer <palmer@chromium.org>
Cr-Commit-Position: refs/heads/master@{#808610}
26 files changed
tree: 18b6aba95633689e083b9b4946ba230f2cc33ad8
  1. android_webview/
  2. apps/
  3. ash/
  4. base/
  5. build/
  6. build_overrides/
  7. buildtools/
  8. cc/
  9. chrome/
  10. chromecast/
  11. chromeos/
  12. cloud_print/
  13. components/
  14. content/
  15. courgette/
  16. crypto/
  17. dbus/
  18. device/
  19. docs/
  20. extensions/
  21. fuchsia/
  22. gin/
  23. google_apis/
  24. google_update/
  25. gpu/
  26. headless/
  27. infra/
  28. ios/
  29. ipc/
  30. jingle/
  31. media/
  32. mojo/
  33. native_client_sdk/
  34. net/
  35. pdf/
  36. ppapi/
  37. printing/
  38. remoting/
  39. rlz/
  40. sandbox/
  41. services/
  42. skia/
  43. sql/
  44. storage/
  45. styleguide/
  46. testing/
  47. third_party/
  48. tools/
  49. ui/
  50. url/
  51. weblayer/
  52. .clang-format
  53. .clang-tidy
  54. .eslintrc.js
  55. .git-blame-ignore-revs
  56. .gitattributes
  57. .gitignore
  58. .gn
  59. .vpython
  60. .vpython3
  61. .yapfignore
  62. AUTHORS
  63. BUILD.gn
  64. CODE_OF_CONDUCT.md
  65. codereview.settings
  66. DEPS
  67. DIR_METADATA
  68. ENG_REVIEW_OWNERS
  69. LICENSE
  70. LICENSE.chromium_os
  71. OWNERS
  72. PRESUBMIT.py
  73. PRESUBMIT_test.py
  74. PRESUBMIT_test_mocks.py
  75. README.md
  76. WATCHLISTS
README.md

Logo Chromium

Chromium is an open-source browser project that aims to build a safer, faster, and more stable way for all users to experience the web.

The project's web site is https://www.chromium.org.

Documentation in the source is rooted in docs/README.md.

Learn how to Get Around the Chromium Source Code Directory Structure .

For historical reasons, there are some small top level directories. Now the guidance is that new top level directories are for product (e.g. Chrome, Android WebView, Ash). Even if these products have multiple executables, the code should be in subdirectories of the product.