[compiler-rt] r292729 - [test] Fix page address logic in clear_cache_test

Hans Wennborg via llvm-commits llvm-commits at lists.llvm.org
Wed Feb 15 11:19:14 PST 2017


Merged to 4.0 in r295218

On Sat, Jan 21, 2017 at 1:55 PM, Michal Gorny via llvm-commits
<llvm-commits at lists.llvm.org> wrote:
> Author: mgorny
> Date: Sat Jan 21 15:55:00 2017
> New Revision: 292729
>
> URL: http://llvm.org/viewvc/llvm-project?rev=292729&view=rev
> Log:
> [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
>
> Modified:
>     compiler-rt/trunk/test/builtins/Unit/clear_cache_test.c
>
> Modified: compiler-rt/trunk/test/builtins/Unit/clear_cache_test.c
> URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/builtins/Unit/clear_cache_test.c?rev=292729&r1=292728&r2=292729&view=diff
> ==============================================================================
> --- compiler-rt/trunk/test/builtins/Unit/clear_cache_test.c (original)
> +++ compiler-rt/trunk/test/builtins/Unit/clear_cache_test.c Sat Jan 21 15:55:00 2017
> @@ -18,9 +18,20 @@ void __clear_cache(void* start, void* en
>      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;
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits


More information about the llvm-commits mailing list