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 #ifndef _SYS_KDI_REGS_H
  27 #define _SYS_KDI_REGS_H
  28 
  29 #pragma ident   "%Z%%M% %I%     %E% SMI"
  30 
  31 #ifndef _ASM
  32 #include <sys/types.h>
  33 #include <sys/segments.h>
  34 #include <sys/regset.h>
  35 #include <sys/privregs.h>
  36 #endif
  37 
  38 #if defined(__amd64)
  39 #include <amd64/sys/kdi_regs.h>
  40 #elif defined(__i386)
  41 #include <ia32/sys/kdi_regs.h>
  42 #endif
  43 
  44 #ifdef __cplusplus
  45 extern "C" {
  46 #endif
  47 
  48 #define KDI_NCRUMBS     5
  49 
  50 #define KDI_CPU_STATE_NONE              0
  51 #define KDI_CPU_STATE_MASTER            1
  52 #define KDI_CPU_STATE_SLAVE             2
  53 
  54 #define KDIREG_DRCTL_WPALLEN_MASK       0x000000ff
  55 #define KDIREG_DRSTAT_RESERVED          0xffff0ff0
  56 #define KDIREG_DRCTL_RESERVED           0x00000700
  57 
  58 #define KDI_MSR_READ            0x1     /* read during entry (unlimited) */
  59 #define KDI_MSR_WRITE           0x2     /* write during exit (unlimited) */
  60 #define KDI_MSR_WRITEDELAY      0x4     /* write after last branch (<= 1) */
  61 #define KDI_MSR_CLEARENTRY      0x3     /* clear before 1st branch (<= 1) */
  62 
  63 #ifndef _ASM
  64 
  65 /*
  66  * We maintain a ring buffer of bread crumbs for debugging purposes.  The
  67  * current buffer pointer is advanced along the ring with each intercepted
  68  * trap (debugger entry, invalid memory access, fault during step, etc).
  69  */
  70 typedef struct kdi_crumb {
  71         greg_t krm_cpu_state;   /* This CPU's state at last entry */
  72         greg_t krm_pc;          /* Instruction pointer at trap */
  73         greg_t krm_sp;          /* Stack pointer at trap */
  74         greg_t krm_trapno;      /* The last trap number */
  75         greg_t krm_flag;        /* KAIF_CRUMB_F_* */
  76 } kdi_crumb_t;
  77 
  78 #define KDI_MAXWPIDX    3
  79 
  80 /*
  81  * Storage for %dr0-3, %dr6, and %dr7.
  82  */
  83 typedef struct kdi_drreg {
  84         greg_t                  dr_ctl;
  85         greg_t                  dr_stat;
  86         greg_t                  dr_addr[KDI_MAXWPIDX + 1];
  87 } kdi_drreg_t;
  88 
  89 typedef struct kdi_msr {
  90         uint_t          msr_num;
  91         uint_t          msr_type;
  92         union {
  93                 uint64_t *_msr_valp;
  94                 uint64_t _msr_val;
  95         } _u;
  96 } kdi_msr_t;
  97 
  98 #define kdi_msr_val     _u._msr_val
  99 #define kdi_msr_valp    _u._msr_valp
 100 
 101 /*
 102  * Data structure used to hold all of the state for a given CPU.
 103  */
 104 typedef struct kdi_cpusave {
 105         greg_t                  *krs_gregs;     /* saved registers */
 106 
 107         kdi_drreg_t             krs_dr;         /* saved debug registers */
 108 
 109         user_desc_t             *krs_gdt;       /* GDT address */
 110         gate_desc_t             *krs_idt;       /* IDT address */
 111 
 112         greg_t                  krs_cr0;        /* saved %cr0 */
 113 
 114         kdi_msr_t               *krs_msr;       /* ptr to MSR save area */
 115 
 116         uint_t                  krs_cpu_state;  /* KDI_CPU_STATE_* mstr/slv */
 117         uint_t                  krs_cpu_flushed; /* Have caches been flushed? */
 118         uint_t                  krs_cpu_id;     /* this CPU's ID */
 119 
 120         /* Bread crumb ring buffer */
 121         ulong_t                 krs_curcrumbidx; /* Current krs_crumbs idx */
 122         kdi_crumb_t             *krs_curcrumb;  /* Pointer to current crumb */
 123         kdi_crumb_t             krs_crumbs[KDI_NCRUMBS]; /* Crumbs */
 124 } kdi_cpusave_t;
 125 
 126 #endif /* !_ASM */
 127 
 128 #ifdef __cplusplus
 129 }
 130 #endif
 131 
 132 #endif /* _SYS_KDI_REGS_H */