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/* 23b78ee15eSRuslan Bukin * Copyright 2004 Sun Microsystems, Inc. All rights reserved. 24b78ee15eSRuslan Bukin * Use is subject to license terms. 25b78ee15eSRuslan Bukin */ 26b78ee15eSRuslan Bukin 27b78ee15eSRuslan Bukin#define _ASM 28b78ee15eSRuslan Bukin#define _LOCORE 29b78ee15eSRuslan Bukin 30b78ee15eSRuslan Bukin#include <sys/cpuvar_defs.h> 31b78ee15eSRuslan Bukin#include <sys/dtrace.h> 32*c2e0d56fSAndrew Turner#include <sys/elf_common.h> 33b78ee15eSRuslan Bukin 34b78ee15eSRuslan Bukin#include <machine/armreg.h> 35b78ee15eSRuslan Bukin#include <machine/asm.h> 36b78ee15eSRuslan Bukin 37fc2a8776SEd Maste#include "assym.inc" 38b78ee15eSRuslan Bukin 39b78ee15eSRuslan Bukin/* 40b78ee15eSRuslan Bukinvoid dtrace_membar_producer(void) 41b78ee15eSRuslan Bukin*/ 42b78ee15eSRuslan BukinENTRY(dtrace_membar_producer) 43b78ee15eSRuslan Bukin RET 44b78ee15eSRuslan BukinEND(dtrace_membar_producer) 45b78ee15eSRuslan Bukin 46b78ee15eSRuslan Bukin/* 47b78ee15eSRuslan Bukinvoid dtrace_membar_consumer(void) 48b78ee15eSRuslan Bukin*/ 49b78ee15eSRuslan BukinENTRY(dtrace_membar_consumer) 50b78ee15eSRuslan Bukin RET 51b78ee15eSRuslan BukinEND(dtrace_membar_consumer) 52b78ee15eSRuslan Bukin 53b78ee15eSRuslan Bukin/* 54b78ee15eSRuslan Bukindtrace_icookie_t dtrace_interrupt_disable(void) 55b78ee15eSRuslan Bukin*/ 56b78ee15eSRuslan BukinENTRY(dtrace_interrupt_disable) 5712aac6b5SAndrew Turner mrs x0, daif 58b78ee15eSRuslan Bukin msr daifset, #2 59b78ee15eSRuslan Bukin RET 60b78ee15eSRuslan BukinEND(dtrace_interrupt_disable) 61b78ee15eSRuslan Bukin 62b78ee15eSRuslan Bukin/* 63b78ee15eSRuslan Bukinvoid dtrace_interrupt_enable(dtrace_icookie_t cookie) 64b78ee15eSRuslan Bukin*/ 65b78ee15eSRuslan BukinENTRY(dtrace_interrupt_enable) 6612aac6b5SAndrew Turner msr daif, x0 67b78ee15eSRuslan Bukin RET 68b78ee15eSRuslan BukinEND(dtrace_interrupt_enable) 69b78ee15eSRuslan Bukin/* 70b78ee15eSRuslan Bukinuint8_t 71b78ee15eSRuslan Bukindtrace_fuword8_nocheck(void *addr) 72b78ee15eSRuslan Bukin*/ 73b78ee15eSRuslan BukinENTRY(dtrace_fuword8_nocheck) 746281147aSMark Johnston ldtrb w0, [x0] 75b78ee15eSRuslan Bukin RET 76b78ee15eSRuslan BukinEND(dtrace_fuword8_nocheck) 77b78ee15eSRuslan Bukin 78b78ee15eSRuslan Bukin/* 79b78ee15eSRuslan Bukinuint16_t 80b78ee15eSRuslan Bukindtrace_fuword16_nocheck(void *addr) 81b78ee15eSRuslan Bukin*/ 82b78ee15eSRuslan BukinENTRY(dtrace_fuword16_nocheck) 836281147aSMark Johnston ldtrh w0, [x0] 84b78ee15eSRuslan Bukin RET 85b78ee15eSRuslan BukinEND(dtrace_fuword16_nocheck) 86b78ee15eSRuslan Bukin 87b78ee15eSRuslan Bukin/* 88b78ee15eSRuslan Bukinuint32_t 89b78ee15eSRuslan Bukindtrace_fuword32_nocheck(void *addr) 90b78ee15eSRuslan Bukin*/ 91b78ee15eSRuslan BukinENTRY(dtrace_fuword32_nocheck) 926281147aSMark Johnston ldtr w0, [x0] 93b78ee15eSRuslan Bukin RET 94b78ee15eSRuslan BukinEND(dtrace_fuword32_nocheck) 95b78ee15eSRuslan Bukin 96b78ee15eSRuslan Bukin/* 97b78ee15eSRuslan Bukinuint64_t 98b78ee15eSRuslan Bukindtrace_fuword64_nocheck(void *addr) 99b78ee15eSRuslan Bukin*/ 100b78ee15eSRuslan BukinENTRY(dtrace_fuword64_nocheck) 1016281147aSMark Johnston ldtr x0, [x0] 102b78ee15eSRuslan Bukin RET 103b78ee15eSRuslan BukinEND(dtrace_fuword64_nocheck) 104b78ee15eSRuslan Bukin 105b78ee15eSRuslan Bukin/* 106b78ee15eSRuslan Bukinvoid 107b78ee15eSRuslan Bukindtrace_copy(uintptr_t uaddr, uintptr_t kaddr, size_t size) 108b78ee15eSRuslan Bukin*/ 109b78ee15eSRuslan BukinENTRY(dtrace_copy) 110b78ee15eSRuslan Bukin cbz x2, 2f /* If len == 0 then skip loop */ 111b78ee15eSRuslan Bukin1: 1126281147aSMark Johnston ldtrb w4, [x0] /* Load from uaddr */ 1136281147aSMark Johnston add x0, x0, #1 114b78ee15eSRuslan Bukin strb w4, [x1], #1 /* Store in kaddr */ 115b78ee15eSRuslan Bukin sub x2, x2, #1 /* len-- */ 116b78ee15eSRuslan Bukin cbnz x2, 1b 117b78ee15eSRuslan Bukin2: 118b78ee15eSRuslan Bukin RET 119b78ee15eSRuslan BukinEND(dtrace_copy) 120b78ee15eSRuslan Bukin 121b78ee15eSRuslan Bukin/* 122b78ee15eSRuslan Bukinvoid 123b78ee15eSRuslan Bukindtrace_copystr(uintptr_t uaddr, uintptr_t kaddr, size_t size, 124b78ee15eSRuslan Bukin volatile uint16_t *flags) 125b78ee15eSRuslan BukinXXX: Check for flags? 126b78ee15eSRuslan Bukin*/ 127b78ee15eSRuslan BukinENTRY(dtrace_copystr) 128b78ee15eSRuslan Bukin cbz x2, 2f /* If len == 0 then skip loop */ 1296281147aSMark Johnston1: 1306281147aSMark Johnston ldtrb w4, [x0] /* Load from uaddr */ 1316281147aSMark Johnston add x0, x0, #1 132b78ee15eSRuslan Bukin strb w4, [x1], #1 /* Store in kaddr */ 133b78ee15eSRuslan Bukin cbz w4, 2f /* If == 0 then break */ 134b78ee15eSRuslan Bukin sub x2, x2, #1 /* len-- */ 135b78ee15eSRuslan Bukin cbnz x2, 1b 136b78ee15eSRuslan Bukin2: 137b78ee15eSRuslan Bukin RET 138b78ee15eSRuslan BukinEND(dtrace_copystr) 139b78ee15eSRuslan Bukin 140b78ee15eSRuslan Bukin/* 141b78ee15eSRuslan Bukinuintptr_t 142b78ee15eSRuslan Bukindtrace_caller(int aframes) 143b78ee15eSRuslan Bukin*/ 144b78ee15eSRuslan BukinENTRY(dtrace_caller) 145b78ee15eSRuslan Bukin mov x0, #-1 146b78ee15eSRuslan Bukin RET 147b78ee15eSRuslan BukinEND(dtrace_caller) 148b78ee15eSRuslan Bukin 149b78ee15eSRuslan Bukin/* 150b78ee15eSRuslan Bukinuint32_t 151b78ee15eSRuslan Bukindtrace_cas32(uint32_t *target, uint32_t cmp, uint32_t new) 152b78ee15eSRuslan Bukin*/ 153b78ee15eSRuslan BukinENTRY(dtrace_cas32) 154b78ee15eSRuslan Bukin1: ldxr w3, [x0] /* Load target */ 155b78ee15eSRuslan Bukin cmp w3, w1 /* Check if *target == cmp */ 156b78ee15eSRuslan Bukin bne 2f /* No, return */ 157b78ee15eSRuslan Bukin stxr w12, w2, [x0] /* Store new to target */ 158b78ee15eSRuslan Bukin cbnz w12, 1b /* Try again if store not succeed */ 159b78ee15eSRuslan Bukin2: mov w0, w3 /* Return the value loaded from target */ 160b78ee15eSRuslan Bukin RET 161b78ee15eSRuslan BukinEND(dtrace_cas32) 162b78ee15eSRuslan Bukin 163b78ee15eSRuslan Bukin/* 164b78ee15eSRuslan Bukinvoid * 165b78ee15eSRuslan Bukindtrace_casptr(volatile void *target, volatile void *cmp, volatile void *new) 166b78ee15eSRuslan Bukin*/ 167b78ee15eSRuslan BukinENTRY(dtrace_casptr) 168b78ee15eSRuslan Bukin1: ldxr x3, [x0] /* Load target */ 169b78ee15eSRuslan Bukin cmp x3, x1 /* Check if *target == cmp */ 170b78ee15eSRuslan Bukin bne 2f /* No, return */ 171b78ee15eSRuslan Bukin stxr w12, x2, [x0] /* Store new to target */ 172b78ee15eSRuslan Bukin cbnz w12, 1b /* Try again if store not succeed */ 173b78ee15eSRuslan Bukin2: mov x0, x3 /* Return the value loaded from target */ 174b78ee15eSRuslan Bukin RET 175b78ee15eSRuslan BukinEND(dtrace_casptr) 176*c2e0d56fSAndrew Turner 177*c2e0d56fSAndrew TurnerGNU_PROPERTY_AARCH64_FEATURE_1_NOTE(GNU_PROPERTY_AARCH64_FEATURE_1_VAL) 178