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 45extern "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 */ 70typedef 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 */ 83typedef 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 89typedef 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 */ 104typedef 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 */ 133