1*344aa361SAndroid Build Coastguard Worker/* 2*344aa361SAndroid Build Coastguard Worker * Copyright (c) 2015, Google Inc. All rights reserved 3*344aa361SAndroid Build Coastguard Worker * 4*344aa361SAndroid Build Coastguard Worker * Permission is hereby granted, free of charge, to any person obtaining 5*344aa361SAndroid Build Coastguard Worker * a copy of this software and associated documentation files 6*344aa361SAndroid Build Coastguard Worker * (the "Software"), to deal in the Software without restriction, 7*344aa361SAndroid Build Coastguard Worker * including without limitation the rights to use, copy, modify, merge, 8*344aa361SAndroid Build Coastguard Worker * publish, distribute, sublicense, and/or sell copies of the Software, 9*344aa361SAndroid Build Coastguard Worker * and to permit persons to whom the Software is furnished to do so, 10*344aa361SAndroid Build Coastguard Worker * subject to the following conditions: 11*344aa361SAndroid Build Coastguard Worker * 12*344aa361SAndroid Build Coastguard Worker * The above copyright notice and this permission notice shall be 13*344aa361SAndroid Build Coastguard Worker * included in all copies or substantial portions of the Software. 14*344aa361SAndroid Build Coastguard Worker * 15*344aa361SAndroid Build Coastguard Worker * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 16*344aa361SAndroid Build Coastguard Worker * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 17*344aa361SAndroid Build Coastguard Worker * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 18*344aa361SAndroid Build Coastguard Worker * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY 19*344aa361SAndroid Build Coastguard Worker * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 20*344aa361SAndroid Build Coastguard Worker * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 21*344aa361SAndroid Build Coastguard Worker * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 22*344aa361SAndroid Build Coastguard Worker */ 23*344aa361SAndroid Build Coastguard Worker 24*344aa361SAndroid Build Coastguard Worker#include <asm.h> 25*344aa361SAndroid Build Coastguard Worker#include <arch/asm_macros.h> 26*344aa361SAndroid Build Coastguard Worker#include <err.h> 27*344aa361SAndroid Build Coastguard Worker 28*344aa361SAndroid Build Coastguard Worker.syntax unified 29*344aa361SAndroid Build Coastguard Worker 30*344aa361SAndroid Build Coastguard Worker/** 31*344aa361SAndroid Build Coastguard Worker * int mmutest_arch_rodata_pnx(void) - Test that rodata section is mapped pnx 32*344aa361SAndroid Build Coastguard Worker * 33*344aa361SAndroid Build Coastguard Worker * Returns ERR_FAULT if rodata is not executable. 34*344aa361SAndroid Build Coastguard Worker * Return 0 if rodata is executable. 35*344aa361SAndroid Build Coastguard Worker */ 36*344aa361SAndroid Build Coastguard Worker.section .rodata 37*344aa361SAndroid Build Coastguard Worker.align 2 38*344aa361SAndroid Build Coastguard WorkerFUNCTION(mmutest_arch_rodata_pnx) 39*344aa361SAndroid Build Coastguard Worker set_fault_handler .Lmmutest_fault 40*344aa361SAndroid Build Coastguard Worker mov r0, #0 41*344aa361SAndroid Build Coastguard Worker 42*344aa361SAndroid Build Coastguard Worker bx lr 43*344aa361SAndroid Build Coastguard Worker 44*344aa361SAndroid Build Coastguard Worker/** 45*344aa361SAndroid Build Coastguard Worker * int mmutest_arch_data_pnx(void) - Test that data section is mapped pnx 46*344aa361SAndroid Build Coastguard Worker * 47*344aa361SAndroid Build Coastguard Worker * Returns ERR_FAULT if data is not executable. 48*344aa361SAndroid Build Coastguard Worker * Return 0 if data is executable. 49*344aa361SAndroid Build Coastguard Worker */ 50*344aa361SAndroid Build Coastguard Worker.section .data 51*344aa361SAndroid Build Coastguard Worker.align 2 52*344aa361SAndroid Build Coastguard WorkerFUNCTION(mmutest_arch_data_pnx) 53*344aa361SAndroid Build Coastguard Worker set_fault_handler .Lmmutest_fault 54*344aa361SAndroid Build Coastguard Worker mov r0, #0 55*344aa361SAndroid Build Coastguard Worker 56*344aa361SAndroid Build Coastguard Worker bx lr 57*344aa361SAndroid Build Coastguard Worker.section .text 58*344aa361SAndroid Build Coastguard Worker 59*344aa361SAndroid Build Coastguard Worker/** 60*344aa361SAndroid Build Coastguard Worker * int mmutest_arch_rodata_ro(void) - Test that rodata section is mapped read-only 61*344aa361SAndroid Build Coastguard Worker * 62*344aa361SAndroid Build Coastguard Worker * Returns ERR_FAULT if rodata is not writeable 63*344aa361SAndroid Build Coastguard Worker * Returns 1 if write to rodata is silently dropped 64*344aa361SAndroid Build Coastguard Worker * Returns 0 if rodata is writable 65*344aa361SAndroid Build Coastguard Worker */ 66*344aa361SAndroid Build Coastguard WorkerFUNCTION(mmutest_arch_rodata_ro) 67*344aa361SAndroid Build Coastguard Worker ldr r0, =.Ltest_rodata_long 68*344aa361SAndroid Build Coastguard Worker mov r1, #0 69*344aa361SAndroid Build Coastguard Worker 70*344aa361SAndroid Build Coastguard Worker set_fault_handler .Lmmutest_fault 71*344aa361SAndroid Build Coastguard Worker str r1, [r0] 72*344aa361SAndroid Build Coastguard Worker 73*344aa361SAndroid Build Coastguard Worker ldr r0, [r0] 74*344aa361SAndroid Build Coastguard Worker bx lr 75*344aa361SAndroid Build Coastguard Worker 76*344aa361SAndroid Build Coastguard Worker.section .rodata 77*344aa361SAndroid Build Coastguard Worker.Ltest_rodata_long: 78*344aa361SAndroid Build Coastguard Worker .long 0x1 79*344aa361SAndroid Build Coastguard Worker 80*344aa361SAndroid Build Coastguard Worker.section .text 81*344aa361SAndroid Build Coastguard Worker 82*344aa361SAndroid Build Coastguard Worker/** 83*344aa361SAndroid Build Coastguard Worker * int mmutest_arch_store_uint32(uint32_t *ptr, bool user) - Test if ptr is writeable 84*344aa361SAndroid Build Coastguard Worker * @ptr: Memory location to test 85*344aa361SAndroid Build Coastguard Worker * @user: Use unpriviledged store 86*344aa361SAndroid Build Coastguard Worker * 87*344aa361SAndroid Build Coastguard Worker * Returns ERR_FAULT if ptr is not writeable 88*344aa361SAndroid Build Coastguard Worker * Returns ERR_GENERIC if ptr is not readable 89*344aa361SAndroid Build Coastguard Worker * Returns 2 if write does not fault, but data is lost on readback from memory 90*344aa361SAndroid Build Coastguard Worker * Returns 1 if write does not fault, but data is lost on readback from cache 91*344aa361SAndroid Build Coastguard Worker * Returns 0 if ptr is writable 92*344aa361SAndroid Build Coastguard Worker */ 93*344aa361SAndroid Build Coastguard WorkerFUNCTION(mmutest_arch_store_uint32) 94*344aa361SAndroid Build Coastguard Worker cmp r1, #0 95*344aa361SAndroid Build Coastguard Worker 96*344aa361SAndroid Build Coastguard Worker set_fault_handler .Lmmutest_setup_fault 97*344aa361SAndroid Build Coastguard Worker ldreq r1, [r0] 98*344aa361SAndroid Build Coastguard Worker 99*344aa361SAndroid Build Coastguard Worker set_fault_handler .Lmmutest_setup_fault 100*344aa361SAndroid Build Coastguard Worker ldrtne r1, [r0] 101*344aa361SAndroid Build Coastguard Worker 102*344aa361SAndroid Build Coastguard Worker mvn r1, r1 103*344aa361SAndroid Build Coastguard Worker 104*344aa361SAndroid Build Coastguard Worker set_fault_handler .Lmmutest_fault 105*344aa361SAndroid Build Coastguard Worker streq r1, [r0] 106*344aa361SAndroid Build Coastguard Worker 107*344aa361SAndroid Build Coastguard Worker set_fault_handler .Lmmutest_fault 108*344aa361SAndroid Build Coastguard Worker strtne r1, [r0] 109*344aa361SAndroid Build Coastguard Worker 110*344aa361SAndroid Build Coastguard Worker dmb 111*344aa361SAndroid Build Coastguard Worker 112*344aa361SAndroid Build Coastguard Worker ldr r2, [r0] 113*344aa361SAndroid Build Coastguard Worker cmp r1, r2 114*344aa361SAndroid Build Coastguard Worker movne r0, #1 115*344aa361SAndroid Build Coastguard Worker bxne lr 116*344aa361SAndroid Build Coastguard Worker 117*344aa361SAndroid Build Coastguard Worker push {r0, r1, r2, lr} 118*344aa361SAndroid Build Coastguard Worker mov r1, #4 119*344aa361SAndroid Build Coastguard Worker blx arch_clean_invalidate_cache_range 120*344aa361SAndroid Build Coastguard Worker pop {r0, r1, r2, lr} 121*344aa361SAndroid Build Coastguard Worker 122*344aa361SAndroid Build Coastguard Worker ldr r2, [r0] 123*344aa361SAndroid Build Coastguard Worker cmp r1, r2 124*344aa361SAndroid Build Coastguard Worker moveq r0, #0 125*344aa361SAndroid Build Coastguard Worker movne r0, #2 126*344aa361SAndroid Build Coastguard Worker 127*344aa361SAndroid Build Coastguard Worker bx lr 128*344aa361SAndroid Build Coastguard Worker 129*344aa361SAndroid Build Coastguard Worker/** 130*344aa361SAndroid Build Coastguard Worker * int mmutest_arch_nop(int ret) - Return ret 131*344aa361SAndroid Build Coastguard Worker * 132*344aa361SAndroid Build Coastguard Worker * Returns ret if run from executable page. 133*344aa361SAndroid Build Coastguard Worker * Does not return if run from non-executable page. 134*344aa361SAndroid Build Coastguard Worker */ 135*344aa361SAndroid Build Coastguard WorkerFUNCTION(mmutest_arch_nop) 136*344aa361SAndroid Build Coastguard Worker bx lr 137*344aa361SAndroid Build Coastguard WorkerFUNCTION(mmutest_arch_nop_end) 138*344aa361SAndroid Build Coastguard Worker 139*344aa361SAndroid Build Coastguard Worker.Lmmutest_setup_fault: 140*344aa361SAndroid Build Coastguard Worker mov r0, #ERR_GENERIC 141*344aa361SAndroid Build Coastguard Worker bx lr 142*344aa361SAndroid Build Coastguard Worker 143*344aa361SAndroid Build Coastguard Worker.Lmmutest_fault: 144*344aa361SAndroid Build Coastguard Worker mov r0, #ERR_FAULT 145*344aa361SAndroid Build Coastguard Worker bx lr 146