xref: /freebsd/sys/cddl/dev/dtrace/aarch64/dtrace_asm.S (revision c2e0d56f5e493a8514324fd5e062ddc99a68b599)
1b78ee15eSRuslan Bukin/*
2b78ee15eSRuslan Bukin * CDDL HEADER START
3b78ee15eSRuslan Bukin *
4b78ee15eSRuslan Bukin * The contents of this file are subject to the terms of the
5b78ee15eSRuslan Bukin * Common Development and Distribution License, Version 1.0 only
6b78ee15eSRuslan Bukin * (the "License").  You may not use this file except in compliance
7b78ee15eSRuslan Bukin * with the License.
8b78ee15eSRuslan Bukin *
9b78ee15eSRuslan Bukin * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10b78ee15eSRuslan Bukin * or http://www.opensolaris.org/os/licensing.
11b78ee15eSRuslan Bukin * See the License for the specific language governing permissions
12b78ee15eSRuslan Bukin * and limitations under the License.
13b78ee15eSRuslan Bukin *
14b78ee15eSRuslan Bukin * When distributing Covered Code, include this CDDL HEADER in each
15b78ee15eSRuslan Bukin * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16b78ee15eSRuslan Bukin * If applicable, add the following below this CDDL HEADER, with the
17b78ee15eSRuslan Bukin * fields enclosed by brackets "[]" replaced with your own identifying
18b78ee15eSRuslan Bukin * information: Portions Copyright [yyyy] [name of copyright owner]
19b78ee15eSRuslan Bukin *
20b78ee15eSRuslan Bukin * CDDL HEADER END
21b78ee15eSRuslan Bukin */
22b78ee15eSRuslan Bukin/*
23b78ee15eSRuslan Bukin * Copyright 2004 Sun Microsystems, Inc.  All rights reserved.
24b78ee15eSRuslan Bukin * Use is subject to license terms.
25b78ee15eSRuslan Bukin */
26b78ee15eSRuslan Bukin
27b78ee15eSRuslan Bukin#define _ASM
28b78ee15eSRuslan Bukin#define _LOCORE
29b78ee15eSRuslan Bukin
30b78ee15eSRuslan Bukin#include <sys/cpuvar_defs.h>
31b78ee15eSRuslan Bukin#include <sys/dtrace.h>
32*c2e0d56fSAndrew Turner#include <sys/elf_common.h>
33b78ee15eSRuslan Bukin
34b78ee15eSRuslan Bukin#include <machine/armreg.h>
35b78ee15eSRuslan Bukin#include <machine/asm.h>
36b78ee15eSRuslan Bukin
37fc2a8776SEd Maste#include "assym.inc"
38b78ee15eSRuslan Bukin
39b78ee15eSRuslan Bukin/*
40b78ee15eSRuslan Bukinvoid dtrace_membar_producer(void)
41b78ee15eSRuslan Bukin*/
42b78ee15eSRuslan BukinENTRY(dtrace_membar_producer)
43b78ee15eSRuslan Bukin	RET
44b78ee15eSRuslan BukinEND(dtrace_membar_producer)
45b78ee15eSRuslan Bukin
46b78ee15eSRuslan Bukin/*
47b78ee15eSRuslan Bukinvoid dtrace_membar_consumer(void)
48b78ee15eSRuslan Bukin*/
49b78ee15eSRuslan BukinENTRY(dtrace_membar_consumer)
50b78ee15eSRuslan Bukin	RET
51b78ee15eSRuslan BukinEND(dtrace_membar_consumer)
52b78ee15eSRuslan Bukin
53b78ee15eSRuslan Bukin/*
54b78ee15eSRuslan Bukindtrace_icookie_t dtrace_interrupt_disable(void)
55b78ee15eSRuslan Bukin*/
56b78ee15eSRuslan BukinENTRY(dtrace_interrupt_disable)
5712aac6b5SAndrew Turner	mrs	x0, daif
58b78ee15eSRuslan Bukin	msr	daifset, #2
59b78ee15eSRuslan Bukin	RET
60b78ee15eSRuslan BukinEND(dtrace_interrupt_disable)
61b78ee15eSRuslan Bukin
62b78ee15eSRuslan Bukin/*
63b78ee15eSRuslan Bukinvoid dtrace_interrupt_enable(dtrace_icookie_t cookie)
64b78ee15eSRuslan Bukin*/
65b78ee15eSRuslan BukinENTRY(dtrace_interrupt_enable)
6612aac6b5SAndrew Turner	msr	daif, x0
67b78ee15eSRuslan Bukin	RET
68b78ee15eSRuslan BukinEND(dtrace_interrupt_enable)
69b78ee15eSRuslan Bukin/*
70b78ee15eSRuslan Bukinuint8_t
71b78ee15eSRuslan Bukindtrace_fuword8_nocheck(void *addr)
72b78ee15eSRuslan Bukin*/
73b78ee15eSRuslan BukinENTRY(dtrace_fuword8_nocheck)
746281147aSMark Johnston	ldtrb	w0, [x0]
75b78ee15eSRuslan Bukin	RET
76b78ee15eSRuslan BukinEND(dtrace_fuword8_nocheck)
77b78ee15eSRuslan Bukin
78b78ee15eSRuslan Bukin/*
79b78ee15eSRuslan Bukinuint16_t
80b78ee15eSRuslan Bukindtrace_fuword16_nocheck(void *addr)
81b78ee15eSRuslan Bukin*/
82b78ee15eSRuslan BukinENTRY(dtrace_fuword16_nocheck)
836281147aSMark Johnston	ldtrh	w0, [x0]
84b78ee15eSRuslan Bukin	RET
85b78ee15eSRuslan BukinEND(dtrace_fuword16_nocheck)
86b78ee15eSRuslan Bukin
87b78ee15eSRuslan Bukin/*
88b78ee15eSRuslan Bukinuint32_t
89b78ee15eSRuslan Bukindtrace_fuword32_nocheck(void *addr)
90b78ee15eSRuslan Bukin*/
91b78ee15eSRuslan BukinENTRY(dtrace_fuword32_nocheck)
926281147aSMark Johnston	ldtr	w0, [x0]
93b78ee15eSRuslan Bukin	RET
94b78ee15eSRuslan BukinEND(dtrace_fuword32_nocheck)
95b78ee15eSRuslan Bukin
96b78ee15eSRuslan Bukin/*
97b78ee15eSRuslan Bukinuint64_t
98b78ee15eSRuslan Bukindtrace_fuword64_nocheck(void *addr)
99b78ee15eSRuslan Bukin*/
100b78ee15eSRuslan BukinENTRY(dtrace_fuword64_nocheck)
1016281147aSMark Johnston	ldtr	x0, [x0]
102b78ee15eSRuslan Bukin	RET
103b78ee15eSRuslan BukinEND(dtrace_fuword64_nocheck)
104b78ee15eSRuslan Bukin
105b78ee15eSRuslan Bukin/*
106b78ee15eSRuslan Bukinvoid
107b78ee15eSRuslan Bukindtrace_copy(uintptr_t uaddr, uintptr_t kaddr, size_t size)
108b78ee15eSRuslan Bukin*/
109b78ee15eSRuslan BukinENTRY(dtrace_copy)
110b78ee15eSRuslan Bukin	cbz	x2, 2f		/* If len == 0 then skip loop */
111b78ee15eSRuslan Bukin1:
1126281147aSMark Johnston	ldtrb	w4, [x0]	/* Load from uaddr */
1136281147aSMark Johnston	add	x0, x0, #1
114b78ee15eSRuslan Bukin	strb	w4, [x1], #1	/* Store in kaddr */
115b78ee15eSRuslan Bukin	sub	x2, x2, #1	/* len-- */
116b78ee15eSRuslan Bukin	cbnz	x2, 1b
117b78ee15eSRuslan Bukin2:
118b78ee15eSRuslan Bukin	RET
119b78ee15eSRuslan BukinEND(dtrace_copy)
120b78ee15eSRuslan Bukin
121b78ee15eSRuslan Bukin/*
122b78ee15eSRuslan Bukinvoid
123b78ee15eSRuslan Bukindtrace_copystr(uintptr_t uaddr, uintptr_t kaddr, size_t size,
124b78ee15eSRuslan Bukin    volatile uint16_t *flags)
125b78ee15eSRuslan BukinXXX: Check for flags?
126b78ee15eSRuslan Bukin*/
127b78ee15eSRuslan BukinENTRY(dtrace_copystr)
128b78ee15eSRuslan Bukin	cbz     x2, 2f          /* If len == 0 then skip loop */
1296281147aSMark Johnston1:
1306281147aSMark Johnston	ldtrb	w4, [x0]	/* Load from uaddr */
1316281147aSMark Johnston	add	x0, x0, #1
132b78ee15eSRuslan Bukin	strb    w4, [x1], #1    /* Store in kaddr */
133b78ee15eSRuslan Bukin	cbz     w4, 2f          /* If == 0 then break */
134b78ee15eSRuslan Bukin	sub     x2, x2, #1      /* len-- */
135b78ee15eSRuslan Bukin	cbnz    x2, 1b
136b78ee15eSRuslan Bukin2:
137b78ee15eSRuslan Bukin	RET
138b78ee15eSRuslan BukinEND(dtrace_copystr)
139b78ee15eSRuslan Bukin
140b78ee15eSRuslan Bukin/*
141b78ee15eSRuslan Bukinuintptr_t
142b78ee15eSRuslan Bukindtrace_caller(int aframes)
143b78ee15eSRuslan Bukin*/
144b78ee15eSRuslan BukinENTRY(dtrace_caller)
145b78ee15eSRuslan Bukin	mov	x0, #-1
146b78ee15eSRuslan Bukin	RET
147b78ee15eSRuslan BukinEND(dtrace_caller)
148b78ee15eSRuslan Bukin
149b78ee15eSRuslan Bukin/*
150b78ee15eSRuslan Bukinuint32_t
151b78ee15eSRuslan Bukindtrace_cas32(uint32_t *target, uint32_t cmp, uint32_t new)
152b78ee15eSRuslan Bukin*/
153b78ee15eSRuslan BukinENTRY(dtrace_cas32)
154b78ee15eSRuslan Bukin1:	ldxr	w3, [x0]	/* Load target */
155b78ee15eSRuslan Bukin	cmp	w3, w1		/* Check if *target == cmp */
156b78ee15eSRuslan Bukin	bne	2f		/* No, return */
157b78ee15eSRuslan Bukin	stxr	w12, w2, [x0]	/* Store new to target */
158b78ee15eSRuslan Bukin	cbnz	w12, 1b		/* Try again if store not succeed */
159b78ee15eSRuslan Bukin2:	mov	w0, w3		/* Return the value loaded from target */
160b78ee15eSRuslan Bukin	RET
161b78ee15eSRuslan BukinEND(dtrace_cas32)
162b78ee15eSRuslan Bukin
163b78ee15eSRuslan Bukin/*
164b78ee15eSRuslan Bukinvoid *
165b78ee15eSRuslan Bukindtrace_casptr(volatile void *target, volatile void *cmp, volatile void *new)
166b78ee15eSRuslan Bukin*/
167b78ee15eSRuslan BukinENTRY(dtrace_casptr)
168b78ee15eSRuslan Bukin1:	ldxr	x3, [x0]	/* Load target */
169b78ee15eSRuslan Bukin	cmp	x3, x1		/* Check if *target == cmp */
170b78ee15eSRuslan Bukin	bne	2f		/* No, return */
171b78ee15eSRuslan Bukin	stxr	w12, x2, [x0]	/* Store new to target */
172b78ee15eSRuslan Bukin	cbnz	w12, 1b		/* Try again if store not succeed */
173b78ee15eSRuslan Bukin2:	mov	x0, x3		/* Return the value loaded from target */
174b78ee15eSRuslan Bukin	RET
175b78ee15eSRuslan BukinEND(dtrace_casptr)
176*c2e0d56fSAndrew Turner
177*c2e0d56fSAndrew TurnerGNU_PROPERTY_AARCH64_FEATURE_1_NOTE(GNU_PROPERTY_AARCH64_FEATURE_1_VAL)
178