1/* 2 * Copyright (c) 2000-2009 Apple 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#ifndef _PEXPERT_PEXPERT_H_ 29#define _PEXPERT_PEXPERT_H_ 30 31#include <sys/cdefs.h> 32 33#ifdef KERNEL 34#include <IOKit/IOInterrupts.h> 35#include <kern/kern_types.h> 36#endif 37 38__BEGIN_DECLS 39#include <mach/boolean.h> 40#include <mach/kern_return.h> 41#include <mach/machine/vm_types.h> 42 43#ifdef PEXPERT_KERNEL_PRIVATE 44#include <pexpert/protos.h> 45#endif 46#include <pexpert/boot.h> 47 48#if defined(PEXPERT_KERNEL_PRIVATE) || defined(IOKIT_KERNEL_PRIVATE) 49typedef void *cpu_id_t; 50#else 51typedef void *cpu_id_t; 52#endif 53 54 55void PE_enter_debugger( 56 const char *cause); 57 58void PE_init_platform( 59 boolean_t vm_initialized, 60 void *args); 61 62 63void PE_init_kprintf( 64 boolean_t vm_initialized); 65 66extern int32_t gPESerialBaud; 67 68unsigned int PE_init_taproot(vm_offset_t *taddr); 69 70extern void (*PE_kputc)(char c); 71 72void PE_init_printf( 73 boolean_t vm_initialized); 74 75extern void (*PE_putc)(char c); 76 77void PE_init_iokit( 78 void); 79 80struct clock_frequency_info_t { 81 unsigned long bus_clock_rate_hz; 82 unsigned long cpu_clock_rate_hz; 83 unsigned long dec_clock_rate_hz; 84 unsigned long bus_clock_rate_num; 85 unsigned long bus_clock_rate_den; 86 unsigned long bus_to_cpu_rate_num; 87 unsigned long bus_to_cpu_rate_den; 88 unsigned long bus_to_dec_rate_num; 89 unsigned long bus_to_dec_rate_den; 90 unsigned long timebase_frequency_hz; 91 unsigned long timebase_frequency_num; 92 unsigned long timebase_frequency_den; 93 unsigned long long bus_frequency_hz; 94 unsigned long long bus_frequency_min_hz; 95 unsigned long long bus_frequency_max_hz; 96 unsigned long long cpu_frequency_hz; 97 unsigned long long cpu_frequency_min_hz; 98 unsigned long long cpu_frequency_max_hz; 99 unsigned long long prf_frequency_hz; 100 unsigned long long prf_frequency_min_hz; 101 unsigned long long prf_frequency_max_hz; 102 unsigned long long mem_frequency_hz; 103 unsigned long long mem_frequency_min_hz; 104 unsigned long long mem_frequency_max_hz; 105 unsigned long long fix_frequency_hz; 106}; 107 108typedef struct clock_frequency_info_t clock_frequency_info_t; 109 110extern clock_frequency_info_t gPEClockFrequencyInfo; 111 112struct timebase_freq_t { 113 unsigned long timebase_num; 114 unsigned long timebase_den; 115}; 116 117typedef void (*timebase_callback_func)(struct timebase_freq_t *timebase_freq); 118 119void PE_register_timebase_callback(timebase_callback_func callback); 120 121void PE_call_timebase_callback(void); 122 123#ifdef KERNEL 124void PE_install_interrupt_handler( 125 void *nub, int source, 126 void *target, IOInterruptHandler handler, void *refCon); 127#endif 128 129#ifndef _FN_KPRINTF 130#define _FN_KPRINTF 131void kprintf(const char *fmt, ...) __printflike(1,2); 132#endif 133 134#if KERNEL_PRIVATE 135void _consume_kprintf_args(int, ...); 136#endif 137 138#if CONFIG_NO_KPRINTF_STRINGS 139#if KERNEL_PRIVATE 140#define kprintf(x, ...) _consume_kprintf_args( 0, ## __VA_ARGS__ ) 141#else 142#define kprintf(x, ...) do {} while (0) 143#endif 144#endif 145 146void init_display_putc(unsigned char *baseaddr, int rowbytes, int height); 147void display_putc(char c); 148 149enum { 150 kPEReadTOD, 151 kPEWriteTOD 152}; 153extern int (*PE_read_write_time_of_day)( 154 unsigned int options, 155 long * secs); 156 157enum { 158 kPEWaitForInput = 0x00000001, 159 kPERawInput = 0x00000002 160}; 161extern int (*PE_poll_input)( 162 unsigned int options, 163 char * c); 164 165extern int (*PE_write_IIC)( 166 unsigned char addr, 167 unsigned char reg, 168 unsigned char data); 169 170/* Private Stuff - eventually put in pexpertprivate.h */ 171enum { 172 kDebugTypeNone = 0, 173 kDebugTypeDisplay = 1, 174 kDebugTypeSerial = 2 175}; 176 177/* Scale factor values for PE_Video.v_scale */ 178enum { 179 kPEScaleFactorUnknown = 0, 180 kPEScaleFactor1x = 1, 181 kPEScaleFactor2x = 2 182}; 183 184struct PE_Video { 185 unsigned long v_baseAddr; /* Base address of video memory */ 186 unsigned long v_rowBytes; /* Number of bytes per pixel row */ 187 unsigned long v_width; /* Width */ 188 unsigned long v_height; /* Height */ 189 unsigned long v_depth; /* Pixel Depth */ 190 unsigned long v_display; /* Text or Graphics */ 191 char v_pixelFormat[64]; 192 unsigned long v_offset; /* offset into video memory to start at */ 193 unsigned long v_length; /* length of video memory (0 for v_rowBytes * v_height) */ 194 unsigned char v_rotate; /* Rotation: 0:normal, 1:right 90, 2:left 180, 3:left 90 */ 195 unsigned char v_scale; /* Scale Factor for both X & Y */ 196 char reserved1[2]; 197#ifdef __LP64__ 198 long reserved2; 199#else 200 long v_baseAddrHigh; 201#endif 202}; 203 204typedef struct PE_Video PE_Video; 205 206extern void initialize_screen(PE_Video *, unsigned int); 207 208extern void dim_screen(void); 209 210extern int PE_current_console( 211 PE_Video *info); 212 213extern void PE_create_console( 214 void); 215 216extern int PE_initialize_console( 217 PE_Video *newInfo, 218 int op); 219 220#define kPEGraphicsMode 1 221#define kPETextMode 2 222#define kPETextScreen 3 223#define kPEAcquireScreen 4 224#define kPEReleaseScreen 5 225#define kPEEnableScreen 6 226#define kPEDisableScreen 7 227#define kPEBaseAddressChange 8 228 229extern void PE_display_icon( unsigned int flags, 230 const char * name ); 231 232typedef struct PE_state { 233 boolean_t initialized; 234 PE_Video video; 235 void *deviceTreeHead; 236 void *bootArgs; 237} PE_state_t; 238 239extern PE_state_t PE_state; 240 241extern char * PE_boot_args( 242 void); 243 244#if !defined(__LP64__) && !defined(__arm__) 245extern boolean_t PE_parse_boot_arg( 246 const char *arg_string, 247 void *arg_ptr) __deprecated; 248#endif 249 250extern boolean_t PE_parse_boot_argn( 251 const char *arg_string, 252 void *arg_ptr, 253 int max_arg); 254 255extern boolean_t PE_get_default( 256 const char *property_name, 257 void *property_ptr, 258 unsigned int max_property); 259 260#define PE_default_value(_key, _variable, _default) \ 261 do { \ 262 if (!PE_get_default((_key), &(_variable), sizeof(_variable))) \ 263 _variable = _default; \ 264 } while(0) 265 266enum { 267 kPEOptionKey = 0x3a, 268 kPECommandKey = 0x37, 269 kPEControlKey = 0x36, 270 kPEShiftKey = 0x38 271}; 272 273extern boolean_t PE_get_hotkey( 274 unsigned char key); 275 276extern kern_return_t PE_cpu_start( 277 cpu_id_t target, 278 vm_offset_t start_paddr, 279 vm_offset_t arg_paddr); 280 281extern void PE_cpu_halt( 282 cpu_id_t target); 283 284extern void PE_cpu_signal( 285 cpu_id_t source, 286 cpu_id_t target); 287 288extern void PE_cpu_machine_init( 289 cpu_id_t target, 290 boolean_t bootb); 291 292extern void PE_cpu_machine_quiesce( 293 cpu_id_t target); 294 295extern void pe_init_debug(void); 296 297extern boolean_t PE_imgsrc_mount_supported(void); 298 299 300#if KERNEL_PRIVATE 301boolean_t PE_reboot_on_panic(void); 302#endif 303 304__END_DECLS 305 306#endif /* _PEXPERT_PEXPERT_H_ */ 307