xref: /xnu-10002.81.5/osfmk/i386/Diagnostics.h (revision 5e3eaea39dcf651e66cb99ba7d70e32cc4a99587)
1 /*
2  * Copyright (c) 2005 Apple Computer, Inc. All rights reserved.
3  *
4  * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
5  *
6  * This file contains Original Code and/or Modifications of Original Code
7  * as defined in and that are subject to the Apple Public Source License
8  * Version 2.0 (the 'License'). You may not use this file except in
9  * compliance with the License. The rights granted to you under the License
10  * may not be used to create, or enable the creation or redistribution of,
11  * unlawful or unlicensed copies of an Apple operating system, or to
12  * circumvent, violate, or enable the circumvention or violation of, any
13  * terms of an Apple operating system software license agreement.
14  *
15  * Please obtain a copy of the License at
16  * http://www.opensource.apple.com/apsl/ and read it before using this file.
17  *
18  * The Original Code and all software distributed under the License are
19  * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
20  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
21  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
22  * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
23  * Please see the License for the specific language governing rights and
24  * limitations under the License.
25  *
26  * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
27  */
28 /*
29  * @OSF_FREE_COPYRIGHT@
30  */
31 /*
32  * @APPLE_FREE_COPYRIGHT@
33  */
34 
35 /*
36  *	Here are the Diagnostic interface interfaces
37  *	Lovingly crafted by Bill Angell using traditional methods
38  */
39 #ifdef  KERNEL_PRIVATE
40 
41 #ifndef _DIAGNOSTICS_H_
42 #define _DIAGNOSTICS_H_
43 
44 #if !(defined(__i386__) || defined(__x86_64__))
45 #error This file is not useful on non-Intel
46 #endif
47 
48 int diagCall64(x86_saved_state_t *regs);
49 
50 #define diagSCnum 0x00006000
51 
52 #define dgAdjTB 0
53 #define dgLRA 1
54 #define dgpcpy 2
55 #define dgreset 3
56 #define dgtest 4
57 #define dgBMphys 5
58 #define dgUnMap 6
59 #define dgBootScreen 7
60 #define dgFlush 8
61 #define dgAlign 9
62 #define dgGzallocTest 10
63 #define dgmck 11
64 #define dg64 12
65 #define dgProbeRead 13
66 #define dgCPNull 14
67 #define dgPerfMon 15
68 #define dgMapPage 16
69 #define dgPowerStat 17
70 #define dgBind 18
71 #define dgAcntg 20
72 #define dgKlra 21
73 #define dgEnaPMC 22
74 #define dgWar 23
75 #define dgNapStat 24
76 #define dgRuptStat 25
77 #define dgPermCheck 26
78 
79 typedef struct diagWork {                       /* Diagnostic work area */
80 	unsigned int dgLock;                    /* Lock if needed */
81 	unsigned int dgFlags;                   /* Flags */
82 #define enaExpTrace 0x00000001
83 #define enaUsrFCall 0x00000002
84 #define enaUsrPhyMp 0x00000004
85 #define enaDiagSCs  0x00000008
86 #define enaDiagDM  0x00000010
87 #define enaDiagEM  0x00000020
88 #define enaDiagTrap  0x00000040
89 #define enaNotifyEM  0x00000080
90 
91 	unsigned int dgMisc0;
92 	unsigned int dgMisc1;
93 	unsigned int dgMisc2;
94 	unsigned int dgMisc3;
95 	unsigned int dgMisc4;
96 	unsigned int dgMisc5;
97 } diagWork;
98 
99 extern diagWork dgWork;
100 
101 #define FIXED_PMC (1 << 30)
102 #define FIXED_PMC0 (FIXED_PMC)
103 #define FIXED_PMC1 (FIXED_PMC | 1)
104 #define FIXED_PMC2 (FIXED_PMC | 2)
105 #define GPMC0 (0)
106 #define GPMC1 (1)
107 #define GPMC2 (2)
108 #define GPMC3 (3)
109 
110 static inline uint64_t
read_pmc(uint32_t counter)111 read_pmc(uint32_t counter)
112 {
113 	uint32_t lo = 0, hi = 0;
114 	__asm__ volatile ("rdpmc" : "=a" (lo), "=d" (hi) : "c" (counter));
115 	return (((uint64_t)hi) << 32) | ((uint64_t)lo);
116 }
117 #endif /* _DIAGNOSTICS_H_ */
118 
119 #endif /* KERNEL_PRIVATE */
120