Skip to content

Commit

Permalink
[test] Fix page address logic in clear_cache_test
Browse files Browse the repository at this point in the history
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

llvm-svn: 292729
  • Loading branch information
mgorny committed Jan 21, 2017
1 parent e6de7d3 commit b81980a
Showing 1 changed file with 14 additions and 2 deletions.
16 changes: 14 additions & 2 deletions compiler-rt/test/builtins/Unit/clear_cache_test.c
Expand Up @@ -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


Expand Down Expand Up @@ -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;
Expand Down

0 comments on commit b81980a

Please sign in to comment.