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  * Copyright 2018 Joyent, Inc.
  26  */
  27 
  28 #ifndef _SYS_KDI_REGS_H
  29 #define _SYS_KDI_REGS_H
  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 #ifndef _ASM
  59 
  60 /*
  61  * We maintain a ring buffer of bread crumbs for debugging purposes.  The
  62  * current buffer pointer is advanced along the ring with each intercepted
  63  * trap (debugger entry, invalid memory access, fault during step, etc).
  64  */
  65 typedef struct kdi_crumb {
  66         greg_t krm_cpu_state;   /* This CPU's state at last entry */
  67         greg_t krm_pc;          /* Instruction pointer at trap */
  68         greg_t krm_sp;          /* Stack pointer at trap */
  69         greg_t krm_trapno;      /* The last trap number */
  70         greg_t krm_flag;        /* KAIF_CRUMB_F_* */
  71 } kdi_crumb_t;
  72 
  73 #define KDI_MAXWPIDX    3
  74 
  75 /*
  76  * Storage for %dr0-3, %dr6, and %dr7.
  77  */
  78 typedef struct kdi_drreg {
  79         greg_t                  dr_ctl;
  80         greg_t                  dr_stat;
  81         greg_t                  dr_addr[KDI_MAXWPIDX + 1];
  82 } kdi_drreg_t;
  83 
  84 /*
  85  * Data structure used to hold all of the state for a given CPU.
  86  */
  87 typedef struct kdi_cpusave {
  88         greg_t                  *krs_gregs;     /* saved registers */
  89 
  90         kdi_drreg_t             krs_dr;         /* saved debug registers */
  91 
  92         user_desc_t             *krs_gdt;       /* GDT address */
  93         gate_desc_t             *krs_idt;       /* IDT address */
  94 
  95         greg_t                  krs_cr0;        /* saved %cr0 */
  96 
  97         uint_t                  krs_cpu_state;  /* KDI_CPU_STATE_* mstr/slv */
  98         uint_t                  krs_cpu_flushed; /* Have caches been flushed? */
  99         uint_t                  krs_cpu_id;     /* this CPU's ID */
 100 
 101         /* Bread crumb ring buffer */
 102         ulong_t                 krs_curcrumbidx; /* Current krs_crumbs idx */
 103         kdi_crumb_t             *krs_curcrumb;  /* Pointer to current crumb */
 104         kdi_crumb_t             krs_crumbs[KDI_NCRUMBS]; /* Crumbs */
 105 } kdi_cpusave_t;
 106 
 107 #endif /* !_ASM */
 108 
 109 #ifdef __cplusplus
 110 }
 111 #endif
 112 
 113 #endif /* _SYS_KDI_REGS_H */