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/** 29*344aa361SAndroid Build Coastguard Worker * int mmutest_arch_rodata_pnx(void) - Test that rodata section is mapped pnx 30*344aa361SAndroid Build Coastguard Worker * 31*344aa361SAndroid Build Coastguard Worker * Returns ERR_FAULT if rodata is not executable. 32*344aa361SAndroid Build Coastguard Worker * Return 0 if rodata is executable. 33*344aa361SAndroid Build Coastguard Worker */ 34*344aa361SAndroid Build Coastguard Worker.section .rodata 35*344aa361SAndroid Build Coastguard Worker.align 2 36*344aa361SAndroid Build Coastguard Worker set_fault_handler .Lmmutest_fault 37*344aa361SAndroid Build Coastguard WorkerFUNCTION(mmutest_arch_rodata_pnx) 38*344aa361SAndroid Build Coastguard Worker mov x0, #0 39*344aa361SAndroid Build Coastguard Worker 40*344aa361SAndroid Build Coastguard Worker ret 41*344aa361SAndroid Build Coastguard Worker 42*344aa361SAndroid Build Coastguard Worker/** 43*344aa361SAndroid Build Coastguard Worker * int mmutest_arch_data_pnx(void) - Test that data section is mapped pnx 44*344aa361SAndroid Build Coastguard Worker * 45*344aa361SAndroid Build Coastguard Worker * Returns ERR_FAULT if data is not executable. 46*344aa361SAndroid Build Coastguard Worker * Return 0 if data is executable. 47*344aa361SAndroid Build Coastguard Worker */ 48*344aa361SAndroid Build Coastguard Worker.section .data 49*344aa361SAndroid Build Coastguard Worker.align 2 50*344aa361SAndroid Build Coastguard Worker set_fault_handler .Lmmutest_fault 51*344aa361SAndroid Build Coastguard WorkerFUNCTION(mmutest_arch_data_pnx) 52*344aa361SAndroid Build Coastguard Worker mov x0, #0 53*344aa361SAndroid Build Coastguard Worker 54*344aa361SAndroid Build Coastguard Worker ret 55*344aa361SAndroid Build Coastguard Worker.section .text 56*344aa361SAndroid Build Coastguard Worker 57*344aa361SAndroid Build Coastguard Worker/** 58*344aa361SAndroid Build Coastguard Worker * int mmutest_arch_rodata_ro(void) - Test that rodata section is mapped read-only 59*344aa361SAndroid Build Coastguard Worker * 60*344aa361SAndroid Build Coastguard Worker * Returns ERR_FAULT if rodata is not writable 61*344aa361SAndroid Build Coastguard Worker * Returns 1 if write to rodata is silently dropped 62*344aa361SAndroid Build Coastguard Worker * Returns 0 if rodata is writable 63*344aa361SAndroid Build Coastguard Worker */ 64*344aa361SAndroid Build Coastguard WorkerFUNCTION(mmutest_arch_rodata_ro) 65*344aa361SAndroid Build Coastguard Worker adrl x0, .Ltest_rodata_long 66*344aa361SAndroid Build Coastguard Worker 67*344aa361SAndroid Build Coastguard Worker set_fault_handler .Lmmutest_fault 68*344aa361SAndroid Build Coastguard Worker str wzr, [x0] 69*344aa361SAndroid Build Coastguard Worker 70*344aa361SAndroid Build Coastguard Worker ldr w0, [x0] 71*344aa361SAndroid Build Coastguard Worker ret 72*344aa361SAndroid Build Coastguard Worker 73*344aa361SAndroid Build Coastguard Worker.section .rodata 74*344aa361SAndroid Build Coastguard Worker.Ltest_rodata_long: 75*344aa361SAndroid Build Coastguard Worker .long 0x1 76*344aa361SAndroid Build Coastguard Worker 77*344aa361SAndroid Build Coastguard Worker.section .text 78*344aa361SAndroid Build Coastguard Worker 79*344aa361SAndroid Build Coastguard Worker/** 80*344aa361SAndroid Build Coastguard Worker * int mmutest_arch_store_uint32(uint32_t *ptr, bool user) - Test if ptr is writable 81*344aa361SAndroid Build Coastguard Worker * @ptr: Memory location to test 82*344aa361SAndroid Build Coastguard Worker * @user: Use unprivileged store 83*344aa361SAndroid Build Coastguard Worker * 84*344aa361SAndroid Build Coastguard Worker * Returns ERR_FAULT if ptr is not writable 85*344aa361SAndroid Build Coastguard Worker * Returns ERR_GENERIC if ptr is not readable 86*344aa361SAndroid Build Coastguard Worker * Returns 2 if write does not fault, but data is lost on readback from memory 87*344aa361SAndroid Build Coastguard Worker * Returns 1 if write does not fault, but data is lost on readback from cache 88*344aa361SAndroid Build Coastguard Worker * Returns 0 if ptr is writable 89*344aa361SAndroid Build Coastguard Worker */ 90*344aa361SAndroid Build Coastguard WorkerFUNCTION(mmutest_arch_store_uint32) 91*344aa361SAndroid Build Coastguard Worker cbnz x1, .Lmmutest_arch_store_uint32_user 92*344aa361SAndroid Build Coastguard Worker 93*344aa361SAndroid Build Coastguard Worker set_fault_handler .Lmmutest_setup_fault 94*344aa361SAndroid Build Coastguard Worker ldr w3, [x0] 95*344aa361SAndroid Build Coastguard Worker mvn w3, w3 96*344aa361SAndroid Build Coastguard Worker 97*344aa361SAndroid Build Coastguard Worker set_fault_handler .Lmmutest_fault 98*344aa361SAndroid Build Coastguard Worker str w3, [x0] 99*344aa361SAndroid Build Coastguard Worker dmb sy 100*344aa361SAndroid Build Coastguard Worker ldr w2, [x0] 101*344aa361SAndroid Build Coastguard Worker 102*344aa361SAndroid Build Coastguard Worker b .Lmmutest_arch_store_uint32_str_done 103*344aa361SAndroid Build Coastguard Worker 104*344aa361SAndroid Build Coastguard Worker.Lmmutest_arch_store_uint32_user: 105*344aa361SAndroid Build Coastguard Worker set_fault_handler .Lmmutest_setup_fault 106*344aa361SAndroid Build Coastguard Worker ldtr w3, [x0] 107*344aa361SAndroid Build Coastguard Worker mvn w3, w3 108*344aa361SAndroid Build Coastguard Worker 109*344aa361SAndroid Build Coastguard Worker set_fault_handler .Lmmutest_fault 110*344aa361SAndroid Build Coastguard Worker sttr w3, [x0] 111*344aa361SAndroid Build Coastguard Worker dmb sy 112*344aa361SAndroid Build Coastguard Worker ldtr w2, [x0] 113*344aa361SAndroid Build Coastguard Worker 114*344aa361SAndroid Build Coastguard Worker.Lmmutest_arch_store_uint32_str_done: 115*344aa361SAndroid Build Coastguard Worker 116*344aa361SAndroid Build Coastguard Worker cmp w3, w2 117*344aa361SAndroid Build Coastguard Worker bne .Lmmutest_arch_store_uint32_cache_read_mismatch 118*344aa361SAndroid Build Coastguard Worker 119*344aa361SAndroid Build Coastguard Worker push x0, x1 120*344aa361SAndroid Build Coastguard Worker push x3, x30 121*344aa361SAndroid Build Coastguard Worker mov x1, #4 122*344aa361SAndroid Build Coastguard Worker bl arch_clean_invalidate_cache_range 123*344aa361SAndroid Build Coastguard Worker pop x3, x30 124*344aa361SAndroid Build Coastguard Worker pop x0, x1 125*344aa361SAndroid Build Coastguard Worker 126*344aa361SAndroid Build Coastguard Worker cbnz x1, .Lmmutest_arch_store_uint32_memory_reload_user 127*344aa361SAndroid Build Coastguard Worker 128*344aa361SAndroid Build Coastguard Worker ldr w2, [x0] 129*344aa361SAndroid Build Coastguard Worker b .Lmmutest_arch_store_uint32_memory_reload_done 130*344aa361SAndroid Build Coastguard Worker 131*344aa361SAndroid Build Coastguard Worker.Lmmutest_arch_store_uint32_memory_reload_user: 132*344aa361SAndroid Build Coastguard Worker ldtr w2, [x0] 133*344aa361SAndroid Build Coastguard Worker 134*344aa361SAndroid Build Coastguard Worker.Lmmutest_arch_store_uint32_memory_reload_done: 135*344aa361SAndroid Build Coastguard Worker cmp w3, w2 136*344aa361SAndroid Build Coastguard Worker bne .Lmmutest_arch_store_uint32_memory_mismatch 137*344aa361SAndroid Build Coastguard Worker 138*344aa361SAndroid Build Coastguard Worker mov x0, xzr 139*344aa361SAndroid Build Coastguard Worker ret 140*344aa361SAndroid Build Coastguard Worker 141*344aa361SAndroid Build Coastguard Worker.Lmmutest_arch_store_uint32_cache_read_mismatch: 142*344aa361SAndroid Build Coastguard Worker mov x0, #1 143*344aa361SAndroid Build Coastguard Worker ret 144*344aa361SAndroid Build Coastguard Worker 145*344aa361SAndroid Build Coastguard Worker.Lmmutest_arch_store_uint32_memory_mismatch: 146*344aa361SAndroid Build Coastguard Worker mov x0, #2 147*344aa361SAndroid Build Coastguard Worker ret 148*344aa361SAndroid Build Coastguard Worker 149*344aa361SAndroid Build Coastguard Worker/** 150*344aa361SAndroid Build Coastguard Worker * int mmutest_arch_nop(int ret) - Return ret 151*344aa361SAndroid Build Coastguard Worker * 152*344aa361SAndroid Build Coastguard Worker * Returns ret if run from executable page. 153*344aa361SAndroid Build Coastguard Worker * Does not return if run from non-executable page. 154*344aa361SAndroid Build Coastguard Worker */ 155*344aa361SAndroid Build Coastguard WorkerFUNCTION(mmutest_arch_nop) 156*344aa361SAndroid Build Coastguard Worker ret 157*344aa361SAndroid Build Coastguard WorkerFUNCTION(mmutest_arch_nop_end) 158*344aa361SAndroid Build Coastguard Worker 159*344aa361SAndroid Build Coastguard Worker.Lmmutest_setup_fault: 160*344aa361SAndroid Build Coastguard Worker mov x0, #ERR_GENERIC 161*344aa361SAndroid Build Coastguard Worker ret 162*344aa361SAndroid Build Coastguard Worker 163*344aa361SAndroid Build Coastguard Worker.Lmmutest_fault: 164*344aa361SAndroid Build Coastguard Worker mov x0, #ERR_FAULT 165*344aa361SAndroid Build Coastguard Worker ret 166