xref: /aosp_15_r20/trusty/kernel/lib/mmutest/mmutest_arm64.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/**
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