177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao//===-- clear_cache_test.c - Test clear_cache -----------------------------===// 277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao// 377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao// The LLVM Compiler Infrastructure 477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao// 577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao// This file is distributed under the University of Illinois Open Source 677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao// License. See LICENSE.TXT for details. 777ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao// 877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao//===----------------------------------------------------------------------===// 977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao 1077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao 1177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao#include <stdio.h> 1277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao#include <string.h> 1377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao#include <stdint.h> 1477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao#include <sys/mman.h> 1577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao 1677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao 1777ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao 1877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaoextern void __clear_cache(void* start, void* end); 1977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao 2077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaotypedef int (*pfunc)(void); 2177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao 2277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaoint func1() 2377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao{ 2477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao return 1; 2577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao} 2677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao 2777ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaoint func2() 2877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao{ 2977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao return 2; 3077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao} 3177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao 3277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao 3377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao 3477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaounsigned char execution_buffer[128]; 3577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao 3677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaoint main() 3777ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao{ 3877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao // make executable the page containing execution_buffer 3977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao char* start = (char*)((uintptr_t)execution_buffer & (-4095)); 4077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao char* end = (char*)((uintptr_t)(&execution_buffer[128+4096]) & (-4095)); 4177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao if ( mprotect(start, end-start, PROT_READ|PROT_WRITE|PROT_EXEC) != 0 ) 4277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao return 1; 4377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao 4477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao // verify you can copy and execute a function 4577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao memcpy(execution_buffer, (void *)(uintptr_t)&func1, 128); 4677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao __clear_cache(execution_buffer, &execution_buffer[128]); 4777ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao pfunc f1 = (pfunc)(uintptr_t)execution_buffer; 4877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao if ( (*f1)() != 1 ) 4977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao return 1; 5077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao 5177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao // verify you can overwrite a function with another 5277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao memcpy(execution_buffer, (void *)(uintptr_t)&func2, 128); 5377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao __clear_cache(execution_buffer, &execution_buffer[128]); 5477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao pfunc f2 = (pfunc)(uintptr_t)execution_buffer; 5577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao if ( (*f2)() != 2 ) 5677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao return 1; 5777ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao 5877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao return 0; 5977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao} 60