X-Git-Url: https://git.saurik.com/apple/xnu.git/blobdiff_plain/2d21ac55c334faf3a56e5634905ed6987fc787d4..eee3565979933af707c711411001ba11fe406a3c:/pexpert/i386/pe_init.c?ds=sidebyside diff --git a/pexpert/i386/pe_init.c b/pexpert/i386/pe_init.c index feb0a8843..f1e24b31e 100644 --- a/pexpert/i386/pe_init.c +++ b/pexpert/i386/pe_init.c @@ -29,8 +29,10 @@ * file: pe_init.c * i386 platform expert initialization. */ + #include #include +#include #include #include #include @@ -39,6 +41,10 @@ #include #include +#if CONFIG_CSR +#include +#endif + #include "boot_images.h" /* extern references */ @@ -53,6 +59,9 @@ clock_frequency_info_t gPEClockFrequencyInfo; void *gPEEFISystemTable; void *gPEEFIRuntimeServices; +static boot_icon_element* norootIcon_lzss; +static const uint8_t* norootClut_lzss; + int PE_initialize_console( PE_Video * info, int op ) { static int last_console = -1; @@ -74,11 +83,16 @@ int PE_initialize_console( PE_Video * info, int op ) case kPEEnableScreen: initialize_screen(info, op); + if (info) PE_state.video = *info; kprintf("kPEEnableScreen %d\n", last_console); if( last_console != -1) switch_to_old_console( last_console); break; + case kPEBaseAddressChange: + if (info) PE_state.video = *info; + /* fall thru */ + default: initialize_screen(info, op); break; @@ -91,19 +105,17 @@ void PE_init_iokit(void) { enum { kMaxBootVar = 128 }; - typedef struct { - char name[32]; - unsigned long length; - unsigned long value[2]; - } DriversPackageProp; - boolean_t bootClutInitialized = FALSE; - boolean_t norootInitialized = FALSE; + boolean_t noroot_rle_Initialized = FALSE; + DTEntry entry; unsigned int size; - void ** map; + uint32_t *map; boot_progress_element *bootPict; + norootIcon_lzss = NULL; + norootClut_lzss = NULL; + PE_init_kprintf(TRUE); PE_init_printf(TRUE); @@ -114,46 +126,57 @@ void PE_init_iokit(void) */ if( kSuccess == DTLookupEntry(NULL, "/chosen/memory-map", &entry)) { - if( kSuccess == DTGetProperty(entry, "BootCLUT", (void **) &map, &size)) { - bcopy( map[0], appleClut8, sizeof(appleClut8) ); - bootClutInitialized = TRUE; + if( kSuccess == DTGetProperty(entry, "BootCLUT", (void **) &map, &size)) { + if (sizeof(appleClut8) <= map[1]) { + bcopy( (void *)ml_static_ptovirt(map[0]), appleClut8, sizeof(appleClut8) ); + bootClutInitialized = TRUE; + } } - if( kSuccess == DTGetProperty(entry, "Pict-FailedBoot", (void **) &map, &size)) { - bootPict = (boot_progress_element *) map[0]; - default_noroot.width = bootPict->width; - default_noroot.height = bootPict->height; - default_noroot.dx = 0; - default_noroot.dy = bootPict->yOffset; - default_noroot_data = &bootPict->data[0]; - norootInitialized = TRUE; - } + if( kSuccess == DTGetProperty(entry, "Pict-FailedBoot", (void **) &map, &size)) { + bootPict = (boot_progress_element *) ml_static_ptovirt(map[0]); + default_noroot.width = bootPict->width; + default_noroot.height = bootPict->height; + default_noroot.dx = 0; + default_noroot.dy = bootPict->yOffset; + default_noroot_data = &bootPict->data[0]; + noroot_rle_Initialized = TRUE; + } + + if( kSuccess == DTGetProperty(entry, "FailedCLUT", (void **) &map, &size)) { + norootClut_lzss = (uint8_t*) ml_static_ptovirt(map[0]); + } + + if( kSuccess == DTGetProperty(entry, "FailedImage", (void **) &map, &size)) { + norootIcon_lzss = (boot_icon_element *) ml_static_ptovirt(map[0]); + if (norootClut_lzss == NULL) { + printf("ERROR: No FailedCLUT provided for noroot icon!\n"); + } + } } if (!bootClutInitialized) { - bcopy( (void *) (uintptr_t) bootClut, (void *) appleClut8, sizeof(appleClut8) ); + bcopy( (void *) (uintptr_t) bootClut, (void *) appleClut8, sizeof(appleClut8) ); } - if (!norootInitialized) { - default_noroot.width = kFailedBootWidth; - default_noroot.height = kFailedBootHeight; - default_noroot.dx = 0; - default_noroot.dy = kFailedBootOffset; - default_noroot_data = failedBootPict; + if (!noroot_rle_Initialized) { + default_noroot.width = kFailedBootWidth; + default_noroot.height = kFailedBootHeight; + default_noroot.dx = 0; + default_noroot.dy = kFailedBootOffset; + default_noroot_data = failedBootPict; } - /* - * Initialize the panic UI - */ - panic_ui_initialize( (unsigned char *) appleClut8 ); - /* * Initialize the spinning wheel (progress indicator). */ - vc_progress_initialize( &default_progress, default_progress_data, - (unsigned char *) appleClut8 ); + vc_progress_initialize(&default_progress, + default_progress_data1x, + default_progress_data2x, + default_progress_data3x, + (unsigned char *) appleClut8); - (void) StartIOKit( PE_state.deviceTreeHead, PE_state.bootArgs, gPEEFIRuntimeServices, NULL); + StartIOKit( PE_state.deviceTreeHead, PE_state.bootArgs, gPEEFIRuntimeServices, NULL); } void PE_init_platform(boolean_t vm_initialized, void * _args) @@ -165,30 +188,47 @@ void PE_init_platform(boolean_t vm_initialized, void * _args) // New EFI-style PE_state.bootArgs = _args; - PE_state.deviceTreeHead = (void *) args->deviceTreeP; - PE_state.video.v_baseAddr = args->Video.v_baseAddr; - PE_state.video.v_rowBytes = args->Video.v_rowBytes; - PE_state.video.v_width = args->Video.v_width; - PE_state.video.v_height = args->Video.v_height; - PE_state.video.v_depth = args->Video.v_depth; - PE_state.video.v_display = args->Video.v_display; - strlcpy(PE_state.video.v_pixelFormat, "PPPPPPPP", - sizeof(PE_state.video.v_pixelFormat)); + PE_state.deviceTreeHead = (void *) ml_static_ptovirt(args->deviceTreeP); + if (args->Video.v_baseAddr) { + PE_state.video.v_baseAddr = args->Video.v_baseAddr; // remains physical address + PE_state.video.v_rowBytes = args->Video.v_rowBytes; + PE_state.video.v_width = args->Video.v_width; + PE_state.video.v_height = args->Video.v_height; + PE_state.video.v_depth = args->Video.v_depth; + PE_state.video.v_display = args->Video.v_display; + strlcpy(PE_state.video.v_pixelFormat, "PPPPPPPP", + sizeof(PE_state.video.v_pixelFormat)); + } else { + PE_state.video.v_baseAddr = args->VideoV1.v_baseAddr; // remains physical address + PE_state.video.v_rowBytes = args->VideoV1.v_rowBytes; + PE_state.video.v_width = args->VideoV1.v_width; + PE_state.video.v_height = args->VideoV1.v_height; + PE_state.video.v_depth = args->VideoV1.v_depth; + PE_state.video.v_display = args->VideoV1.v_display; + strlcpy(PE_state.video.v_pixelFormat, "PPPPPPPP", + sizeof(PE_state.video.v_pixelFormat)); + } + +#ifdef kBootArgsFlagHiDPI + if (args->flags & kBootArgsFlagHiDPI) + PE_state.video.v_scale = kPEScaleFactor2x; + else + PE_state.video.v_scale = kPEScaleFactor1x; +#else + PE_state.video.v_scale = kPEScaleFactor1x; +#endif } if (!vm_initialized) { - /* Hack! FIXME.. */ - outb(0x21, 0xff); /* Maskout all interrupts Pic1 */ - outb(0xa1, 0xff); /* Maskout all interrupts Pic2 */ - + if (PE_state.deviceTreeHead) { DTInit(PE_state.deviceTreeHead); - } + } pe_identify_machine(args); - } else { pe_init_debug(); } + } void PE_create_console( void ) @@ -208,8 +248,22 @@ int PE_current_console( PE_Video * info ) void PE_display_icon( __unused unsigned int flags, __unused const char * name ) { - if ( default_noroot_data ) + if ( norootIcon_lzss && norootClut_lzss ) { + uint32_t width = norootIcon_lzss->width; + uint32_t height = norootIcon_lzss->height; + uint32_t x = ((PE_state.video.v_width - width) / 2); + uint32_t y = ((PE_state.video.v_height - height) / 2) + norootIcon_lzss->y_offset_from_center; + + vc_display_lzss_icon(x, y, width, height, + &norootIcon_lzss->data[0], + norootIcon_lzss->data_size, + norootClut_lzss); + } + else if ( default_noroot_data ) { vc_display_icon( &default_noroot, default_noroot_data ); + } else { + printf("ERROR: No data found for noroot icon!\n"); + } } boolean_t @@ -270,5 +324,36 @@ PE_stub_poll_input(__unused unsigned int options, char * c) int (*PE_poll_input)(unsigned int options, char * c) = PE_stub_poll_input; +boolean_t +PE_reboot_on_panic(void) +{ + boot_args *args = (boot_args *)PE_state.bootArgs; + + if (args->flags & kBootArgsFlagRebootOnPanic) + return TRUE; + else + return FALSE; +} +void +PE_sync_panic_buffers(void) +{ +} +/* rdar://problem/21244753 */ +uint32_t +PE_i_can_has_debugger(uint32_t *debug_flags) +{ +#if CONFIG_CSR + if (csr_check(CSR_ALLOW_KERNEL_DEBUGGER) != 0 && + csr_check(CSR_ALLOW_APPLE_INTERNAL) != 0) { + if (debug_flags) + *debug_flags = 0; + return FALSE; + } +#endif + if (debug_flags) { + *debug_flags = debug_boot_arg; + } + return TRUE; +}