1*aca3beaaSApple OSS Distributions /*
2*aca3beaaSApple OSS Distributions * Copyright (c) 2008 Apple Computer, Inc. All rights reserved.
3*aca3beaaSApple OSS Distributions *
4*aca3beaaSApple OSS Distributions * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
5*aca3beaaSApple OSS Distributions *
6*aca3beaaSApple OSS Distributions * This file contains Original Code and/or Modifications of Original Code
7*aca3beaaSApple OSS Distributions * as defined in and that are subject to the Apple Public Source License
8*aca3beaaSApple OSS Distributions * Version 2.0 (the 'License'). You may not use this file except in
9*aca3beaaSApple OSS Distributions * compliance with the License. The rights granted to you under the License
10*aca3beaaSApple OSS Distributions * may not be used to create, or enable the creation or redistribution of,
11*aca3beaaSApple OSS Distributions * unlawful or unlicensed copies of an Apple operating system, or to
12*aca3beaaSApple OSS Distributions * circumvent, violate, or enable the circumvention or violation of, any
13*aca3beaaSApple OSS Distributions * terms of an Apple operating system software license agreement.
14*aca3beaaSApple OSS Distributions *
15*aca3beaaSApple OSS Distributions * Please obtain a copy of the License at
16*aca3beaaSApple OSS Distributions * http://www.opensource.apple.com/apsl/ and read it before using this file.
17*aca3beaaSApple OSS Distributions *
18*aca3beaaSApple OSS Distributions * The Original Code and all software distributed under the License are
19*aca3beaaSApple OSS Distributions * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
20*aca3beaaSApple OSS Distributions * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
21*aca3beaaSApple OSS Distributions * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
22*aca3beaaSApple OSS Distributions * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
23*aca3beaaSApple OSS Distributions * Please see the License for the specific language governing rights and
24*aca3beaaSApple OSS Distributions * limitations under the License.
25*aca3beaaSApple OSS Distributions *
26*aca3beaaSApple OSS Distributions * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
27*aca3beaaSApple OSS Distributions */
28*aca3beaaSApple OSS Distributions
29*aca3beaaSApple OSS Distributions #ifndef _I386_POSTCODE_H_
30*aca3beaaSApple OSS Distributions #define _I386_POSTCODE_H_
31*aca3beaaSApple OSS Distributions
32*aca3beaaSApple OSS Distributions /*
33*aca3beaaSApple OSS Distributions * Postcodes are no longer enabled by default in the DEBUG kernel
34*aca3beaaSApple OSS Distributions * because platforms may not have builtin port 0x80 support.
35*aca3beaaSApple OSS Distributions * To re-enable postcode outpout, uncomment the following define:
36*aca3beaaSApple OSS Distributions */
37*aca3beaaSApple OSS Distributions //#define DEBUG_POSTCODE 1
38*aca3beaaSApple OSS Distributions
39*aca3beaaSApple OSS Distributions /* Define this to delay about 1 sec after posting each code */
40*aca3beaaSApple OSS Distributions //#define POSTCODE_DELAY 1
41*aca3beaaSApple OSS Distributions
42*aca3beaaSApple OSS Distributions /* The POSTCODE is port 0x80 */
43*aca3beaaSApple OSS Distributions #define POSTPORT 0x80
44*aca3beaaSApple OSS Distributions
45*aca3beaaSApple OSS Distributions #define SPINCOUNT 300000000
46*aca3beaaSApple OSS Distributions #define CPU_PAUSE() rep; nop
47*aca3beaaSApple OSS Distributions
48*aca3beaaSApple OSS Distributions #if DEBUG_POSTCODE
49*aca3beaaSApple OSS Distributions /*
50*aca3beaaSApple OSS Distributions * Macro to output byte value to postcode, destoying register al.
51*aca3beaaSApple OSS Distributions * Additionally, if POSTCODE_DELAY, spin for about a second.
52*aca3beaaSApple OSS Distributions */
53*aca3beaaSApple OSS Distributions #if POSTCODE_DELAY
54*aca3beaaSApple OSS Distributions #define POSTCODE_AL \
55*aca3beaaSApple OSS Distributions outb %al,$(POSTPORT); \
56*aca3beaaSApple OSS Distributions movl $(SPINCOUNT), %eax; \
57*aca3beaaSApple OSS Distributions 1: \
58*aca3beaaSApple OSS Distributions CPU_PAUSE(); \
59*aca3beaaSApple OSS Distributions decl %eax; \
60*aca3beaaSApple OSS Distributions jne 1b
61*aca3beaaSApple OSS Distributions #define POSTCODE_AX \
62*aca3beaaSApple OSS Distributions outw %ax,$(POSTPORT); \
63*aca3beaaSApple OSS Distributions movl $(SPINCOUNT), %eax; \
64*aca3beaaSApple OSS Distributions 1: \
65*aca3beaaSApple OSS Distributions CPU_PAUSE(); \
66*aca3beaaSApple OSS Distributions decl %eax; \
67*aca3beaaSApple OSS Distributions jne 1b
68*aca3beaaSApple OSS Distributions #else
69*aca3beaaSApple OSS Distributions #define POSTCODE_AL \
70*aca3beaaSApple OSS Distributions outb %al,$(POSTPORT)
71*aca3beaaSApple OSS Distributions #define POSTCODE_AX \
72*aca3beaaSApple OSS Distributions outw %ax,$(POSTPORT)
73*aca3beaaSApple OSS Distributions #endif /* POSTCODE_DELAY */
74*aca3beaaSApple OSS Distributions
75*aca3beaaSApple OSS Distributions #define POSTCODE(XX) \
76*aca3beaaSApple OSS Distributions mov $(XX), %al; \
77*aca3beaaSApple OSS Distributions POSTCODE_AL
78*aca3beaaSApple OSS Distributions
79*aca3beaaSApple OSS Distributions #define POSTCODE2(XXXX) \
80*aca3beaaSApple OSS Distributions mov $(XXXX), %ax; \
81*aca3beaaSApple OSS Distributions POSTCODE_AX
82*aca3beaaSApple OSS Distributions
83*aca3beaaSApple OSS Distributions /* Output byte value to postcode, without destoying register eax */
84*aca3beaaSApple OSS Distributions #define POSTCODE_SAVE_EAX(XX) \
85*aca3beaaSApple OSS Distributions push %eax; \
86*aca3beaaSApple OSS Distributions POSTCODE(XX); \
87*aca3beaaSApple OSS Distributions pop %eax
88*aca3beaaSApple OSS Distributions
89*aca3beaaSApple OSS Distributions /*
90*aca3beaaSApple OSS Distributions * Display a 32-bit value to the post card - low byte to high byte
91*aca3beaaSApple OSS Distributions * Entry: value in %ebx
92*aca3beaaSApple OSS Distributions * Exit: %ebx preserved; %eax destroyed
93*aca3beaaSApple OSS Distributions */
94*aca3beaaSApple OSS Distributions #define POSTCODE32_EBX \
95*aca3beaaSApple OSS Distributions roll $8, %ebx; \
96*aca3beaaSApple OSS Distributions movl %ebx, %eax; \
97*aca3beaaSApple OSS Distributions POSTCODE_AL; \
98*aca3beaaSApple OSS Distributions \
99*aca3beaaSApple OSS Distributions roll $8, %ebx; \
100*aca3beaaSApple OSS Distributions movl %ebx, %eax; \
101*aca3beaaSApple OSS Distributions POSTCODE_AL; \
102*aca3beaaSApple OSS Distributions \
103*aca3beaaSApple OSS Distributions roll $8, %ebx; \
104*aca3beaaSApple OSS Distributions movl %ebx, %eax; \
105*aca3beaaSApple OSS Distributions POSTCODE_AL; \
106*aca3beaaSApple OSS Distributions \
107*aca3beaaSApple OSS Distributions roll $8, %ebx; \
108*aca3beaaSApple OSS Distributions movl %ebx, %eax; \
109*aca3beaaSApple OSS Distributions POSTCODE_AL
110*aca3beaaSApple OSS Distributions
111*aca3beaaSApple OSS Distributions #else /* DEBUG_POSTCODE */
112*aca3beaaSApple OSS Distributions #define POSTCODE_AL
113*aca3beaaSApple OSS Distributions #define POSTCODE_AX
114*aca3beaaSApple OSS Distributions #define POSTCODE(X)
115*aca3beaaSApple OSS Distributions #define POSTCODE2(X)
116*aca3beaaSApple OSS Distributions #define POSTCODE_SAVE_EAX(X)
117*aca3beaaSApple OSS Distributions #define POSTCODE32_EBX
118*aca3beaaSApple OSS Distributions #endif /* DEBUG_POSTCODE */
119*aca3beaaSApple OSS Distributions
120*aca3beaaSApple OSS Distributions /*
121*aca3beaaSApple OSS Distributions * The following postcodes are defined for stages of early startup:
122*aca3beaaSApple OSS Distributions */
123*aca3beaaSApple OSS Distributions
124*aca3beaaSApple OSS Distributions #define PSTART_ENTRY 0xFF
125*aca3beaaSApple OSS Distributions #define PSTART_REBASE 0xFE
126*aca3beaaSApple OSS Distributions #define PSTART_BEFORE_PAGING 0xFE
127*aca3beaaSApple OSS Distributions #define PSTART_VSTART 0xFD
128*aca3beaaSApple OSS Distributions #define VSTART_ENTRY 0xFC
129*aca3beaaSApple OSS Distributions #define VSTART_IDT_INIT 0xFB
130*aca3beaaSApple OSS Distributions #define VSTART_IDLE_PTS_INIT 0xFA
131*aca3beaaSApple OSS Distributions #define VSTART_PHYSMAP_INIT 0xF9
132*aca3beaaSApple OSS Distributions #define VSTART_DESC_ALIAS_INIT 0xF8
133*aca3beaaSApple OSS Distributions #define VSTART_SET_CR3 0xF7
134*aca3beaaSApple OSS Distributions #define VSTART_CPU_DESC_INIT 0xF6
135*aca3beaaSApple OSS Distributions #define VSTART_CPU_MODE_INIT 0xF5
136*aca3beaaSApple OSS Distributions #define VSTART_EXIT 0xF4
137*aca3beaaSApple OSS Distributions #define I386_INIT_ENTRY 0xF3
138*aca3beaaSApple OSS Distributions #define CPU_INIT_D 0xF2
139*aca3beaaSApple OSS Distributions #define PE_INIT_PLATFORM_D 0xF1
140*aca3beaaSApple OSS Distributions
141*aca3beaaSApple OSS Distributions #define SLAVE_STARTPROG_ENTRY 0xEF
142*aca3beaaSApple OSS Distributions #define SLAVE_PSTART 0xEE
143*aca3beaaSApple OSS Distributions #define I386_INIT_SLAVE 0xED
144*aca3beaaSApple OSS Distributions
145*aca3beaaSApple OSS Distributions #define PANIC_DOUBLE_FAULT 0xDF /* Double Fault exception */
146*aca3beaaSApple OSS Distributions #define PANIC_MACHINE_CHECK 0xDC /* Machine-Check */
147*aca3beaaSApple OSS Distributions #define MP_KDP_ENTER 0xDB /* Debugger Begin */
148*aca3beaaSApple OSS Distributions #define MP_KDP_EXIT 0xDE /* Debugger End */
149*aca3beaaSApple OSS Distributions #define PANIC_HLT 0xD1 /* Die an early death */
150*aca3beaaSApple OSS Distributions #define BOOT_TRAP_HLT 0xD0 /* D'oh! even earlier */
151*aca3beaaSApple OSS Distributions
152*aca3beaaSApple OSS Distributions #define ACPI_WAKE_START_ENTRY 0xCF
153*aca3beaaSApple OSS Distributions #define ACPI_WAKE_PROT_ENTRY 0xCE
154*aca3beaaSApple OSS Distributions #define ACPI_WAKE_PAGED_ENTRY 0xCD
155*aca3beaaSApple OSS Distributions
156*aca3beaaSApple OSS Distributions #define CPU_DESC_LOAD_ENTRY 0xBF
157*aca3beaaSApple OSS Distributions #define CPU_DESC_LOAD_GS_BASE 0xBE
158*aca3beaaSApple OSS Distributions #define CPU_DESC_LOAD_KERNEL_GS_BASE 0xBD
159*aca3beaaSApple OSS Distributions #define CPU_DESC_LOAD_GDT 0xBC
160*aca3beaaSApple OSS Distributions #define CPU_DESC_LOAD_IDT 0xBB
161*aca3beaaSApple OSS Distributions #define CPU_DESC_LOAD_LDT 0xBA
162*aca3beaaSApple OSS Distributions #define CPU_DESC_LOAD_TSS 0xB9
163*aca3beaaSApple OSS Distributions #define CPU_DESC_LOAD_EXIT 0xB7
164*aca3beaaSApple OSS Distributions
165*aca3beaaSApple OSS Distributions #ifndef ASSEMBLER
166*aca3beaaSApple OSS Distributions inline static void
_postcode_delay(uint32_t spincount)167*aca3beaaSApple OSS Distributions _postcode_delay(uint32_t spincount)
168*aca3beaaSApple OSS Distributions {
169*aca3beaaSApple OSS Distributions asm volatile ("1: \n\t"
170*aca3beaaSApple OSS Distributions " rep; nop; \n\t"
171*aca3beaaSApple OSS Distributions " decl %%eax; \n\t"
172*aca3beaaSApple OSS Distributions " jne 1b"
173*aca3beaaSApple OSS Distributions : : "a" (spincount));
174*aca3beaaSApple OSS Distributions }
175*aca3beaaSApple OSS Distributions inline static void
_postcode(uint8_t xx)176*aca3beaaSApple OSS Distributions _postcode(uint8_t xx)
177*aca3beaaSApple OSS Distributions {
178*aca3beaaSApple OSS Distributions asm volatile ("outb %0, %1" : : "a" (xx), "N" (POSTPORT));
179*aca3beaaSApple OSS Distributions }
180*aca3beaaSApple OSS Distributions inline static void
_postcode2(uint16_t xxxx)181*aca3beaaSApple OSS Distributions _postcode2(uint16_t xxxx)
182*aca3beaaSApple OSS Distributions {
183*aca3beaaSApple OSS Distributions asm volatile ("outw %0, %1" : : "a" (xxxx), "N" (POSTPORT));
184*aca3beaaSApple OSS Distributions }
185*aca3beaaSApple OSS Distributions #if DEBUG_POSTCODE
186*aca3beaaSApple OSS Distributions inline static void
postcode(uint8_t xx)187*aca3beaaSApple OSS Distributions postcode(uint8_t xx)
188*aca3beaaSApple OSS Distributions {
189*aca3beaaSApple OSS Distributions _postcode(xx);
190*aca3beaaSApple OSS Distributions #if POSTCODE_DELAY
191*aca3beaaSApple OSS Distributions _postcode_delay(SPINCOUNT);
192*aca3beaaSApple OSS Distributions #endif
193*aca3beaaSApple OSS Distributions }
194*aca3beaaSApple OSS Distributions inline static void
postcode2(uint8_t xxxx)195*aca3beaaSApple OSS Distributions postcode2(uint8_t xxxx)
196*aca3beaaSApple OSS Distributions {
197*aca3beaaSApple OSS Distributions _postcode2(xxxx);
198*aca3beaaSApple OSS Distributions #if POSTCODE_DELAY
199*aca3beaaSApple OSS Distributions _postcode_delay(SPINCOUNT);
200*aca3beaaSApple OSS Distributions #endif
201*aca3beaaSApple OSS Distributions }
202*aca3beaaSApple OSS Distributions #else
203*aca3beaaSApple OSS Distributions #define postcode(xx) do {} while(0)
204*aca3beaaSApple OSS Distributions #define postcode2(xxxx) do {} while(0)
205*aca3beaaSApple OSS Distributions #endif
206*aca3beaaSApple OSS Distributions #endif
207*aca3beaaSApple OSS Distributions
208*aca3beaaSApple OSS Distributions #endif /* _I386_POSTCODE_H_ */
209