summaryrefslogtreecommitdiff
path: root/src/large_pages
diff options
context:
space:
mode:
authorGabriel Schulhof <gabriel.schulhof@intel.com>2019-10-09 13:27:26 -0700
committerGabriel Schulhof <gabriel.schulhof@intel.com>2019-10-16 12:35:00 -0700
commit1599aeb08df47d7a7f23be71462dc4f80cb3dce5 (patch)
tree6ccdaf092cc1b1549e2351f5fe6d914edee0e528 /src/large_pages
parent9f203f927c732a1f2f707ecce5e8656e3e4c2459 (diff)
downloadandroid-node-v8-1599aeb08df47d7a7f23be71462dc4f80cb3dce5.tar.gz
android-node-v8-1599aeb08df47d7a7f23be71462dc4f80cb3dce5.tar.bz2
android-node-v8-1599aeb08df47d7a7f23be71462dc4f80cb3dce5.zip
src: refine maps parsing for large pages
Multiple sections may be marked as "r-xp" and with the executable's path. We use the location of the `__nodetext` symbol added by the linker script to ensure that the range we retrieve from the maps file does indeed contain the Node.js text section. Thanks to Suresh Srinivas <suresh.srinivas@intel.com>! PR-URL: https://github.com/nodejs/node/pull/29973 Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl> Reviewed-By: James M Snell <jasnell@gmail.com> Reviewed-By: David Carlier <devnexen@gmail.com>
Diffstat (limited to 'src/large_pages')
-rw-r--r--src/large_pages/node_large_page.cc30
1 files changed, 16 insertions, 14 deletions
diff --git a/src/large_pages/node_large_page.cc b/src/large_pages/node_large_page.cc
index 220f71fa10..4e2f8fc441 100644
--- a/src/large_pages/node_large_page.cc
+++ b/src/large_pages/node_large_page.cc
@@ -83,11 +83,11 @@ static void PrintSystemError(int error) {
return;
}
-inline int64_t hugepage_align_up(int64_t addr) {
+inline uintptr_t hugepage_align_up(uintptr_t addr) {
return (((addr) + (hps) - 1) & ~((hps) - 1));
}
-inline int64_t hugepage_align_down(int64_t addr) {
+inline uintptr_t hugepage_align_down(uintptr_t addr) {
return ((addr) & ~((hps) - 1));
}
@@ -103,7 +103,7 @@ static struct text_region FindNodeTextRegion() {
std::string permission;
std::string dev;
char dash;
- int64_t start, end, offset, inode;
+ uintptr_t start, end, offset, inode;
struct text_region nregion;
nregion.found_text_region = false;
@@ -138,18 +138,20 @@ static struct text_region FindNodeTextRegion() {
std::string pathname;
iss >> pathname;
if (pathname == exename && permission == "r-xp") {
- start = reinterpret_cast<uint64_t>(&__nodetext);
- char* from = reinterpret_cast<char*>(hugepage_align_up(start));
- char* to = reinterpret_cast<char*>(hugepage_align_down(end));
-
- if (from < to) {
- size_t size = to - from;
- nregion.found_text_region = true;
- nregion.from = from;
- nregion.to = to;
- nregion.total_hugepages = size / hps;
+ uintptr_t ntext = reinterpret_cast<uintptr_t>(&__nodetext);
+ if (ntext >= start && ntext < end) {
+ char* from = reinterpret_cast<char*>(hugepage_align_up(ntext));
+ char* to = reinterpret_cast<char*>(hugepage_align_down(end));
+
+ if (from < to) {
+ size_t size = to - from;
+ nregion.found_text_region = true;
+ nregion.from = from;
+ nregion.to = to;
+ nregion.total_hugepages = size / hps;
+ }
+ break;
}
- break;
}
}
}