xref: /aosp_15_r20/trusty/kernel/lib/mmutest/mmutest_arm.S (revision 344aa361028b423587d4ef3fa52a23d194628137)
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