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.
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.
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]
22 * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
23 * Use is subject to license terms.
26 #ifndef _SYS_TRAPSTAT_H
27 #define _SYS_TRAPSTAT_H
29 #pragma ident "%Z%%M% %I% %E% SMI"
32 #include <sys/processor.h>
39 #define TSTATIOC (('t' << 16) | ('s' << 8))
41 #define TSTATIOC_READ (TSTATIOC | 1)
42 #define TSTATIOC_GO (TSTATIOC | 2)
43 #define TSTATIOC_NOGO (TSTATIOC | 3)
44 #define TSTATIOC_STOP (TSTATIOC | 4)
45 #define TSTATIOC_CPU (TSTATIOC | 5)
46 #define TSTATIOC_NOCPU (TSTATIOC | 6)
47 #define TSTATIOC_ENTRY (TSTATIOC | 7)
48 #define TSTATIOC_NOENTRY (TSTATIOC | 8)
49 #define TSTATIOC_TLBDATA (TSTATIOC | 9)
51 #define TSTAT_NENT 512
56 * tstat_missdata_t must be of size 2^n, for some value of n. This allows
57 * tstat_tlbdata_t to be of size 2^(n+2), and tstat_pgszdata_t to be of
58 * size 2^(n+3) -- a constraint which greatly simplifies the TLB return
61 typedef struct tstat_missdata
{
66 typedef struct tstat_tlbdata
{
67 tstat_missdata_t ttlb_tlb
;
68 tstat_missdata_t ttlb_tsb
;
71 typedef struct tstat_modedata
{
72 tstat_tlbdata_t tmode_itlb
;
73 tstat_tlbdata_t tmode_dtlb
;
76 typedef struct tstat_pgszdata
{
77 tstat_modedata_t tpgsz_user
;
78 tstat_modedata_t tpgsz_kernel
;
81 typedef struct tstat_data
{
82 processorid_t tdata_cpuid
;
83 hrtime_t tdata_snapts
;
84 hrtime_t tdata_snaptick
;
85 hrtime_t tdata_tmptick
;
86 hrtime_t tdata_peffect
;
87 uint64_t tdata_traps
[TSTAT_NENT
];
88 tstat_pgszdata_t tdata_pgsz
[1];
95 #define TSTAT_TLGT0_NENT 256
96 #define TSTAT_TOTAL_NENT (TSTAT_NENT + TSTAT_TLGT0_NENT)
98 #define TSTAT_ENT_NINSTR 8 /* 8 instructions/entry */
99 #define TSTAT_ENT_SHIFT 5 /* 32 bytes/entry */
100 #define TSTAT_ENT_ITLBMISS 0x64
101 #define TSTAT_ENT_DTLBMISS 0x68
103 #define TSTAT_TLBRET_NINSTR 32
105 #define TSTAT_PROBE_NPAGES 2048
106 #define TSTAT_PROBE_SIZE (TSTAT_PROBE_NPAGES * MMU_PAGESIZE)
107 #define TSTAT_PROBE_NLAPS 10
110 #define TSTAT_TRAPCNT_NINSTR 8
111 #define TSTAT_TLBENT_NINSTR 64
112 #define TSTAT_ENT_IMMUMISS 0x09
113 #define TSTAT_ENT_DMMUMISS 0x31
118 typedef struct tstat_tlbretent
{
119 uint32_t ttlbrent_instr
[TSTAT_TLBRET_NINSTR
];
123 typedef struct tstat_tlbent
{
124 uint32_t ttlbent_instr
[TSTAT_TLBENT_NINSTR
];
129 typedef struct tstat_tlbret
{
130 tstat_tlbretent_t ttlbr_ktlb
;
131 tstat_tlbretent_t ttlbr_ktsb
;
132 tstat_tlbretent_t ttlbr_utlb
;
133 tstat_tlbretent_t ttlbr_utsb
;
136 typedef struct tstat_instr
{
137 uint32_t tinst_traptab
[TSTAT_TOTAL_NENT
* TSTAT_ENT_NINSTR
];
138 tstat_tlbret_t tinst_itlbret
;
139 tstat_tlbret_t tinst_dtlbret
;
141 tstat_tlbent_t tinst_immumiss
;
142 tstat_tlbent_t tinst_dmmumiss
;
143 uint32_t tinst_trapcnt
[TSTAT_TRAPCNT_NINSTR
];
147 typedef struct tstat_tsbmiss_patch_entry
{
150 } tstat_tsbmiss_patch_entry_t
;
157 #error "sun4v trapstat supports up to 508 cpus"
160 #define TSTAT_TLB_STATS 0x1 /* cpu_tstat_flags */
161 #define TSTAT_INSTR_SIZE \
162 ((sizeof (tstat_instr_t) + MMU_PAGESIZE - 1) & ~(MMU_PAGESIZE - 1))
163 #define TSTAT_DATA_SHIFT 13
164 #define TSTAT_DATA_SIZE (1 << TSTAT_DATA_SHIFT) /* 8K per CPU */
165 #define TSTAT_TBA_MASK ~((1 << 15) - 1) /* 32K boundary */
167 #define TSTAT_CPU0_DATA_OFFS(tcpu, mem) \
168 ((uintptr_t)(tcpu)->tcpu_ibase + TSTAT_INSTR_SIZE + \
169 offsetof(tstat_data_t, mem))
173 #define TSTAT_INSTR_PAGES ((sizeof (tstat_instr_t) >> MMU_PAGESHIFT) + 1)
174 #define TSTAT_INSTR_SIZE (TSTAT_INSTR_PAGES * MMU_PAGESIZE)
175 #define TSTAT_TBA_MASK ~((1 << 16) - 1) /* 64K per cpu */
177 #define TSTAT_DATA_OFFS(tcpu, mem) \
178 ((uintptr_t)(tcpu)->tcpu_dbase + offsetof(tstat_data_t, mem))
182 #define TSTAT_INSTR_OFFS(tcpu, mem) \
183 ((uintptr_t)(tcpu)->tcpu_ibase + offsetof(tstat_instr_t, mem))
185 #define TSTAT_CPU_SELECTED 0x0001
186 #define TSTAT_CPU_ALLOCATED 0x0002
187 #define TSTAT_CPU_ENABLED 0x0004
189 #define TSTAT_OPT_CPU 0x0001
190 #define TSTAT_OPT_NOGO 0x0002
191 #define TSTAT_OPT_TLBDATA 0x0004
192 #define TSTAT_OPT_ENTRY 0x0008
194 #define TSTAT_TSBMISS_INSTR 0x8e01e000 /* add %g7, 0, %g7 */
198 typedef struct tstat_percpu
{
205 tstat_instr_t
*tcpu_instr
;
206 tstat_data_t
*tcpu_data
;
216 #endif /* _SYS_TRAPSTAT_H */