X-Git-Url: https://git.saurik.com/apple/xnu.git/blobdiff_plain/89b3af67bb32e691275bf6fa803d1834b2284115..refs/heads/master:/osfmk/i386/postcode.h diff --git a/osfmk/i386/postcode.h b/osfmk/i386/postcode.h index a9a637e6d..960b7d32c 100644 --- a/osfmk/i386/postcode.h +++ b/osfmk/i386/postcode.h @@ -1,8 +1,8 @@ /* - * Copyright (c) 2003 Apple Computer, Inc. All rights reserved. + * Copyright (c) 2008 Apple Computer, Inc. All rights reserved. * * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ - * + * * 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 @@ -11,10 +11,10 @@ * 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. - * + * * 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, @@ -22,158 +22,186 @@ * 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_OSREFERENCE_LICENSE_HEADER_END@ */ -#ifndef _I386_POSTCODE_H_ -#define _I386_POSTCODE_H_ +#ifndef _I386_POSTCODE_H_ +#define _I386_POSTCODE_H_ -#ifndef DEBUG -#include -#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 POSTCODE_DELAY 1 */ +//#define POSTCODE_DELAY 1 /* The POSTCODE is port 0x80 */ -#define POSTPORT 0x80 +#define POSTPORT 0x80 -#define SPINCOUNT 300000000 -#define CPU_PAUSE() rep; nop +#define SPINCOUNT 300000000 +#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. */ - #if POSTCODE_DELAY -#define POSTCODE_AL \ - outb %al,$(POSTPORT); \ - movl $(SPINCOUNT), %eax; \ -1: \ - CPU_PAUSE(); \ - decl %eax; \ +#define POSTCODE_AL \ + outb %al,$(POSTPORT); \ + movl $(SPINCOUNT), %eax; \ +1: \ + 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) +#define POSTCODE_AL \ + outb %al,$(POSTPORT) +#define POSTCODE_AX \ + outw %ax,$(POSTPORT) #endif /* POSTCODE_DELAY */ -#define POSTCODE(XX) \ - mov $(XX), %al; \ +#define POSTCODE(XX) \ + mov $(XX), %al; \ POSTCODE_AL -/* Output byte value to postcode, without destoying register eax */ -#define POSTCODE_SAVE_EAX(XX) \ - push %eax; \ - POSTCODE(XX); \ +#define POSTCODE2(XXXX) \ + mov $(XXXX), %ax; \ + POSTCODE_AX + +/* Output byte value to postcode, without destoying register eax */ +#define POSTCODE_SAVE_EAX(XX) \ + push %eax; \ + POSTCODE(XX); \ pop %eax /* * Display a 32-bit value to the post card - low byte to high byte * Entry: value in %ebx * Exit: %ebx preserved; %eax destroyed - */ -#define POSTCODE32_EBX \ - roll $8, %ebx; \ - movl %ebx, %eax; \ - POSTCODE_AL; \ - \ - roll $8, %ebx; \ - movl %ebx, %eax; \ - POSTCODE_AL; \ - \ - roll $8, %ebx; \ - movl %ebx, %eax; \ - POSTCODE_AL; \ - \ - roll $8, %ebx; \ - movl %ebx, %eax; \ + */ +#define POSTCODE32_EBX \ + roll $8, %ebx; \ + movl %ebx, %eax; \ + POSTCODE_AL; \ + \ + roll $8, %ebx; \ + movl %ebx, %eax; \ + POSTCODE_AL; \ + \ + roll $8, %ebx; \ + movl %ebx, %eax; \ + POSTCODE_AL; \ + \ + roll $8, %ebx; \ + movl %ebx, %eax; \ POSTCODE_AL -#else /* DEBUG */ +#else /* DEBUG_POSTCODE */ #define POSTCODE_AL +#define POSTCODE_AX #define POSTCODE(X) +#define POSTCODE2(X) +#define POSTCODE_SAVE_EAX(X) #define POSTCODE32_EBX -#endif /* DEBUG */ +#endif /* DEBUG_POSTCODE */ /* * The following postcodes are defined for stages of early startup: */ -#define _PSTART_ENTRY 0xFF -#define _PSTART_RELOC 0xFE -#define PSTART_ENTRY 0xFD -#define PSTART_PAGE_TABLES 0xFC -#define PSTART_BEFORE_PAGING 0xFB -#define VSTART_ENTRY 0xFA -#define VSTART_STACK_SWITCH 0xF9 -#define VSTART_EXIT 0xF8 -#define I386_INIT_ENTRY 0xF7 -#define CPU_INIT_D 0xF6 -#define PE_INIT_PLATFORM_D 0xF5 - -#define SLAVE_RSTART_ENTRY 0xEF -#define SLAVE_REAL_TO_PROT_ENTRY 0xEE -#define SLAVE_REAL_TO_PROT_EXIT 0xED -#define SLAVE_STARTPROG_ENTRY 0xEC -#define SLAVE_STARTPROG_EXIT 0xEB -#define SLAVE_PSTART_ENTRY 0xEA -#define SLAVE_PSTART_EXIT 0xE9 -#define SLAVE_VSTART_ENTRY 0xE8 -#define SLAVE_VSTART_DESC_INIT 0xE7 -#define SLAVE_VSTART_STACK_SWITCH 0xE6 -#define SLAVE_VSTART_EXIT 0xE5 -#define I386_INIT_SLAVE 0xE4 - -#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 +#define PSTART_ENTRY 0xFF +#define PSTART_REBASE 0xFE +#define PSTART_BEFORE_PAGING 0xFE +#define PSTART_VSTART 0xFD +#define VSTART_ENTRY 0xFC +#define VSTART_IDT_INIT 0xFB +#define VSTART_IDLE_PTS_INIT 0xFA +#define VSTART_PHYSMAP_INIT 0xF9 +#define VSTART_DESC_ALIAS_INIT 0xF8 +#define VSTART_SET_CR3 0xF7 +#define VSTART_CPU_DESC_INIT 0xF6 +#define VSTART_CPU_MODE_INIT 0xF5 +#define VSTART_EXIT 0xF4 +#define I386_INIT_ENTRY 0xF3 +#define CPU_INIT_D 0xF2 +#define PE_INIT_PLATFORM_D 0xF1 + +#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 0xDC /* Machine-Check */ +#define MP_KDP_ENTER 0xDB /* Debugger Begin */ +#define MP_KDP_EXIT 0xDE /* Debugger End */ +#define PANIC_HLT 0xD1 /* Die an early death */ +#define BOOT_TRAP_HLT 0xD0 /* D'oh! even earlier */ + +#define ACPI_WAKE_START_ENTRY 0xCF +#define ACPI_WAKE_PROT_ENTRY 0xCE +#define ACPI_WAKE_PAGED_ENTRY 0xCD + +#define CPU_DESC_LOAD_ENTRY 0xBF +#define CPU_DESC_LOAD_GS_BASE 0xBE +#define CPU_DESC_LOAD_KERNEL_GS_BASE 0xBD +#define CPU_DESC_LOAD_GDT 0xBC +#define CPU_DESC_LOAD_IDT 0xBB +#define CPU_DESC_LOAD_LDT 0xBA +#define CPU_DESC_LOAD_TSS 0xB9 +#define CPU_DESC_LOAD_EXIT 0xB7 #ifndef ASSEMBLER inline static void -_postcode_delay(uint32_t spincount) +_postcode_delay(uint32_t spincount) { - asm volatile("1: \n\t" - " rep; nop; \n\t" - " decl %%eax; \n\t" - " jne 1b" - : : "a" (spincount)); + asm volatile ("1: \n\t" + " rep; nop; \n\t" + " decl %%eax; \n\t" + " jne 1b" + : : "a" (spincount)); } inline static void -_postcode(uint8_t xx) +_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 -postcode(uint8_t xx) +_postcode2(uint16_t xxxx) +{ + asm volatile ("outw %0, %1" : : "a" (xxxx), "N" (POSTPORT)); +} +#if DEBUG_POSTCODE +inline static void +postcode(uint8_t xx) { _postcode(xx); -#if POSTCODE_DELAY +#if POSTCODE_DELAY + _postcode_delay(SPINCOUNT); +#endif +} +inline static void +postcode2(uint8_t xxxx) +{ + _postcode2(xxxx); +#if POSTCODE_DELAY _postcode_delay(SPINCOUNT); #endif } #else -#define postcode(xx) +#define postcode(xx) do {} while(0) +#define postcode2(xxxx) do {} while(0) #endif #endif