Path: blob/main/sys/cddl/dev/dtrace/arm/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/*22* Copyright 2004 Sun Microsystems, Inc. All rights reserved.23* Use is subject to license terms.24*/2526#define _ASM27#define _LOCORE2829#include <sys/cpuvar_defs.h>30#include <sys/dtrace.h>3132#include <machine/asm.h>33#include <machine/armreg.h>3435#include "assym.inc"3637/*38void dtrace_membar_producer(void)39*/40ENTRY(dtrace_membar_producer)41RET42END(dtrace_membar_producer)4344/*45void dtrace_membar_consumer(void)46*/47ENTRY(dtrace_membar_consumer)48RET49END(dtrace_membar_consumer)5051/*52dtrace_icookie_t dtrace_interrupt_disable(void)53*/54ENTRY(dtrace_interrupt_disable)55mrs r0, cpsr56mov r1, r057orr r1, r1, #(PSR_I | PSR_F)58msr cpsr_c, r159RET60END(dtrace_interrupt_disable)6162/*63void dtrace_interrupt_enable(dtrace_icookie_t cookie)64*/65ENTRY(dtrace_interrupt_enable)66and r0, r0, #(PSR_I | PSR_F)67mrs r1, cpsr68bic r1, r1, #(PSR_I | PSR_F)69orr r1, r1, r070msr cpsr_c, r171RET72END(dtrace_interrupt_enable)73/*74uint8_t75dtrace_fuword8_nocheck(void *addr)76*/77ENTRY(dtrace_fuword8_nocheck)78ldrb r3, [r0]79mov r0, r380RET81END(dtrace_fuword8_nocheck)8283/*84uint16_t85dtrace_fuword16_nocheck(void *addr)86*/87ENTRY(dtrace_fuword16_nocheck)88ldrh r3, [r0]89mov r0, r390RET91END(dtrace_fuword16_nocheck)9293/*94uint32_t95dtrace_fuword32_nocheck(void *addr)96*/97ENTRY(dtrace_fuword32_nocheck)98ldr r3, [r0]99mov r0, r3100RET101END(dtrace_fuword32_nocheck)102103/*104uint64_t105dtrace_fuword64_nocheck(void *addr)106*/107ENTRY(dtrace_fuword64_nocheck)108ldm r0, {r2, r3}109110mov r0, r2111mov r1, r3112#if defined(__BIG_ENDIAN__)113/* big endian */114mov r0, r3115mov r1, r2116#else117/* little endian */118mov r0, r2119mov r1, r3120121#endif122RET123END(dtrace_fuword64_nocheck)124125/*126void127dtrace_copy(uintptr_t uaddr, uintptr_t kaddr, size_t size)128*/129ENTRY(dtrace_copy)130stmfd sp!, {r4-r5} /* stack is 8 byte aligned */131teq r2, #0x00000000132mov r5, #0x00000000133beq 2f1341351: ldrb r4, [r0], #0x0001136add r5, r5, #0x00000001137strb r4, [r1], #0x0001138teqne r5, r2139bne 1b1401412: ldmfd sp!, {r4-r5} /* stack is 8 byte aligned */142RET143END(dtrace_copy)144145/*146void147dtrace_copystr(uintptr_t uaddr, uintptr_t kaddr, size_t size,148volatile uint16_t *flags)149XXX: Check for flags?150*/151ENTRY(dtrace_copystr)152stmfd sp!, {r4-r5} /* stack is 8 byte aligned */153teq r2, #0x00000000154mov r5, #0x00000000155beq 2f1561571: ldrb r4, [r0], #0x0001158add r5, r5, #0x00000001159teq r4, #0x00000000160strb r4, [r1], #0x0001161teqne r5, r2162bne 1b1631642: ldmfd sp!, {r4-r5} /* stack is 8 byte aligned */165RET166END(dtrace_copystr)167168/*169uintptr_t170dtrace_caller(int aframes)171*/172ENTRY(dtrace_caller)173mov r0, #-1174RET175END(dtrace_caller)176177/*178uint32_t179dtrace_cas32(uint32_t *target, uint32_t cmp, uint32_t new)180181void *182dtrace_casptr(volatile void *target, volatile void *cmp, volatile void *new)183*/184ENTRY(dtrace_cas32)185EENTRY(dtrace_casptr)1861: ldrex r3, [r0] /* Load target */187cmp r3, r1 /* Check if *target == cmp */188bne 2f /* No, return */189strex ip, r2, [r0] /* Store new to target */190cmp ip, #0 /* Did the store succeed? */191bne 1b /* No, try again */1922: mov r0, r3 /* Return the value loaded from target */193RET194EEND(dtrace_casptr)195END(dtrace_cas32)196197198