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