summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHans Wennborg <hans@hanshq.net>2017-02-15 19:06:24 +0000
committerHans Wennborg <hans@hanshq.net>2017-02-15 19:06:24 +0000
commit1fdc27db84c9d0d9ae4ae60185629e8c43b4a11c (patch)
tree3c3e90a7e4fc627a691b2b9fa34c9724bd08de63
parent84c9f24c2c4a0ce3437195e60b6f3f2d232c2770 (diff)
downloadcompiler-rt-1fdc27db84c9d0d9ae4ae60185629e8c43b4a11c.tar.gz
Merging r292729:
------------------------------------------------------------------------ r292729 | mgorny | 2017-01-21 13:55:00 -0800 (Sat, 21 Jan 2017) | 17 lines [test] Fix page address logic in clear_cache_test Fix the logic used to calculate page boundaries in clear_cache_test to use correct masks -- e.g. -4096 rather than -4095. The latter gives incorrect result since: -4095 -> 0xfffff001 -4096 -> 0xfffff000 (== ~4095) The issue went unnoticed so far because the array alignment caused the last bit not to be set. However, on 32-bit x86 no such alignment is enforced and the wrong page address caused the test to fail. Furthermore, obtain the page size from the system instead of hardcoding 4096. Differential Revision: https://reviews.llvm.org/D28849 ------------------------------------------------------------------------ git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/branches/release_40@295218 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--test/builtins/Unit/clear_cache_test.c16
1 files changed, 14 insertions, 2 deletions
diff --git a/test/builtins/Unit/clear_cache_test.c b/test/builtins/Unit/clear_cache_test.c
index 3c8930185..0ef704fcd 100644
--- a/test/builtins/Unit/clear_cache_test.c
+++ b/test/builtins/Unit/clear_cache_test.c
@@ -18,9 +18,20 @@ void __clear_cache(void* start, void* end)
if (!FlushInstructionCache(GetCurrentProcess(), start, end-start))
exit(1);
}
+
+static uintptr_t get_page_size() {
+ SYSTEM_INFO si;
+ GetSystemInfo(&si);
+ return si.dwPageSize;
+}
#else
+#include <unistd.h>
#include <sys/mman.h>
extern void __clear_cache(void* start, void* end);
+
+static uintptr_t get_page_size() {
+ return sysconf(_SC_PAGE_SIZE);
+}
#endif
@@ -56,8 +67,9 @@ unsigned char execution_buffer[128];
int main()
{
// make executable the page containing execution_buffer
- char* start = (char*)((uintptr_t)execution_buffer & (-4095));
- char* end = (char*)((uintptr_t)(&execution_buffer[128+4096]) & (-4095));
+ uintptr_t page_size = get_page_size();
+ char* start = (char*)((uintptr_t)execution_buffer & (-page_size));
+ char* end = (char*)((uintptr_t)(&execution_buffer[128+page_size]) & (-page_size));
#if defined(_WIN32)
DWORD dummy_oldProt;
MEMORY_BASIC_INFORMATION b;