Path: blob/main/sys/cddl/dev/dtrace/riscv/dtrace_asm.S
48375 views
/*1* CDDL HEADER START2*3* The contents of this file are subject to the terms of the4* Common Development and Distribution License, Version 1.0 only5* (the "License"). You may not use this file except in compliance6* with the License.7*8* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE9* or http://www.opensolaris.org/os/licensing.10* See the License for the specific language governing permissions11* and limitations under the License.12*13* When distributing Covered Code, include this CDDL HEADER in each14* file and include the License file at usr/src/OPENSOLARIS.LICENSE.15* If applicable, add the following below this CDDL HEADER, with the16* fields enclosed by brackets "[]" replaced with your own identifying17* information: Portions Copyright [yyyy] [name of copyright owner]18*19* CDDL HEADER END20*21* Portions Copyright 2016 Ruslan Bukin <[email protected]>22*/23/*24* Copyright 2004 Sun Microsystems, Inc. All rights reserved.25* Use is subject to license terms.26*/2728#define _ASM29#define _LOCORE3031#include <sys/cpuvar_defs.h>32#include <sys/dtrace.h>3334#include <machine/riscvreg.h>35#include <machine/asm.h>3637#include "assym.inc"3839/*40void dtrace_membar_producer(void)41*/42ENTRY(dtrace_membar_producer)43RET44END(dtrace_membar_producer)4546/*47void dtrace_membar_consumer(void)48*/49ENTRY(dtrace_membar_consumer)50RET51END(dtrace_membar_consumer)5253/*54dtrace_icookie_t dtrace_interrupt_disable(void)55*/56ENTRY(dtrace_interrupt_disable)57csrrci a0, sstatus, (SSTATUS_SIE)58andi a0, a0, (SSTATUS_SIE)59RET60END(dtrace_interrupt_disable)6162/*63void dtrace_interrupt_enable(dtrace_icookie_t cookie)64*/65ENTRY(dtrace_interrupt_enable)66csrs sstatus, a067RET68END(dtrace_interrupt_enable)69/*70uint8_t71dtrace_fuword8_nocheck(void *addr)72*/73ENTRY(dtrace_fuword8_nocheck)74ENTER_USER_ACCESS(t0)75lb a0, 0(a0)76EXIT_USER_ACCESS(t0)77RET78END(dtrace_fuword8_nocheck)7980/*81uint16_t82dtrace_fuword16_nocheck(void *addr)83*/84ENTRY(dtrace_fuword16_nocheck)85ENTER_USER_ACCESS(t0)86lh a0, 0(a0)87EXIT_USER_ACCESS(t0)88RET89END(dtrace_fuword16_nocheck)9091/*92uint32_t93dtrace_fuword32_nocheck(void *addr)94*/95ENTRY(dtrace_fuword32_nocheck)96ENTER_USER_ACCESS(t0)97lw a0, 0(a0)98EXIT_USER_ACCESS(t0)99RET100END(dtrace_fuword32_nocheck)101102/*103uint64_t104dtrace_fuword64_nocheck(void *addr)105*/106ENTRY(dtrace_fuword64_nocheck)107ENTER_USER_ACCESS(t0)108ld a0, 0(a0)109EXIT_USER_ACCESS(t0)110RET111END(dtrace_fuword64_nocheck)112113/*114void115dtrace_copy(uintptr_t uaddr, uintptr_t kaddr, size_t size)116*/117ENTRY(dtrace_copy)118beqz a2, 2f /* If len == 0 then skip loop */119ENTER_USER_ACCESS(t0)1201:121lb a4, 0(a0) /* Load from uaddr */122addi a0, a0, 1123sb a4, 0(a1) /* Store in kaddr */124addi a1, a1, 1125addi a2, a2, -1 /* len-- */126bnez a2, 1b127EXIT_USER_ACCESS(t0)1282:129RET130END(dtrace_copy)131132/*133void134dtrace_copystr(uintptr_t uaddr, uintptr_t kaddr, size_t size,135volatile uint16_t *flags)136XXX: Check for flags?137*/138ENTRY(dtrace_copystr)139beqz a2, 3f /* If len == 0 then skip loop */140ENTER_USER_ACCESS(t0)1411:142lb a4, 0(a0) /* Load from uaddr */143addi a0, a0, 1144sb a4, 0(a1) /* Store in kaddr */145addi a1, a1, 1146beqz a4, 2f /* If == 0 then break */147addi a2, a2, -1 /* len-- */148bnez a2, 1b1492:150EXIT_USER_ACCESS(t0)1513:152RET153END(dtrace_copystr)154155/*156uintptr_t157dtrace_caller(int aframes)158*/159ENTRY(dtrace_caller)160li a0, -1161RET162END(dtrace_caller)163164/*165uint32_t166dtrace_cas32(uint32_t *target, uint32_t cmp, uint32_t new)167*/168ENTRY(dtrace_cas32)1691: lr.w a3, 0(a0) /* Load target */170bne a3, a1, 2f /* *target != cmp ? return */171sc.w a4, a2, 0(a0) /* Store new to target */172bnez a4, 1b /* Try again if store not succeed */1732: mv a0, a3 /* Return the value loaded from target */174RET175END(dtrace_cas32)176177/*178void *179dtrace_casptr(volatile void *target, volatile void *cmp, volatile void *new)180*/181ENTRY(dtrace_casptr)1821: lr.d a3, 0(a0) /* Load target */183bne a3, a1, 2f /* *target != cmp ? return */184sc.d a4, a2, 0(a0) /* Store new to target */185bnez a4, 1b /* Try again if store not succeed */1862: mv a0, a3 /* Return the value loaded from target */187RET188END(dtrace_casptr)189190191