The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/cddl/dev/dtrace/x86/instr_size.c

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    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, Version 1.0 only
    6  * (the "License").  You may not use this file except in compliance
    7  * with the License.
    8  *
    9  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
   10  * or http://www.opensolaris.org/os/licensing.
   11  * See the License for the specific language governing permissions
   12  * and limitations under the License.
   13  *
   14  * When distributing Covered Code, include this CDDL HEADER in each
   15  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
   16  * If applicable, add the following below this CDDL HEADER, with the
   17  * fields enclosed by brackets "[]" replaced with your own identifying
   18  * information: Portions Copyright [yyyy] [name of copyright owner]
   19  *
   20  * CDDL HEADER END
   21  *
   22  * $FreeBSD$
   23  */
   24 /*
   25  * Copyright 2005 Sun Microsystems, Inc.  All rights reserved.
   26  * Use is subject to license terms.
   27  */
   28 
   29 /*      Copyright (c) 1988 AT&T */
   30 /*        All Rights Reserved   */
   31 
   32 
   33 #ifdef illumos
   34 #pragma ident   "@(#)instr_size.c       1.14    05/07/08 SMI"
   35 #endif
   36 
   37 #include <sys/types.h>
   38 #include <sys/param.h>
   39 #include <sys/proc.h>
   40 #ifdef illumos
   41 #include <sys/cmn_err.h>
   42 #include <sys/archsystm.h>
   43 #include <sys/copyops.h>
   44 #include <vm/seg_enum.h>
   45 #include <sys/privregs.h>
   46 #else
   47 #include <sys/cred.h>
   48 #include <cddl/dev/dtrace/dtrace_cddl.h>
   49 
   50 typedef u_int                   model_t;
   51 #define DATAMODEL_NATIVE        0
   52 int dtrace_instr_size(uchar_t *);
   53 int dtrace_instr_size_isa(uchar_t *, model_t, int *);
   54 #endif
   55 
   56 #include <dis_tables.h>
   57 
   58 /*
   59  * This subsystem (with the minor exception of the instr_size() function) is
   60  * is called from DTrace probe context.  This imposes several requirements on
   61  * the implementation:
   62  *
   63  * 1. External subsystems and functions may not be referenced.  The one current
   64  *    exception is for cmn_err, but only to signal the detection of table
   65  *    errors.  Assuming the tables are correct, no combination of input is to
   66  *    trigger a cmn_err call.
   67  *
   68  * 2. These functions can't be allowed to be traced.  To prevent this,
   69  *    all functions in the probe path (everything except instr_size()) must
   70  *    have names that begin with "dtrace_".
   71  */
   72 
   73 typedef enum dis_isize {
   74         DIS_ISIZE_INSTR,
   75         DIS_ISIZE_OPERAND
   76 } dis_isize_t;
   77 
   78 
   79 /*
   80  * get a byte from instruction stream
   81  */
   82 static int
   83 dtrace_dis_get_byte(void *p)
   84 {
   85         int ret;
   86         uchar_t **instr = p;
   87 
   88         ret = **instr;
   89         *instr += 1;
   90 
   91         return (ret);
   92 }
   93 
   94 /*
   95  * Returns either the size of a given instruction, in bytes, or the size of that
   96  * instruction's memory access (if any), depending on the value of `which'.
   97  * If a programming error in the tables is detected, the system will panic to
   98  * ease diagnosis.  Invalid instructions will not be flagged.  They will appear
   99  * to have an instruction size between 1 and the actual size, and will be
  100  * reported as having no memory impact.
  101  */
  102 /* ARGSUSED2 */
  103 static int
  104 dtrace_dis_isize(uchar_t *instr, dis_isize_t which, model_t model, int *rmindex)
  105 {
  106         int sz;
  107         dis86_t x;
  108         uint_t mode = SIZE32;
  109 
  110         mode = (model == DATAMODEL_LP64) ? SIZE64 : SIZE32;
  111 
  112         x.d86_data = (void **)&instr;
  113         x.d86_get_byte = dtrace_dis_get_byte;
  114         x.d86_check_func = NULL;
  115 
  116         if (dtrace_disx86(&x, mode) != 0)
  117                 return (-1);
  118 
  119         if (which == DIS_ISIZE_INSTR)
  120                 sz = x.d86_len;         /* length of the instruction */
  121         else
  122                 sz = x.d86_memsize;     /* length of memory operand */
  123 
  124         if (rmindex != NULL)
  125                 *rmindex = x.d86_rmindex;
  126         return (sz);
  127 }
  128 
  129 int
  130 dtrace_instr_size_isa(uchar_t *instr, model_t model, int *rmindex)
  131 {
  132         return (dtrace_dis_isize(instr, DIS_ISIZE_INSTR, model, rmindex));
  133 }
  134 
  135 int
  136 dtrace_instr_size(uchar_t *instr)
  137 {
  138         return (dtrace_dis_isize(instr, DIS_ISIZE_INSTR, DATAMODEL_NATIVE,
  139             NULL));
  140 }

Cache object: a80ed0bd7fb07ae2f5e3b7e07c29e3eb


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.