]> git.saurik.com Git - apple/xnu.git/blobdiff - osfmk/i386/postcode.h
xnu-2422.90.20.tar.gz
[apple/xnu.git] / osfmk / i386 / postcode.h
index d0065f7a6c818909f340bd72fcadc68641c45cfe..d2a8593547e946f7d293b05f7a5f55ef9aba8fe6 100644 (file)
@@ -1,42 +1,51 @@
 /*
 /*
- * Copyright (c) 2003 Apple Computer, Inc. All rights reserved.
+ * Copyright (c) 2008 Apple Computer, Inc. All rights reserved.
  *
  *
- * @APPLE_LICENSE_HEADER_START@
+ * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
  * 
  * 
- * The contents of this file constitute Original Code as defined in and
- * are subject to the Apple Public Source License Version 1.1 (the
- * "License").  You may not use this file except in compliance with the
- * License.  Please obtain a copy of the License at
- * http://www.apple.com/publicsource and read it before using this file.
+ * This file contains Original Code and/or Modifications of Original Code
+ * as defined in and that are subject to the Apple Public Source License
+ * Version 2.0 (the 'License'). You may not use this file except in
+ * compliance with the License. The rights granted to you under the License
+ * may not be used to create, or enable the creation or redistribution of,
+ * unlawful or unlicensed copies of an Apple operating system, or to
+ * circumvent, violate, or enable the circumvention or violation of, any
+ * terms of an Apple operating system software license agreement.
  * 
  * 
- * This Original Code and all software distributed under the License are
- * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * Please obtain a copy of the License at
+ * http://www.opensource.apple.com/apsl/ and read it before using this file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
- * License for the specific language governing rights and limitations
- * under the License.
+ * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
+ * Please see the License for the specific language governing rights and
+ * limitations under the License.
  * 
  * 
- * @APPLE_LICENSE_HEADER_END@
+ * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
  */
 
 #ifndef        _I386_POSTCODE_H_
 #define        _I386_POSTCODE_H_
 
  */
 
 #ifndef        _I386_POSTCODE_H_
 #define        _I386_POSTCODE_H_
 
-#ifndef DEBUG
-#include <debug.h>
-#endif
+/*
+ * Postcodes are no longer enabled by default in the DEBUG kernel
+ * because platforms may not have builtin port 0x80 support.
+ * To re-enable postcode outpout, uncomment the following define:
+ */
+//#define DEBUG_POSTCODE 1
 
 /* Define this to delay about 1 sec after posting each code */
 
 /* Define this to delay about 1 sec after posting each code */
-/* #define POSTCODE_DELAY 1 */
+//#define POSTCODE_DELAY 1
 
 /* The POSTCODE is port 0x80 */
 #define        POSTPORT 0x80
 
 
 /* The POSTCODE is port 0x80 */
 #define        POSTPORT 0x80
 
-#define        SPINCOUNT       100000000
+#define        SPINCOUNT       300000000
 #define CPU_PAUSE()    rep; nop
 
 #define CPU_PAUSE()    rep; nop
 
-#if DEBUG
+#if DEBUG_POSTCODE
 /*
  * Macro to output byte value to postcode, destoying register al.
  * Additionally, if POSTCODE_DELAY, spin for about a second.
 /*
  * Macro to output byte value to postcode, destoying register al.
  * Additionally, if POSTCODE_DELAY, spin for about a second.
        CPU_PAUSE();                    \
        decl    %eax;                   \
        jne     1b
        CPU_PAUSE();                    \
        decl    %eax;                   \
        jne     1b
+#define POSTCODE_AX                    \
+        outw    %ax,$(POSTPORT);       \
+       movl    $(SPINCOUNT), %eax;     \
+1:                                     \
+       CPU_PAUSE();                    \
+       decl    %eax;                   \
+       jne     1b
 #else
 #define POSTCODE_AL                    \
         outb    %al,$(POSTPORT)
 #else
 #define POSTCODE_AL                    \
         outb    %al,$(POSTPORT)
+#define POSTCODE_AX                    \
+        outw    %ax,$(POSTPORT)
 #endif /* POSTCODE_DELAY */
 
 #define POSTCODE(XX)                   \
        mov     $(XX), %al;             \
        POSTCODE_AL
 
 #endif /* POSTCODE_DELAY */
 
 #define POSTCODE(XX)                   \
        mov     $(XX), %al;             \
        POSTCODE_AL
 
+#define POSTCODE2(XXXX)                        \
+       mov     $(XXXX), %ax;           \
+       POSTCODE_AX
+
 /* Output byte value to postcode, without destoying register eax */ 
 #define        POSTCODE_SAVE_EAX(XX)           \
        push    %eax;                   \
 /* Output byte value to postcode, without destoying register eax */ 
 #define        POSTCODE_SAVE_EAX(XX)           \
        push    %eax;                   \
        movl    %ebx, %eax;             \
        POSTCODE_AL
 
        movl    %ebx, %eax;             \
        POSTCODE_AL
 
-#else  /* DEBUG */
+#else  /* DEBUG_POSTCODE */
 #define POSTCODE_AL
 #define POSTCODE_AL
+#define POSTCODE_AX
 #define POSTCODE(X)
 #define POSTCODE(X)
+#define POSTCODE2(X)
+#define POSTCODE_SAVE_EAX(X)
 #define POSTCODE32_EBX
 #define POSTCODE32_EBX
-#endif /* DEBUG */
+#endif /* DEBUG_POSTCODE */
 
 /*
  * The following postcodes are defined for stages of early startup:
  */
 
 
 /*
  * The following postcodes are defined for stages of early startup:
  */
 
-#define        PSTART_ENTRY            0xFF
-#define PSTART_PAGE_TABLES     0xFE
-#define PSTART_BEFORE_PAGING   0xFD
-#define VSTART_ENTRY           0xFC
-#define VSTART_STACK_SWITCH    0xFB
-#define VSTART_EXIT            0xFA
-#define        I386_INIT_ENTRY         0xF9
-#define        CPU_INIT_D              0xF8
-#define        PROCESSOR_BOOTSTRAP_D   0xF7
-#define        PE_INIT_PLATFORM_D      0xF6
-#define        THREAD_BOOTSTRAP_D      0xF5
-
-#define        SLAVE_PSTART_ENTRY      0xEF
-#define        REAL_TO_PROT_ENTRY      0xEE
-#define        REAL_TO_PROT_EXIT       0xED
-#define        STARTPROG_ENTRY         0xEC
-#define        STARTPROG_EXIT          0xEB
-#define        SLAVE_START_ENTRY       0xEA
-#define        SLAVE_START_EXIT        0xE9
-#define        SVSTART_ENTRY           0xE8
-#define        SVSTART_DESC_INIT       0xE7
-#define        SVSTART_STACK_SWITCH    0xE6
-#define        SVSTART_EXIT            0xE5
-#define        I386_INIT_SLAVE         0xE4
-
-#define        MP_KDP_ENTER            0xDB            /* Machine in kdp DeBugger */
-#define        PANIC_HLT               0xD1            /* Die an early death */ 
-
-#define ACPI_WAKE_START_ENTRY  0xCF
-#define ACPI_WAKE_PROT_ENTRY   0xCE
-#define ACPI_WAKE_PAGED_ENTRY  0xCD
+#define        PSTART_ENTRY                    0xFF
+#define PSTART_REBASE                  0xFE
+#define PSTART_BEFORE_PAGING           0xFE
+#define        PSTART_VSTART                   0xFD
+#define VSTART_ENTRY                   0xFC
+#define VSTART_IDLE_PTS_INIT           0xFB
+#define VSTART_PHYSMAP_INIT            0xFA
+#define VSTART_DESC_ALIAS_INIT         0xF9
+#define VSTART_SET_CR3                 0xF8
+#define VSTART_CPU_DESC_INIT           0xF7
+#define VSTART_CPU_MODE_INIT           0xF6
+#define VSTART_EXIT                    0xF5
+#define        I386_INIT_ENTRY                 0xF4
+#define        CPU_INIT_D                      0xF3
+#define        PE_INIT_PLATFORM_D              0xF2
+
+#define        SLAVE_STARTPROG_ENTRY           0xEF
+#define        SLAVE_PSTART                    0xEE
+#define        I386_INIT_SLAVE                 0xED
+
+#define        PANIC_DOUBLE_FAULT              0xDF    /* Double Fault exception */
+#define        PANIC_MACHINE_CHECK             0xDE    /* Machine-Check */
+#define        MP_KDP_ENTER                    0xDB    /* Machine in kdp DeBugger */
+#define        PANIC_HLT                       0xD1    /* Die an early death */ 
+#define        NO_64BIT                        0x64    /* No 64-bit support yet */
+
+#define ACPI_WAKE_START_ENTRY          0xCF
+#define ACPI_WAKE_PROT_ENTRY           0xCE
+#define ACPI_WAKE_PAGED_ENTRY          0xCD
+
+#define        CPU_IA32_ENABLE_ENTRY           0xBF
+#define        CPU_IA32_ENABLE_EXIT            0xBE
+#define ML_LOAD_DESC64_ENTRY           0xBD
+#define ML_LOAD_DESC64_GDT             0xBC
+#define ML_LOAD_DESC64_IDT             0xBB
+#define ML_LOAD_DESC64_LDT             0xBA
+#define ML_LOAD_DESC64_EXIT            0xB9
+#define        CPU_IA32_DISABLE_ENTRY          0xB8
+#define        CPU_IA32_DISABLE_EXIT           0xB7
 
 #ifndef ASSEMBLER
 inline static void
 
 #ifndef ASSEMBLER
 inline static void
@@ -143,7 +176,12 @@ _postcode(uint8_t  xx)
 {
        asm volatile("outb %0, %1" : : "a" (xx), "N" (POSTPORT));
 }
 {
        asm volatile("outb %0, %1" : : "a" (xx), "N" (POSTPORT));
 }
-#if    DEBUG
+inline static void
+_postcode2(uint16_t    xxxx)
+{
+       asm volatile("outw %0, %1" : : "a" (xxxx), "N" (POSTPORT));
+}
+#if    DEBUG_POSTCODE
 inline static void
 postcode(uint8_t       xx)
 {
 inline static void
 postcode(uint8_t       xx)
 {
@@ -152,8 +190,17 @@ postcode(uint8_t   xx)
        _postcode_delay(SPINCOUNT);
 #endif
 }
        _postcode_delay(SPINCOUNT);
 #endif
 }
+inline static void
+postcode2(uint8_t      xxxx)
+{
+       _postcode2(xxxx);
+#if    POSTCODE_DELAY
+       _postcode_delay(SPINCOUNT);
+#endif
+}
 #else
 #else
-#define postcode(xx)
+#define postcode(xx) do {} while(0)
+#define postcode2(xxxx) do {} while(0)
 #endif
 #endif
 
 #endif
 #endif