1 /*
   2  * CDDL HEADER START
   3  *
   4  * The contents of this file are subject to the terms of the
   5  * Common Development and Distribution License (the "License").
   6  * You may not use this file except in compliance with the License.
   7  *
   8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
   9  * or http://www.opensolaris.org/os/licensing.
  10  * See the License for the specific language governing permissions
  11  * and limitations under the License.
  12  *
  13  * When distributing Covered Code, include this CDDL HEADER in each
  14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
  15  * If applicable, add the following below this CDDL HEADER, with the
  16  * fields enclosed by brackets "[]" replaced with your own identifying
  17  * information: Portions Copyright [yyyy] [name of copyright owner]
  18  *
  19  * CDDL HEADER END
  20  */
  21 /*
  22  * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
  23  * Use is subject to license terms.
  24  */
  25 /*
  26  * Copyright 2019 Joyent, Inc.
  27  */
  28 
  29 #include <sys/asm_linkage.h>
  30 #include <sys/regset.h>
  31 
  32 #include "assym.h"
  33 
  34         ENTRY_NP(dtrace_getfp)
  35         movq    %rbp, %rax
  36         ret
  37         SET_SIZE(dtrace_getfp)
  38 
  39 
  40         ENTRY_NP(dtrace_getvmreg)
  41 
  42         movq    %rdi, %rdx
  43         vmread  %rdx, %rax
  44         ret
  45 
  46         SET_SIZE(dtrace_getvmreg)
  47 
  48 
  49         ENTRY(dtrace_cas32)
  50         movl    %esi, %eax
  51         lock
  52         cmpxchgl %edx, (%rdi)
  53         ret
  54         SET_SIZE(dtrace_cas32)
  55 
  56         ENTRY(dtrace_casptr)
  57         movq    %rsi, %rax
  58         lock
  59         cmpxchgq %rdx, (%rdi)
  60         ret
  61         SET_SIZE(dtrace_casptr)
  62 
  63         ENTRY(dtrace_caller)
  64         movq    $-1, %rax
  65         ret
  66         SET_SIZE(dtrace_caller)
  67 
  68         ENTRY(dtrace_copy)
  69         pushq   %rbp
  70         call    smap_disable
  71         movq    %rsp, %rbp
  72 
  73         xchgq   %rdi, %rsi              /* make %rsi source, %rdi dest */
  74         movq    %rdx, %rcx              /* load count */
  75         repz                            /* repeat for count ... */
  76         smovb                           /*   move from %ds:rsi to %ed:rdi */
  77         call    smap_enable
  78         leave
  79         ret
  80         SET_SIZE(dtrace_copy)
  81 
  82         ENTRY(dtrace_copystr)
  83         pushq   %rbp
  84         movq    %rsp, %rbp
  85         call    smap_disable
  86 0:
  87         movb    (%rdi), %al             /* load from source */
  88         movb    %al, (%rsi)             /* store to destination */
  89         addq    $1, %rdi                /* increment source pointer */
  90         addq    $1, %rsi                /* increment destination pointer */
  91         subq    $1, %rdx                /* decrement remaining count */
  92         cmpb    $0, %al
  93         je      2f
  94         testq   $0xfff, %rdx            /* test if count is 4k-aligned */
  95         jnz     1f                      /* if not, continue with copying */
  96         testq   $CPU_DTRACE_BADADDR, (%rcx) /* load and test dtrace flags */
  97         jnz     2f
  98 1:
  99         cmpq    $0, %rdx
 100         jne     0b
 101 2:
 102         call    smap_enable
 103         leave
 104         ret
 105 
 106         SET_SIZE(dtrace_copystr)
 107 
 108         ENTRY(dtrace_fulword)
 109         call    smap_disable
 110         movq    (%rdi), %rax
 111         call    smap_enable
 112         ret
 113         SET_SIZE(dtrace_fulword)
 114 
 115         ENTRY(dtrace_fuword8_nocheck)
 116         call    smap_disable
 117         xorq    %rax, %rax
 118         movb    (%rdi), %al
 119         call    smap_enable
 120         ret
 121         SET_SIZE(dtrace_fuword8_nocheck)
 122 
 123         ENTRY(dtrace_fuword16_nocheck)
 124         call    smap_disable
 125         xorq    %rax, %rax
 126         movw    (%rdi), %ax
 127         call    smap_enable
 128         ret
 129         SET_SIZE(dtrace_fuword16_nocheck)
 130 
 131         ENTRY(dtrace_fuword32_nocheck)
 132         call    smap_disable
 133         xorq    %rax, %rax
 134         movl    (%rdi), %eax
 135         call    smap_enable
 136         ret
 137         SET_SIZE(dtrace_fuword32_nocheck)
 138 
 139         ENTRY(dtrace_fuword64_nocheck)
 140         call    smap_disable
 141         movq    (%rdi), %rax
 142         call    smap_enable
 143         ret
 144         SET_SIZE(dtrace_fuword64_nocheck)
 145 
 146         ENTRY(dtrace_probe_error)
 147         pushq   %rbp
 148         movq    %rsp, %rbp
 149         subq    $0x8, %rsp
 150         movq    %r9, (%rsp)
 151         movq    %r8, %r9
 152         movq    %rcx, %r8
 153         movq    %rdx, %rcx
 154         movq    %rsi, %rdx
 155         movq    %rdi, %rsi
 156         movl    dtrace_probeid_error(%rip), %edi
 157         call    dtrace_probe
 158         addq    $0x8, %rsp
 159         leave
 160         ret
 161         SET_SIZE(dtrace_probe_error)
 162