1ae115bc7Smrj /* 2ae115bc7Smrj * CDDL HEADER START 3ae115bc7Smrj * 4ae115bc7Smrj * The contents of this file are subject to the terms of the 5ae115bc7Smrj * Common Development and Distribution License (the "License"). 6ae115bc7Smrj * You may not use this file except in compliance with the License. 7ae115bc7Smrj * 8ae115bc7Smrj * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9ae115bc7Smrj * or http://www.opensolaris.org/os/licensing. 10ae115bc7Smrj * See the License for the specific language governing permissions 11ae115bc7Smrj * and limitations under the License. 12ae115bc7Smrj * 13ae115bc7Smrj * When distributing Covered Code, include this CDDL HEADER in each 14ae115bc7Smrj * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15ae115bc7Smrj * If applicable, add the following below this CDDL HEADER, with the 16ae115bc7Smrj * fields enclosed by brackets "[]" replaced with your own identifying 17ae115bc7Smrj * information: Portions Copyright [yyyy] [name of copyright owner] 18ae115bc7Smrj * 19ae115bc7Smrj * CDDL HEADER END 20ae115bc7Smrj */ 21ae115bc7Smrj /* 22ae115bc7Smrj * Copyright 2007 Sun Microsystems, Inc. All rights reserved. 23ae115bc7Smrj * Use is subject to license terms. 24*399ca3a7SJohn Levon * 25*399ca3a7SJohn Levon * Copyright 2018 Joyent, Inc. 26ae115bc7Smrj */ 27ae115bc7Smrj 28ae115bc7Smrj #ifndef _SYS_KDI_REGS_H 29ae115bc7Smrj #define _SYS_KDI_REGS_H 30ae115bc7Smrj 31ae115bc7Smrj #ifndef _ASM 32ae115bc7Smrj #include <sys/types.h> 33ae115bc7Smrj #include <sys/segments.h> 34ae115bc7Smrj #include <sys/regset.h> 35ae115bc7Smrj #include <sys/privregs.h> 36ae115bc7Smrj #endif 37ae115bc7Smrj 38ae115bc7Smrj #if defined(__amd64) 39ae115bc7Smrj #include <amd64/sys/kdi_regs.h> 40ae115bc7Smrj #elif defined(__i386) 41ae115bc7Smrj #include <ia32/sys/kdi_regs.h> 42ae115bc7Smrj #endif 43ae115bc7Smrj 44ae115bc7Smrj #ifdef __cplusplus 45ae115bc7Smrj extern "C" { 46ae115bc7Smrj #endif 47ae115bc7Smrj 48ae115bc7Smrj #define KDI_NCRUMBS 5 49ae115bc7Smrj 50ae115bc7Smrj #define KDI_CPU_STATE_NONE 0 51ae115bc7Smrj #define KDI_CPU_STATE_MASTER 1 52ae115bc7Smrj #define KDI_CPU_STATE_SLAVE 2 53ae115bc7Smrj 54ae115bc7Smrj #define KDIREG_DRCTL_WPALLEN_MASK 0x000000ff 55ae115bc7Smrj #define KDIREG_DRSTAT_RESERVED 0xffff0ff0 56ae115bc7Smrj #define KDIREG_DRCTL_RESERVED 0x00000700 57ae115bc7Smrj 58ae115bc7Smrj #ifndef _ASM 59ae115bc7Smrj 60ae115bc7Smrj /* 61ae115bc7Smrj * We maintain a ring buffer of bread crumbs for debugging purposes. The 62ae115bc7Smrj * current buffer pointer is advanced along the ring with each intercepted 63ae115bc7Smrj * trap (debugger entry, invalid memory access, fault during step, etc). 64ae115bc7Smrj */ 65ae115bc7Smrj typedef struct kdi_crumb { 66ae115bc7Smrj greg_t krm_cpu_state; /* This CPU's state at last entry */ 67ae115bc7Smrj greg_t krm_pc; /* Instruction pointer at trap */ 68ae115bc7Smrj greg_t krm_sp; /* Stack pointer at trap */ 69ae115bc7Smrj greg_t krm_trapno; /* The last trap number */ 70ae115bc7Smrj greg_t krm_flag; /* KAIF_CRUMB_F_* */ 71ae115bc7Smrj } kdi_crumb_t; 72ae115bc7Smrj 73ae115bc7Smrj #define KDI_MAXWPIDX 3 74ae115bc7Smrj 75ae115bc7Smrj /* 76ae115bc7Smrj * Storage for %dr0-3, %dr6, and %dr7. 77ae115bc7Smrj */ 78ae115bc7Smrj typedef struct kdi_drreg { 79ae115bc7Smrj greg_t dr_ctl; 80ae115bc7Smrj greg_t dr_stat; 81ae115bc7Smrj greg_t dr_addr[KDI_MAXWPIDX + 1]; 82ae115bc7Smrj } kdi_drreg_t; 83ae115bc7Smrj 84ae115bc7Smrj /* 85ae115bc7Smrj * Data structure used to hold all of the state for a given CPU. 86ae115bc7Smrj */ 87ae115bc7Smrj typedef struct kdi_cpusave { 88ae115bc7Smrj greg_t *krs_gregs; /* saved registers */ 89ae115bc7Smrj 90ae115bc7Smrj kdi_drreg_t krs_dr; /* saved debug registers */ 91ae115bc7Smrj 92ae115bc7Smrj user_desc_t *krs_gdt; /* GDT address */ 93ae115bc7Smrj gate_desc_t *krs_idt; /* IDT address */ 94ae115bc7Smrj 95ae115bc7Smrj greg_t krs_cr0; /* saved %cr0 */ 96ae115bc7Smrj 97ae115bc7Smrj uint_t krs_cpu_state; /* KDI_CPU_STATE_* mstr/slv */ 98ae115bc7Smrj uint_t krs_cpu_flushed; /* Have caches been flushed? */ 99ae115bc7Smrj uint_t krs_cpu_id; /* this CPU's ID */ 100ae115bc7Smrj 101ae115bc7Smrj /* Bread crumb ring buffer */ 102ae115bc7Smrj ulong_t krs_curcrumbidx; /* Current krs_crumbs idx */ 103ae115bc7Smrj kdi_crumb_t *krs_curcrumb; /* Pointer to current crumb */ 104ae115bc7Smrj kdi_crumb_t krs_crumbs[KDI_NCRUMBS]; /* Crumbs */ 105ae115bc7Smrj } kdi_cpusave_t; 106ae115bc7Smrj 107ae115bc7Smrj #endif /* !_ASM */ 108ae115bc7Smrj 109ae115bc7Smrj #ifdef __cplusplus 110ae115bc7Smrj } 111ae115bc7Smrj #endif 112ae115bc7Smrj 113ae115bc7Smrj #endif /* _SYS_KDI_REGS_H */ 114