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