xref: /freebsd/sys/cddl/dev/dtrace/arm/dtrace_asm.S (revision be9bc81174e748c3e7a6506d0e217af6ab506730)
1fcb56067SGeorge V. Neville-Neil/*
2fcb56067SGeorge V. Neville-Neil * CDDL HEADER START
3fcb56067SGeorge V. Neville-Neil *
4fcb56067SGeorge V. Neville-Neil * The contents of this file are subject to the terms of the
5fcb56067SGeorge V. Neville-Neil * Common Development and Distribution License, Version 1.0 only
6fcb56067SGeorge V. Neville-Neil * (the "License").  You may not use this file except in compliance
7fcb56067SGeorge V. Neville-Neil * with the License.
8fcb56067SGeorge V. Neville-Neil *
9fcb56067SGeorge V. Neville-Neil * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10fcb56067SGeorge V. Neville-Neil * or http://www.opensolaris.org/os/licensing.
11fcb56067SGeorge V. Neville-Neil * See the License for the specific language governing permissions
12fcb56067SGeorge V. Neville-Neil * and limitations under the License.
13fcb56067SGeorge V. Neville-Neil *
14fcb56067SGeorge V. Neville-Neil * When distributing Covered Code, include this CDDL HEADER in each
15fcb56067SGeorge V. Neville-Neil * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16fcb56067SGeorge V. Neville-Neil * If applicable, add the following below this CDDL HEADER, with the
17fcb56067SGeorge V. Neville-Neil * fields enclosed by brackets "[]" replaced with your own identifying
18fcb56067SGeorge V. Neville-Neil * information: Portions Copyright [yyyy] [name of copyright owner]
19fcb56067SGeorge V. Neville-Neil *
20fcb56067SGeorge V. Neville-Neil * CDDL HEADER END
21fcb56067SGeorge V. Neville-Neil *
22fcb56067SGeorge V. Neville-Neil * $FreeBSD$
23fcb56067SGeorge V. Neville-Neil */
24fcb56067SGeorge V. Neville-Neil/*
25fcb56067SGeorge V. Neville-Neil * Copyright 2004 Sun Microsystems, Inc.  All rights reserved.
26fcb56067SGeorge V. Neville-Neil * Use is subject to license terms.
27fcb56067SGeorge V. Neville-Neil */
28fcb56067SGeorge V. Neville-Neil
29fcb56067SGeorge V. Neville-Neil#define _ASM
30fcb56067SGeorge V. Neville-Neil#define _LOCORE
31fcb56067SGeorge V. Neville-Neil#define LOCORE
32fcb56067SGeorge V. Neville-Neil
33fcb56067SGeorge V. Neville-Neil#include <sys/cpuvar_defs.h>
34fcb56067SGeorge V. Neville-Neil#include <sys/dtrace.h>
35fcb56067SGeorge V. Neville-Neil
36fcb56067SGeorge V. Neville-Neil#include <machine/armreg.h>
37fcb56067SGeorge V. Neville-Neil#include <machine/asm.h>
38fcb56067SGeorge V. Neville-Neil
39fcb56067SGeorge V. Neville-Neil#include "assym.s"
40fcb56067SGeorge V. Neville-Neil
41fcb56067SGeorge V. Neville-Neil/*
42fcb56067SGeorge V. Neville-Neilvoid dtrace_membar_producer(void)
43fcb56067SGeorge V. Neville-Neil*/
44fcb56067SGeorge V. Neville-NeilENTRY(dtrace_membar_producer)
45fcb56067SGeorge V. Neville-Neil	RET
46fcb56067SGeorge V. Neville-NeilEND(dtrace_membar_producer)
47fcb56067SGeorge V. Neville-Neil
48fcb56067SGeorge V. Neville-Neil/*
49fcb56067SGeorge V. Neville-Neilvoid dtrace_membar_consumer(void)
50fcb56067SGeorge V. Neville-Neil*/
51fcb56067SGeorge V. Neville-NeilENTRY(dtrace_membar_consumer)
52fcb56067SGeorge V. Neville-Neil	RET
53fcb56067SGeorge V. Neville-NeilEND(dtrace_membar_consumer)
54fcb56067SGeorge V. Neville-Neil
55fcb56067SGeorge V. Neville-Neil/*
56fcb56067SGeorge V. Neville-Neildtrace_icookie_t dtrace_interrupt_disable(void)
57fcb56067SGeorge V. Neville-Neil*/
58fcb56067SGeorge V. Neville-NeilENTRY(dtrace_interrupt_disable)
59fcb56067SGeorge V. Neville-Neil	mrs	r0, cpsr
60fcb56067SGeorge V. Neville-Neil	mov	r1, r0
61fcb56067SGeorge V. Neville-Neil	orr	r1, r1, #(PSR_I | PSR_F)
62fcb56067SGeorge V. Neville-Neil	msr	cpsr_c, r1
63fcb56067SGeorge V. Neville-Neil	RET
64fcb56067SGeorge V. Neville-NeilEND(dtrace_interrupt_disable)
65fcb56067SGeorge V. Neville-Neil
66fcb56067SGeorge V. Neville-Neil/*
67fcb56067SGeorge V. Neville-Neilvoid dtrace_interrupt_enable(dtrace_icookie_t cookie)
68fcb56067SGeorge V. Neville-Neil*/
69fcb56067SGeorge V. Neville-NeilENTRY(dtrace_interrupt_enable)
70fcb56067SGeorge V. Neville-Neil	and	r0, r0, #(PSR_I | PSR_F)
71fcb56067SGeorge V. Neville-Neil	mrs	r1, cpsr
72fcb56067SGeorge V. Neville-Neil	bic	r1, r1, #(PSR_I | PSR_F)
73fcb56067SGeorge V. Neville-Neil	orr	r1, r1, r0
74fcb56067SGeorge V. Neville-Neil	msr	cpsr_c, r1
75fcb56067SGeorge V. Neville-Neil	RET
76fcb56067SGeorge V. Neville-NeilEND(dtrace_interrupt_enable)
77fcb56067SGeorge V. Neville-Neil/*
78fcb56067SGeorge V. Neville-Neiluint8_t
79fcb56067SGeorge V. Neville-Neildtrace_fuword8_nocheck(void *addr)
80fcb56067SGeorge V. Neville-Neil*/
81fcb56067SGeorge V. Neville-NeilENTRY(dtrace_fuword8_nocheck)
82fcb56067SGeorge V. Neville-Neil	ldrb	r3, [r0]
83fcb56067SGeorge V. Neville-Neil	mov 	r0, r3
84fcb56067SGeorge V. Neville-Neil	RET
85fcb56067SGeorge V. Neville-NeilEND(dtrace_fuword8_nocheck)
86fcb56067SGeorge V. Neville-Neil
87fcb56067SGeorge V. Neville-Neil/*
88fcb56067SGeorge V. Neville-Neiluint16_t
89fcb56067SGeorge V. Neville-Neildtrace_fuword16_nocheck(void *addr)
90fcb56067SGeorge V. Neville-Neil*/
91fcb56067SGeorge V. Neville-NeilENTRY(dtrace_fuword16_nocheck)
92fcb56067SGeorge V. Neville-Neil	ldrh	r3, [r0]
93fcb56067SGeorge V. Neville-Neil	mov 	r0, r3
94fcb56067SGeorge V. Neville-Neil	RET
95fcb56067SGeorge V. Neville-NeilEND(dtrace_fuword16_nocheck)
96fcb56067SGeorge V. Neville-Neil
97fcb56067SGeorge V. Neville-Neil/*
98fcb56067SGeorge V. Neville-Neiluint32_t
99fcb56067SGeorge V. Neville-Neildtrace_fuword32_nocheck(void *addr)
100fcb56067SGeorge V. Neville-Neil*/
101fcb56067SGeorge V. Neville-NeilENTRY(dtrace_fuword32_nocheck)
102fcb56067SGeorge V. Neville-Neil	ldr	r3, [r0]
103fcb56067SGeorge V. Neville-Neil	mov 	r0, r3
104fcb56067SGeorge V. Neville-Neil	RET
105fcb56067SGeorge V. Neville-NeilEND(dtrace_fuword32_nocheck)
106fcb56067SGeorge V. Neville-Neil
107fcb56067SGeorge V. Neville-Neil/*
108fcb56067SGeorge V. Neville-Neiluint64_t
109fcb56067SGeorge V. Neville-Neildtrace_fuword64_nocheck(void *addr)
110fcb56067SGeorge V. Neville-Neil*/
111fcb56067SGeorge V. Neville-NeilENTRY(dtrace_fuword64_nocheck)
112fcb56067SGeorge V. Neville-Neil	ldm	r0, {r2, r3}
113fcb56067SGeorge V. Neville-Neil
114fcb56067SGeorge V. Neville-Neil	mov	r0, r2
115fcb56067SGeorge V. Neville-Neil	mov	r1, r3
116fcb56067SGeorge V. Neville-Neil#if defined(__BIG_ENDIAN__)
117fcb56067SGeorge V. Neville-Neil/* big endian */
118fcb56067SGeorge V. Neville-Neil	mov	r0, r3
119fcb56067SGeorge V. Neville-Neil	mov	r1, r2
120fcb56067SGeorge V. Neville-Neil#else
121fcb56067SGeorge V. Neville-Neil/* little endian */
122fcb56067SGeorge V. Neville-Neil	mov	r0, r2
123fcb56067SGeorge V. Neville-Neil	mov	r1, r3
124fcb56067SGeorge V. Neville-Neil
125fcb56067SGeorge V. Neville-Neil#endif
126fcb56067SGeorge V. Neville-Neil	RET
127fcb56067SGeorge V. Neville-NeilEND(dtrace_fuword64_nocheck)
128fcb56067SGeorge V. Neville-Neil
129fcb56067SGeorge V. Neville-Neil/*
130fcb56067SGeorge V. Neville-Neilvoid
131fcb56067SGeorge V. Neville-Neildtrace_copy(uintptr_t uaddr, uintptr_t kaddr, size_t size)
132fcb56067SGeorge V. Neville-Neil*/
133fcb56067SGeorge V. Neville-NeilENTRY(dtrace_copy)
134fcb56067SGeorge V. Neville-Neil	stmfd	sp!, {r4-r5}			/* stack is 8 byte aligned */
135fcb56067SGeorge V. Neville-Neil	teq	r2, #0x00000000
136fcb56067SGeorge V. Neville-Neil	mov	r5, #0x00000000
137fcb56067SGeorge V. Neville-Neil	beq	2f
138fcb56067SGeorge V. Neville-Neil
139fcb56067SGeorge V. Neville-Neil1:	ldrb	r4, [r0], #0x0001
140fcb56067SGeorge V. Neville-Neil	add	r5, r5, #0x00000001
141fcb56067SGeorge V. Neville-Neil	strb	r4, [r1], #0x0001
142fcb56067SGeorge V. Neville-Neil	teqne	r5, r2
143fcb56067SGeorge V. Neville-Neil	bne	1b
144fcb56067SGeorge V. Neville-Neil
145fcb56067SGeorge V. Neville-Neil2:	ldmfd	sp!, {r4-r5}			/* stack is 8 byte aligned */
146fcb56067SGeorge V. Neville-Neil	RET
147fcb56067SGeorge V. Neville-NeilEND(dtrace_copy)
148fcb56067SGeorge V. Neville-Neil
149fcb56067SGeorge V. Neville-Neil/*
150fcb56067SGeorge V. Neville-Neilvoid
151fcb56067SGeorge V. Neville-Neildtrace_copystr(uintptr_t uaddr, uintptr_t kaddr, size_t size,
152fcb56067SGeorge V. Neville-Neil    volatile uint16_t *flags)
153fcb56067SGeorge V. Neville-NeilXXX: Check for flags?
154fcb56067SGeorge V. Neville-Neil*/
155fcb56067SGeorge V. Neville-NeilENTRY(dtrace_copystr)
156fcb56067SGeorge V. Neville-Neil	stmfd	sp!, {r4-r5}			/* stack is 8 byte aligned */
157fcb56067SGeorge V. Neville-Neil	teq	r2, #0x00000000
158fcb56067SGeorge V. Neville-Neil	mov	r5, #0x00000000
159fcb56067SGeorge V. Neville-Neil	beq	2f
160fcb56067SGeorge V. Neville-Neil
161fcb56067SGeorge V. Neville-Neil1:	ldrb	r4, [r0], #0x0001
162fcb56067SGeorge V. Neville-Neil	add	r5, r5, #0x00000001
163fcb56067SGeorge V. Neville-Neil	teq	r4, #0x00000000
164fcb56067SGeorge V. Neville-Neil	strb	r4, [r1], #0x0001
165fcb56067SGeorge V. Neville-Neil	teqne	r5, r2
166fcb56067SGeorge V. Neville-Neil	bne	1b
167fcb56067SGeorge V. Neville-Neil
168fcb56067SGeorge V. Neville-Neil2:	ldmfd	sp!, {r4-r5}			/* stack is 8 byte aligned */
169fcb56067SGeorge V. Neville-Neil	RET
170fcb56067SGeorge V. Neville-NeilEND(dtrace_copystr)
171fcb56067SGeorge V. Neville-Neil
172fcb56067SGeorge V. Neville-Neil/*
173fcb56067SGeorge V. Neville-Neilvoid
174fcb56067SGeorge V. Neville-Neilvpanic(const char *format, va_list alist)
175fcb56067SGeorge V. Neville-Neil*/
176fcb56067SGeorge V. Neville-NeilENTRY(vpanic)				/* Initial stack layout: */
177fcb56067SGeorge V. Neville-Neilvpanic_common:
178fcb56067SGeorge V. Neville-Neil	RET
179fcb56067SGeorge V. Neville-NeilEND(vpanic)
180fcb56067SGeorge V. Neville-Neil
181fcb56067SGeorge V. Neville-Neil/*
182fcb56067SGeorge V. Neville-Neilvoid
183fcb56067SGeorge V. Neville-Neildtrace_vpanic(const char *format, va_list alist)
184fcb56067SGeorge V. Neville-Neil*/
185fcb56067SGeorge V. Neville-NeilENTRY(dtrace_vpanic)			/* Initial stack layout: */
186fcb56067SGeorge V. Neville-Neil	b	vpanic
187fcb56067SGeorge V. Neville-Neil	RET
188fcb56067SGeorge V. Neville-NeilEND(dtrace_vpanic)			/* Initial stack layout: */
189fcb56067SGeorge V. Neville-Neil
190fcb56067SGeorge V. Neville-Neil/*
191fcb56067SGeorge V. Neville-Neiluintptr_t
192fcb56067SGeorge V. Neville-Neildtrace_caller(int aframes)
193fcb56067SGeorge V. Neville-Neil*/
194fcb56067SGeorge V. Neville-NeilENTRY(dtrace_caller)
195fcb56067SGeorge V. Neville-Neil	mov	r0, #-1
196fcb56067SGeorge V. Neville-Neil	RET
197fcb56067SGeorge V. Neville-NeilEND(dtrace_caller)
1982b6af94bSAndrew Turner
1992b6af94bSAndrew Turner/*
2002b6af94bSAndrew Turneruint32_t
2012b6af94bSAndrew Turnerdtrace_cas32(uint32_t *target, uint32_t cmp, uint32_t new)
2022b6af94bSAndrew Turner
2032b6af94bSAndrew Turnervoid *
2042b6af94bSAndrew Turnerdtrace_casptr(volatile void *target, volatile void *cmp, volatile void *new)
2052b6af94bSAndrew Turner*/
2062b6af94bSAndrew TurnerENTRY(dtrace_cas32)
2072b6af94bSAndrew TurnerEENTRY(dtrace_casptr)
2082b6af94bSAndrew Turner1:	ldrex	r3, [r0]	/* Load target */
2092b6af94bSAndrew Turner	cmp	r3, r1		/* Check if *target == cmp */
2102b6af94bSAndrew Turner	bne	2f		/* No, return */
211*be9bc811SAndrew Turner	strex	ip, r2, [r0]	/* Store new to target */
212*be9bc811SAndrew Turner	cmp	ip, #0		/* Did the store succeed? */
2132b6af94bSAndrew Turner	bne	1b		/* No, try again */
214*be9bc811SAndrew Turner2:	mov	r0, r3		/* Return the value loaded from target */
2152b6af94bSAndrew Turner	RET
2162b6af94bSAndrew TurnerEEND(dtrace_casptr)
2172b6af94bSAndrew TurnerEND(dtrace_cas32)
218