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