xref: /freebsd/sys/cddl/dev/dtrace/aarch64/dtrace_asm.S (revision 6281147a963b02bb5d7b4db15ee295d6d65d0fff)
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 * $FreeBSD$
23b78ee15eSRuslan Bukin */
24b78ee15eSRuslan Bukin/*
25b78ee15eSRuslan Bukin * Copyright 2004 Sun Microsystems, Inc.  All rights reserved.
26b78ee15eSRuslan Bukin * Use is subject to license terms.
27b78ee15eSRuslan Bukin */
28b78ee15eSRuslan Bukin
29b78ee15eSRuslan Bukin#define _ASM
30b78ee15eSRuslan Bukin#define _LOCORE
31b78ee15eSRuslan Bukin
32b78ee15eSRuslan Bukin#include <sys/cpuvar_defs.h>
33b78ee15eSRuslan Bukin#include <sys/dtrace.h>
34b78ee15eSRuslan Bukin
35b78ee15eSRuslan Bukin#include <machine/armreg.h>
36b78ee15eSRuslan Bukin#include <machine/asm.h>
37b78ee15eSRuslan Bukin
38fc2a8776SEd Maste#include "assym.inc"
39b78ee15eSRuslan Bukin
40b78ee15eSRuslan Bukin/*
41b78ee15eSRuslan Bukinvoid dtrace_membar_producer(void)
42b78ee15eSRuslan Bukin*/
43b78ee15eSRuslan BukinENTRY(dtrace_membar_producer)
44b78ee15eSRuslan Bukin	RET
45b78ee15eSRuslan BukinEND(dtrace_membar_producer)
46b78ee15eSRuslan Bukin
47b78ee15eSRuslan Bukin/*
48b78ee15eSRuslan Bukinvoid dtrace_membar_consumer(void)
49b78ee15eSRuslan Bukin*/
50b78ee15eSRuslan BukinENTRY(dtrace_membar_consumer)
51b78ee15eSRuslan Bukin	RET
52b78ee15eSRuslan BukinEND(dtrace_membar_consumer)
53b78ee15eSRuslan Bukin
54b78ee15eSRuslan Bukin/*
55b78ee15eSRuslan Bukindtrace_icookie_t dtrace_interrupt_disable(void)
56b78ee15eSRuslan Bukin*/
57b78ee15eSRuslan BukinENTRY(dtrace_interrupt_disable)
5812aac6b5SAndrew Turner	mrs	x0, daif
59b78ee15eSRuslan Bukin	msr	daifset, #2
60b78ee15eSRuslan Bukin	RET
61b78ee15eSRuslan BukinEND(dtrace_interrupt_disable)
62b78ee15eSRuslan Bukin
63b78ee15eSRuslan Bukin/*
64b78ee15eSRuslan Bukinvoid dtrace_interrupt_enable(dtrace_icookie_t cookie)
65b78ee15eSRuslan Bukin*/
66b78ee15eSRuslan BukinENTRY(dtrace_interrupt_enable)
6712aac6b5SAndrew Turner	msr	daif, x0
68b78ee15eSRuslan Bukin	RET
69b78ee15eSRuslan BukinEND(dtrace_interrupt_enable)
70b78ee15eSRuslan Bukin/*
71b78ee15eSRuslan Bukinuint8_t
72b78ee15eSRuslan Bukindtrace_fuword8_nocheck(void *addr)
73b78ee15eSRuslan Bukin*/
74b78ee15eSRuslan BukinENTRY(dtrace_fuword8_nocheck)
75*6281147aSMark Johnston	ldtrb	w0, [x0]
76b78ee15eSRuslan Bukin	RET
77b78ee15eSRuslan BukinEND(dtrace_fuword8_nocheck)
78b78ee15eSRuslan Bukin
79b78ee15eSRuslan Bukin/*
80b78ee15eSRuslan Bukinuint16_t
81b78ee15eSRuslan Bukindtrace_fuword16_nocheck(void *addr)
82b78ee15eSRuslan Bukin*/
83b78ee15eSRuslan BukinENTRY(dtrace_fuword16_nocheck)
84*6281147aSMark Johnston	ldtrh	w0, [x0]
85b78ee15eSRuslan Bukin	RET
86b78ee15eSRuslan BukinEND(dtrace_fuword16_nocheck)
87b78ee15eSRuslan Bukin
88b78ee15eSRuslan Bukin/*
89b78ee15eSRuslan Bukinuint32_t
90b78ee15eSRuslan Bukindtrace_fuword32_nocheck(void *addr)
91b78ee15eSRuslan Bukin*/
92b78ee15eSRuslan BukinENTRY(dtrace_fuword32_nocheck)
93*6281147aSMark Johnston	ldtr	w0, [x0]
94b78ee15eSRuslan Bukin	RET
95b78ee15eSRuslan BukinEND(dtrace_fuword32_nocheck)
96b78ee15eSRuslan Bukin
97b78ee15eSRuslan Bukin/*
98b78ee15eSRuslan Bukinuint64_t
99b78ee15eSRuslan Bukindtrace_fuword64_nocheck(void *addr)
100b78ee15eSRuslan Bukin*/
101b78ee15eSRuslan BukinENTRY(dtrace_fuword64_nocheck)
102*6281147aSMark Johnston	ldtr	x0, [x0]
103b78ee15eSRuslan Bukin	RET
104b78ee15eSRuslan BukinEND(dtrace_fuword64_nocheck)
105b78ee15eSRuslan Bukin
106b78ee15eSRuslan Bukin/*
107b78ee15eSRuslan Bukinvoid
108b78ee15eSRuslan Bukindtrace_copy(uintptr_t uaddr, uintptr_t kaddr, size_t size)
109b78ee15eSRuslan Bukin*/
110b78ee15eSRuslan BukinENTRY(dtrace_copy)
111b78ee15eSRuslan Bukin	cbz	x2, 2f		/* If len == 0 then skip loop */
112b78ee15eSRuslan Bukin1:
113*6281147aSMark Johnston	ldtrb	w4, [x0]	/* Load from uaddr */
114*6281147aSMark Johnston	add	x0, x0, #1
115b78ee15eSRuslan Bukin	strb	w4, [x1], #1	/* Store in kaddr */
116b78ee15eSRuslan Bukin	sub	x2, x2, #1	/* len-- */
117b78ee15eSRuslan Bukin	cbnz	x2, 1b
118b78ee15eSRuslan Bukin2:
119b78ee15eSRuslan Bukin	RET
120b78ee15eSRuslan BukinEND(dtrace_copy)
121b78ee15eSRuslan Bukin
122b78ee15eSRuslan Bukin/*
123b78ee15eSRuslan Bukinvoid
124b78ee15eSRuslan Bukindtrace_copystr(uintptr_t uaddr, uintptr_t kaddr, size_t size,
125b78ee15eSRuslan Bukin    volatile uint16_t *flags)
126b78ee15eSRuslan BukinXXX: Check for flags?
127b78ee15eSRuslan Bukin*/
128b78ee15eSRuslan BukinENTRY(dtrace_copystr)
129b78ee15eSRuslan Bukin	cbz     x2, 2f          /* If len == 0 then skip loop */
130*6281147aSMark Johnston1:
131*6281147aSMark Johnston	ldtrb	w4, [x0]	/* Load from uaddr */
132*6281147aSMark Johnston	add	x0, x0, #1
133b78ee15eSRuslan Bukin	strb    w4, [x1], #1    /* Store in kaddr */
134b78ee15eSRuslan Bukin	cbz     w4, 2f          /* If == 0 then break */
135b78ee15eSRuslan Bukin	sub     x2, x2, #1      /* len-- */
136b78ee15eSRuslan Bukin	cbnz    x2, 1b
137b78ee15eSRuslan Bukin2:
138b78ee15eSRuslan Bukin	RET
139b78ee15eSRuslan BukinEND(dtrace_copystr)
140b78ee15eSRuslan Bukin
141b78ee15eSRuslan Bukin/*
142b78ee15eSRuslan Bukinuintptr_t
143b78ee15eSRuslan Bukindtrace_caller(int aframes)
144b78ee15eSRuslan Bukin*/
145b78ee15eSRuslan BukinENTRY(dtrace_caller)
146b78ee15eSRuslan Bukin	mov	x0, #-1
147b78ee15eSRuslan Bukin	RET
148b78ee15eSRuslan BukinEND(dtrace_caller)
149b78ee15eSRuslan Bukin
150b78ee15eSRuslan Bukin/*
151b78ee15eSRuslan Bukinuint32_t
152b78ee15eSRuslan Bukindtrace_cas32(uint32_t *target, uint32_t cmp, uint32_t new)
153b78ee15eSRuslan Bukin*/
154b78ee15eSRuslan BukinENTRY(dtrace_cas32)
155b78ee15eSRuslan Bukin1:	ldxr	w3, [x0]	/* Load target */
156b78ee15eSRuslan Bukin	cmp	w3, w1		/* Check if *target == cmp */
157b78ee15eSRuslan Bukin	bne	2f		/* No, return */
158b78ee15eSRuslan Bukin	stxr	w12, w2, [x0]	/* Store new to target */
159b78ee15eSRuslan Bukin	cbnz	w12, 1b		/* Try again if store not succeed */
160b78ee15eSRuslan Bukin2:	mov	w0, w3		/* Return the value loaded from target */
161b78ee15eSRuslan Bukin	RET
162b78ee15eSRuslan BukinEND(dtrace_cas32)
163b78ee15eSRuslan Bukin
164b78ee15eSRuslan Bukin/*
165b78ee15eSRuslan Bukinvoid *
166b78ee15eSRuslan Bukindtrace_casptr(volatile void *target, volatile void *cmp, volatile void *new)
167b78ee15eSRuslan Bukin*/
168b78ee15eSRuslan BukinENTRY(dtrace_casptr)
169b78ee15eSRuslan Bukin1:	ldxr	x3, [x0]	/* Load target */
170b78ee15eSRuslan Bukin	cmp	x3, x1		/* Check if *target == cmp */
171b78ee15eSRuslan Bukin	bne	2f		/* No, return */
172b78ee15eSRuslan Bukin	stxr	w12, x2, [x0]	/* Store new to target */
173b78ee15eSRuslan Bukin	cbnz	w12, 1b		/* Try again if store not succeed */
174b78ee15eSRuslan Bukin2:	mov	x0, x3		/* Return the value loaded from target */
175b78ee15eSRuslan Bukin	RET
176b78ee15eSRuslan BukinEND(dtrace_casptr)
177