xref: /freebsd/sys/cddl/dev/dtrace/arm/dtrace_asm.S (revision 95ee2897e98f5d444f26ed2334cc7c439f9c16c6)
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/*
23fcb56067SGeorge V. Neville-Neil * Copyright 2004 Sun Microsystems, Inc.  All rights reserved.
24fcb56067SGeorge V. Neville-Neil * Use is subject to license terms.
25fcb56067SGeorge V. Neville-Neil */
26fcb56067SGeorge V. Neville-Neil
27fcb56067SGeorge V. Neville-Neil#define _ASM
28fcb56067SGeorge V. Neville-Neil#define _LOCORE
29fcb56067SGeorge V. Neville-Neil
30fcb56067SGeorge V. Neville-Neil#include <sys/cpuvar_defs.h>
31fcb56067SGeorge V. Neville-Neil#include <sys/dtrace.h>
32fcb56067SGeorge V. Neville-Neil
33fcb56067SGeorge V. Neville-Neil#include <machine/asm.h>
34d30e3084SOleksandr Tymoshenko#include <machine/armreg.h>
35fcb56067SGeorge V. Neville-Neil
36*fc2a8776SEd Maste#include "assym.inc"
37fcb56067SGeorge V. Neville-Neil
38fcb56067SGeorge V. Neville-Neil/*
39fcb56067SGeorge V. Neville-Neilvoid dtrace_membar_producer(void)
40fcb56067SGeorge V. Neville-Neil*/
41fcb56067SGeorge V. Neville-NeilENTRY(dtrace_membar_producer)
42fcb56067SGeorge V. Neville-Neil	RET
43fcb56067SGeorge V. Neville-NeilEND(dtrace_membar_producer)
44fcb56067SGeorge V. Neville-Neil
45fcb56067SGeorge V. Neville-Neil/*
46fcb56067SGeorge V. Neville-Neilvoid dtrace_membar_consumer(void)
47fcb56067SGeorge V. Neville-Neil*/
48fcb56067SGeorge V. Neville-NeilENTRY(dtrace_membar_consumer)
49fcb56067SGeorge V. Neville-Neil	RET
50fcb56067SGeorge V. Neville-NeilEND(dtrace_membar_consumer)
51fcb56067SGeorge V. Neville-Neil
52fcb56067SGeorge V. Neville-Neil/*
53fcb56067SGeorge V. Neville-Neildtrace_icookie_t dtrace_interrupt_disable(void)
54fcb56067SGeorge V. Neville-Neil*/
55fcb56067SGeorge V. Neville-NeilENTRY(dtrace_interrupt_disable)
56fcb56067SGeorge V. Neville-Neil	mrs	r0, cpsr
57fcb56067SGeorge V. Neville-Neil	mov	r1, r0
58fcb56067SGeorge V. Neville-Neil	orr	r1, r1, #(PSR_I | PSR_F)
59fcb56067SGeorge V. Neville-Neil	msr	cpsr_c, r1
60fcb56067SGeorge V. Neville-Neil	RET
61fcb56067SGeorge V. Neville-NeilEND(dtrace_interrupt_disable)
62fcb56067SGeorge V. Neville-Neil
63fcb56067SGeorge V. Neville-Neil/*
64fcb56067SGeorge V. Neville-Neilvoid dtrace_interrupt_enable(dtrace_icookie_t cookie)
65fcb56067SGeorge V. Neville-Neil*/
66fcb56067SGeorge V. Neville-NeilENTRY(dtrace_interrupt_enable)
67fcb56067SGeorge V. Neville-Neil	and	r0, r0, #(PSR_I | PSR_F)
68fcb56067SGeorge V. Neville-Neil	mrs	r1, cpsr
69fcb56067SGeorge V. Neville-Neil	bic	r1, r1, #(PSR_I | PSR_F)
70fcb56067SGeorge V. Neville-Neil	orr	r1, r1, r0
71fcb56067SGeorge V. Neville-Neil	msr	cpsr_c, r1
72fcb56067SGeorge V. Neville-Neil	RET
73fcb56067SGeorge V. Neville-NeilEND(dtrace_interrupt_enable)
74fcb56067SGeorge V. Neville-Neil/*
75fcb56067SGeorge V. Neville-Neiluint8_t
76fcb56067SGeorge V. Neville-Neildtrace_fuword8_nocheck(void *addr)
77fcb56067SGeorge V. Neville-Neil*/
78fcb56067SGeorge V. Neville-NeilENTRY(dtrace_fuword8_nocheck)
79fcb56067SGeorge V. Neville-Neil	ldrb	r3, [r0]
80fcb56067SGeorge V. Neville-Neil	mov 	r0, r3
81fcb56067SGeorge V. Neville-Neil	RET
82fcb56067SGeorge V. Neville-NeilEND(dtrace_fuword8_nocheck)
83fcb56067SGeorge V. Neville-Neil
84fcb56067SGeorge V. Neville-Neil/*
85fcb56067SGeorge V. Neville-Neiluint16_t
86fcb56067SGeorge V. Neville-Neildtrace_fuword16_nocheck(void *addr)
87fcb56067SGeorge V. Neville-Neil*/
88fcb56067SGeorge V. Neville-NeilENTRY(dtrace_fuword16_nocheck)
89fcb56067SGeorge V. Neville-Neil	ldrh	r3, [r0]
90fcb56067SGeorge V. Neville-Neil	mov 	r0, r3
91fcb56067SGeorge V. Neville-Neil	RET
92fcb56067SGeorge V. Neville-NeilEND(dtrace_fuword16_nocheck)
93fcb56067SGeorge V. Neville-Neil
94fcb56067SGeorge V. Neville-Neil/*
95fcb56067SGeorge V. Neville-Neiluint32_t
96fcb56067SGeorge V. Neville-Neildtrace_fuword32_nocheck(void *addr)
97fcb56067SGeorge V. Neville-Neil*/
98fcb56067SGeorge V. Neville-NeilENTRY(dtrace_fuword32_nocheck)
99fcb56067SGeorge V. Neville-Neil	ldr	r3, [r0]
100fcb56067SGeorge V. Neville-Neil	mov 	r0, r3
101fcb56067SGeorge V. Neville-Neil	RET
102fcb56067SGeorge V. Neville-NeilEND(dtrace_fuword32_nocheck)
103fcb56067SGeorge V. Neville-Neil
104fcb56067SGeorge V. Neville-Neil/*
105fcb56067SGeorge V. Neville-Neiluint64_t
106fcb56067SGeorge V. Neville-Neildtrace_fuword64_nocheck(void *addr)
107fcb56067SGeorge V. Neville-Neil*/
108fcb56067SGeorge V. Neville-NeilENTRY(dtrace_fuword64_nocheck)
109fcb56067SGeorge V. Neville-Neil	ldm	r0, {r2, r3}
110fcb56067SGeorge V. Neville-Neil
111fcb56067SGeorge V. Neville-Neil	mov	r0, r2
112fcb56067SGeorge V. Neville-Neil	mov	r1, r3
113fcb56067SGeorge V. Neville-Neil#if defined(__BIG_ENDIAN__)
114fcb56067SGeorge V. Neville-Neil/* big endian */
115fcb56067SGeorge V. Neville-Neil	mov	r0, r3
116fcb56067SGeorge V. Neville-Neil	mov	r1, r2
117fcb56067SGeorge V. Neville-Neil#else
118fcb56067SGeorge V. Neville-Neil/* little endian */
119fcb56067SGeorge V. Neville-Neil	mov	r0, r2
120fcb56067SGeorge V. Neville-Neil	mov	r1, r3
121fcb56067SGeorge V. Neville-Neil
122fcb56067SGeorge V. Neville-Neil#endif
123fcb56067SGeorge V. Neville-Neil	RET
124fcb56067SGeorge V. Neville-NeilEND(dtrace_fuword64_nocheck)
125fcb56067SGeorge V. Neville-Neil
126fcb56067SGeorge V. Neville-Neil/*
127fcb56067SGeorge V. Neville-Neilvoid
128fcb56067SGeorge V. Neville-Neildtrace_copy(uintptr_t uaddr, uintptr_t kaddr, size_t size)
129fcb56067SGeorge V. Neville-Neil*/
130fcb56067SGeorge V. Neville-NeilENTRY(dtrace_copy)
131fcb56067SGeorge V. Neville-Neil	stmfd	sp!, {r4-r5}			/* stack is 8 byte aligned */
132fcb56067SGeorge V. Neville-Neil	teq	r2, #0x00000000
133fcb56067SGeorge V. Neville-Neil	mov	r5, #0x00000000
134fcb56067SGeorge V. Neville-Neil	beq	2f
135fcb56067SGeorge V. Neville-Neil
136fcb56067SGeorge V. Neville-Neil1:	ldrb	r4, [r0], #0x0001
137fcb56067SGeorge V. Neville-Neil	add	r5, r5, #0x00000001
138fcb56067SGeorge V. Neville-Neil	strb	r4, [r1], #0x0001
139fcb56067SGeorge V. Neville-Neil	teqne	r5, r2
140fcb56067SGeorge V. Neville-Neil	bne	1b
141fcb56067SGeorge V. Neville-Neil
142fcb56067SGeorge V. Neville-Neil2:	ldmfd	sp!, {r4-r5}			/* stack is 8 byte aligned */
143fcb56067SGeorge V. Neville-Neil	RET
144fcb56067SGeorge V. Neville-NeilEND(dtrace_copy)
145fcb56067SGeorge V. Neville-Neil
146fcb56067SGeorge V. Neville-Neil/*
147fcb56067SGeorge V. Neville-Neilvoid
148fcb56067SGeorge V. Neville-Neildtrace_copystr(uintptr_t uaddr, uintptr_t kaddr, size_t size,
149fcb56067SGeorge V. Neville-Neil    volatile uint16_t *flags)
150fcb56067SGeorge V. Neville-NeilXXX: Check for flags?
151fcb56067SGeorge V. Neville-Neil*/
152fcb56067SGeorge V. Neville-NeilENTRY(dtrace_copystr)
153fcb56067SGeorge V. Neville-Neil	stmfd	sp!, {r4-r5}			/* stack is 8 byte aligned */
154fcb56067SGeorge V. Neville-Neil	teq	r2, #0x00000000
155fcb56067SGeorge V. Neville-Neil	mov	r5, #0x00000000
156fcb56067SGeorge V. Neville-Neil	beq	2f
157fcb56067SGeorge V. Neville-Neil
158fcb56067SGeorge V. Neville-Neil1:	ldrb	r4, [r0], #0x0001
159fcb56067SGeorge V. Neville-Neil	add	r5, r5, #0x00000001
160fcb56067SGeorge V. Neville-Neil	teq	r4, #0x00000000
161fcb56067SGeorge V. Neville-Neil	strb	r4, [r1], #0x0001
162fcb56067SGeorge V. Neville-Neil	teqne	r5, r2
163fcb56067SGeorge V. Neville-Neil	bne	1b
164fcb56067SGeorge V. Neville-Neil
165fcb56067SGeorge V. Neville-Neil2:	ldmfd	sp!, {r4-r5}			/* stack is 8 byte aligned */
166fcb56067SGeorge V. Neville-Neil	RET
167fcb56067SGeorge V. Neville-NeilEND(dtrace_copystr)
168fcb56067SGeorge V. Neville-Neil
169fcb56067SGeorge V. Neville-Neil/*
170fcb56067SGeorge V. Neville-Neiluintptr_t
171fcb56067SGeorge V. Neville-Neildtrace_caller(int aframes)
172fcb56067SGeorge V. Neville-Neil*/
173fcb56067SGeorge V. Neville-NeilENTRY(dtrace_caller)
174fcb56067SGeorge V. Neville-Neil	mov	r0, #-1
175fcb56067SGeorge V. Neville-Neil	RET
176fcb56067SGeorge V. Neville-NeilEND(dtrace_caller)
1772b6af94bSAndrew Turner
1782b6af94bSAndrew Turner/*
1792b6af94bSAndrew Turneruint32_t
1802b6af94bSAndrew Turnerdtrace_cas32(uint32_t *target, uint32_t cmp, uint32_t new)
1812b6af94bSAndrew Turner
1822b6af94bSAndrew Turnervoid *
1832b6af94bSAndrew Turnerdtrace_casptr(volatile void *target, volatile void *cmp, volatile void *new)
1842b6af94bSAndrew Turner*/
1852b6af94bSAndrew TurnerENTRY(dtrace_cas32)
1862b6af94bSAndrew TurnerEENTRY(dtrace_casptr)
1872b6af94bSAndrew Turner1:	ldrex	r3, [r0]	/* Load target */
1882b6af94bSAndrew Turner	cmp	r3, r1		/* Check if *target == cmp */
1892b6af94bSAndrew Turner	bne	2f		/* No, return */
190be9bc811SAndrew Turner	strex	ip, r2, [r0]	/* Store new to target */
191be9bc811SAndrew Turner	cmp	ip, #0		/* Did the store succeed? */
1922b6af94bSAndrew Turner	bne	1b		/* No, try again */
193be9bc811SAndrew Turner2:	mov	r0, r3		/* Return the value loaded from target */
1942b6af94bSAndrew Turner	RET
1952b6af94bSAndrew TurnerEEND(dtrace_casptr)
1962b6af94bSAndrew TurnerEND(dtrace_cas32)
197