From: Apple Date: Sat, 10 Dec 2005 02:19:31 +0000 (+0000) Subject: BootX-75.tar.gz X-Git-Tag: mac-os-x-10410x86^0 X-Git-Url: https://git.saurik.com/apple/bootx.git/commitdiff_plain/95a2ba82e233948c3dc301b3ba52f10963349a6c BootX-75.tar.gz --- diff --git a/APPLE_LICENSE b/APPLE_LICENSE deleted file mode 100644 index a0a8416..0000000 --- a/APPLE_LICENSE +++ /dev/null @@ -1,372 +0,0 @@ -APPLE PUBLIC SOURCE LICENSE -Version 1.1 - April 19,1999 - -Please read this License carefully before downloading this software. -By downloading and using this software, you are agreeing to be bound -by the terms of this License. If you do not or cannot agree to the -terms of this License, please do not download or use the software. - -1. General; Definitions. This License applies to any program or other -work which Apple Computer, Inc. ("Apple") publicly announces as -subject to this Apple Public Source License and which contains a -notice placed by Apple identifying such program or work as "Original -Code" and stating that it is subject to the terms of this Apple Public -Source License version 1.1 (or subsequent version thereof), as it may -be revised from time to time by Apple ("License"). As used in this -License: - -1.1 "Affected Original Code" means only those specific portions of -Original Code that allegedly infringe upon any party's intellectual -property rights or are otherwise the subject of a claim of -infringement. - -1.2 "Applicable Patent Rights" mean: (a) in the case where Apple is -the grantor of rights, (i) claims of patents that are now or hereafter -acquired, owned by or assigned to Apple and (ii) that cover subject -matter contained in the Original Code, but only to the extent -necessary to use, reproduce and/or distribute the Original Code -without infringement; and (b) in the case where You are the grantor of -rights, (i) claims of patents that are now or hereafter acquired, -owned by or assigned to You and (ii) that cover subject matter in Your -Modifications, taken alone or in combination with Original Code. - -1.3 "Covered Code" means the Original Code, Modifications, the -combination of Original Code and any Modifications, and/or any -respective portions thereof. - -1.4 "Deploy" means to use, sublicense or distribute Covered Code other -than for Your internal research and development (R&D), and includes -without limitation, any and all internal use or distribution of -Covered Code within Your business or organization except for R&D use, -as well as direct or indirect sublicensing or distribution of Covered -Code by You to any third party in any form or manner. - -1.5 "Larger Work" means a work which combines Covered Code or portions -thereof with code not governed by the terms of this License. - -1.6 "Modifications" mean any addition to, deletion from, and/or change -to, the substance and/or structure of Covered Code. When code is -released as a series of files, a Modification is: (a) any addition to -or deletion from the contents of a file containing Covered Code; -and/or (b) any new file or other representation of computer program -statements that contains any part of Covered Code. - -1.7 "Original Code" means (a) the Source Code of a program or other -work as originally made available by Apple under this License, -including the Source Code of any updates or upgrades to such programs -or works made available by Apple under this License, and that has been -expressly identified by Apple as such in the header file(s) of such -work; and (b) the object code compiled from such Source Code and -originally made available by Apple under this License. - -1.8 "Source Code" means the human readable form of a program or other -work that is suitable for making modifications to it, including all -modules it contains, plus any associated interface definition files, -scripts used to control compilation and installation of an executable -(object code). - -1.9 "You" or "Your" means an individual or a legal entity exercising -rights under this License. For legal entities, "You" or "Your" -includes any entity which controls, is controlled by, or is under -common control with, You, where "control" means (a) the power, direct -or indirect, to cause the direction or management of such entity, -whether by contract or otherwise, or (b) ownership of fifty percent -(50%) or more of the outstanding shares or beneficial ownership of -such entity. - -2. Permitted Uses; Conditions & Restrictions. Subject to the terms -and conditions of this License, Apple hereby grants You, effective on -the date You accept this License and download the Original Code, a -world-wide, royalty-free, non- exclusive license, to the extent of -Apple's Applicable Patent Rights and copyrights covering the Original -Code, to do the following: - -2.1 You may use, copy, modify and distribute Original Code, with or -without Modifications, solely for Your internal research and -development, provided that You must in each instance: - -(a) retain and reproduce in all copies of Original Code the copyright -and other proprietary notices and disclaimers of Apple as they appear -in the Original Code, and keep intact all notices in the Original Code -that refer to this License; - -(b) include a copy of this License with every copy of Source Code of -Covered Code and documentation You distribute, and You may not offer -or impose any terms on such Source Code that alter or restrict this -License or the recipients' rights hereunder, except as permitted under -Section 6; and - -(c) completely and accurately document all Modifications that you have -made and the date of each such Modification, designate the version of -the Original Code you used, prominently include a file carrying such -information with the Modifications, and duplicate the notice in -Exhibit A in each file of the Source Code of all such Modifications. - -2.2 You may Deploy Covered Code, provided that You must in each - instance: - -(a) satisfy all the conditions of Section 2.1 with respect to the -Source Code of the Covered Code; - -(b) make all Your Deployed Modifications publicly available in Source -Code form via electronic distribution (e.g. download from a web site) -under the terms of this License and subject to the license grants set -forth in Section 3 below, and any additional terms You may choose to -offer under Section 6. You must continue to make the Source Code of -Your Deployed Modifications available for as long as you Deploy the -Covered Code or twelve (12) months from the date of initial -Deployment, whichever is longer; - -(c) if You Deploy Covered Code containing Modifications made by You, -inform others of how to obtain those Modifications by filling out and -submitting the information found at -http://www.apple.com/publicsource/modifications.html, if available; -and - -(d) if You Deploy Covered Code in object code, executable form only, -include a prominent notice, in the code itself as well as in related -documentation, stating that Source Code of the Covered Code is -available under the terms of this License with information on how and -where to obtain such Source Code. - -3. Your Grants. In consideration of, and as a condition to, the -licenses granted to You under this License: - -(a) You hereby grant to Apple and all third parties a non-exclusive, -royalty-free license, under Your Applicable Patent Rights and other -intellectual property rights owned or controlled by You, to use, -reproduce, modify, distribute and Deploy Your Modifications of the -same scope and extent as Apple's licenses under Sections 2.1 and 2.2; -and - -(b) You hereby grant to Apple and its subsidiaries a non-exclusive, -worldwide, royalty-free, perpetual and irrevocable license, under Your -Applicable Patent Rights and other intellectual property rights owned -or controlled by You, to use, reproduce, execute, compile, display, -perform, modify or have modified (for Apple and/or its subsidiaries), -sublicense and distribute Your Modifications, in any form, through -multiple tiers of distribution. - -4. Larger Works. You may create a Larger Work by combining Covered -Code with other code not governed by the terms of this License and -distribute the Larger Work as a single product. In each such -instance, You must make sure the requirements of this License are -fulfilled for the Covered Code or any portion thereof. - -5. Limitations on Patent License. Except as expressly stated in -Section 2, no other patent rights, express or implied, are granted by -Apple herein. Modifications and/or Larger Works may require -additional patent licenses from Apple which Apple may grant in its -sole discretion. - -6. Additional Terms. You may choose to offer, and to charge a fee -for, warranty, support, indemnity or liability obligations and/or -other rights consistent with the scope of the license granted herein -("Additional Terms") to one or more recipients of Covered -Code. However, You may do so only on Your own behalf and as Your sole -responsibility, and not on behalf of Apple. You must obtain the -recipient's agreement that any such Additional Terms are offered by -You alone, and You hereby agree to indemnify, defend and hold Apple -harmless for any liability incurred by or claims asserted against -Apple by reason of any such Additional Terms. - -7. Versions of the License. Apple may publish revised and/or new -versions of this License from time to time. Each version will be -given a distinguishing version number. Once Original Code has been -published under a particular version of this License, You may continue -to use it under the terms of that version. You may also choose to use -such Original Code under the terms of any subsequent version of this -License published by Apple. No one other than Apple has the right to -modify the terms applicable to Covered Code created under this -License. - -8. NO WARRANTY OR SUPPORT. The Original Code may contain in whole or -in part pre-release, untested, or not fully tested works. The -Original Code may contain errors that could cause failures or loss of -data, and may be incomplete or contain inaccuracies. You expressly -acknowledge and agree that use of the Original Code, or any portion -thereof, is at Your sole and entire risk. THE ORIGINAL CODE IS -PROVIDED "AS IS" AND WITHOUT WARRANTY, UPGRADES OR SUPPORT OF ANY KIND -AND APPLE AND APPLE'S LICENSOR(S) (FOR THE PURPOSES OF SECTIONS 8 AND -9, APPLE AND APPLE'S LICENSOR(S) ARE COLLECTIVELY REFERRED TO AS -"APPLE") EXPRESSLY DISCLAIM ALL WARRANTIES AND/OR CONDITIONS, EXPRESS -OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES -AND/OR CONDITIONS OF MERCHANTABILITY OR SATISFACTORY QUALITY AND -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY -RIGHTS. APPLE DOES NOT WARRANT THAT THE FUNCTIONS CONTAINED IN THE -ORIGINAL CODE WILL MEET YOUR REQUIREMENTS, OR THAT THE OPERATION OF -THE ORIGINAL CODE WILL BE UNINTERRUPTED OR ERROR- FREE, OR THAT -DEFECTS IN THE ORIGINAL CODE WILL BE CORRECTED. NO ORAL OR WRITTEN -INFORMATION OR ADVICE GIVEN BY APPLE OR AN APPLE AUTHORIZED -REPRESENTATIVE SHALL CREATE A WARRANTY OR IN ANY WAY INCREASE THE -SCOPE OF THIS WARRANTY. You acknowledge that the Original Code is not -intended for use in the operation of nuclear facilities, aircraft -navigation, communication systems, or air traffic control machines in -which case the failure of the Original Code could lead to death, -personal injury, or severe physical or environmental damage. - -9. Liability. - -9.1 Infringement. If any portion of, or functionality implemented by, -the Original Code becomes the subject of a claim of infringement, -Apple may, at its option: (a) attempt to procure the rights necessary -for Apple and You to continue using the Affected Original Code; (b) -modify the Affected Original Code so that it is no longer infringing; -or (c) suspend Your rights to use, reproduce, modify, sublicense and -distribute the Affected Original Code until a final determination of -the claim is made by a court or governmental administrative agency of -competent jurisdiction and Apple lifts the suspension as set forth -below. Such suspension of rights will be effective immediately upon -Apple's posting of a notice to such effect on the Apple web site that -is used for implementation of this License. Upon such final -determination being made, if Apple is legally able, without the -payment of a fee or royalty, to resume use, reproduction, -modification, sublicensing and distribution of the Affected Original -Code, Apple will lift the suspension of rights to the Affected -Original Code by posting a notice to such effect on the Apple web site -that is used for implementation of this License. If Apple suspends -Your rights to Affected Original Code, nothing in this License shall -be construed to restrict You, at Your option and subject to applicable -law, from replacing the Affected Original Code with non-infringing -code or independently negotiating for necessary rights from such third -party. - -9.2 LIMITATION OF LIABILITY. UNDER NO CIRCUMSTANCES SHALL APPLE BE -LIABLE FOR ANY INCIDENTAL, SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES -ARISING OUT OF OR RELATING TO THIS LICENSE OR YOUR USE OR INABILITY TO -USE THE ORIGINAL CODE, OR ANY PORTION THEREOF, WHETHER UNDER A THEORY -OF CONTRACT, WARRANTY, TORT (INCLUDING NEGLIGENCE), PRODUCTS LIABILITY -OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES AND NOTWITHSTANDING THE FAILURE OF ESSENTIAL PURPOSE OF -ANY REMEDY. In no event shall Apple's total liability to You for all -damages under this License exceed the amount of fifty dollars -($50.00). - -10. Trademarks. This License does not grant any rights to use the -trademarks or trade names "Apple", "Apple Computer", "Mac OS X", "Mac -OS X Server" or any other trademarks or trade names belonging to Apple -(collectively "Apple Marks") and no Apple Marks may be used to endorse -or promote products derived from the Original Code other than as -permitted by and in strict compliance at all times with Apple's third -party trademark usage guidelines which are posted at -http://www.apple.com/legal/guidelinesfor3rdparties.html. - -11. Ownership. Apple retains all rights, title and interest in and to -the Original Code and any Modifications made by or on behalf of Apple -("Apple Modifications"), and such Apple Modifications will not be -automatically subject to this License. Apple may, at its sole -discretion, choose to license such Apple Modifications under this -License, or on different terms from those contained in this License or -may choose not to license them at all. Apple's development, use, -reproduction, modification, sublicensing and distribution of Covered -Code will not be subject to this License. - -12. Termination. - -12.1 Termination. This License and the rights granted hereunder will - terminate: - -(a) automatically without notice from Apple if You fail to comply with -any term(s) of this License and fail to cure such breach within 30 -days of becoming aware of such breach; (b) immediately in the event of -the circumstances described in Section 13.5(b); or (c) automatically -without notice from Apple if You, at any time during the term of this -License, commence an action for patent infringement against Apple. - -12.2 Effect of Termination. Upon termination, You agree to -immediately stop any further use, reproduction, modification, -sublicensing and distribution of the Covered Code and to destroy all -copies of the Covered Code that are in your possession or control. -All sublicenses to the Covered Code which have been properly granted -prior to termination shall survive any termination of this License. -Provisions which, by their nature, should remain in effect beyond the -termination of this License shall survive, including but not limited -to Sections 3, 5, 8, 9, 10, 11, 12.2 and 13. Neither party will be -liable to the other for compensation, indemnity or damages of any sort -solely as a result of terminating this License in accordance with its -terms, and termination of this License will be without prejudice to -any other right or remedy of either party. - -13. Miscellaneous. - -13.1 Government End Users. The Covered Code is a "commercial item" as -defined in FAR 2.101. Government software and technical data rights -in the Covered Code include only those rights customarily provided to -the public as defined in this License. This customary commercial -license in technical data and software is provided in accordance with -FAR 12.211 (Technical Data) and 12.212 (Computer Software) and, for -Department of Defense purchases, DFAR 252.227-7015 (Technical Data -- -Commercial Items) and 227.7202-3 (Rights in Commercial Computer -Software or Computer Software Documentation). Accordingly, all U.S. -Government End Users acquire Covered Code with only those rights set -forth herein. - -13.2 Relationship of Parties. This License will not be construed as -creating an agency, partnership, joint venture or any other form of -legal association between You and Apple, and You will not represent to -the contrary, whether expressly, by implication, appearance or -otherwise. - -13.3 Independent Development. Nothing in this License will impair -Apple's right to acquire, license, develop, have others develop for -it, market and/or distribute technology or products that perform the -same or similar functions as, or otherwise compete with, -Modifications, Larger Works, technology or products that You may -develop, produce, market or distribute. - -13.4 Waiver; Construction. Failure by Apple to enforce any provision -of this License will not be deemed a waiver of future enforcement of -that or any other provision. Any law or regulation which provides -that the language of a contract shall be construed against the drafter -will not apply to this License. - -13.5 Severability. (a) If for any reason a court of competent -jurisdiction finds any provision of this License, or portion thereof, -to be unenforceable, that provision of the License will be enforced to -the maximum extent permissible so as to effect the economic benefits -and intent of the parties, and the remainder of this License will -continue in full force and effect. (b) Notwithstanding the foregoing, -if applicable law prohibits or restricts You from fully and/or -specifically complying with Sections 2 and/or 3 or prevents the -enforceability of either of those Sections, this License will -immediately terminate and You must immediately discontinue any use of -the Covered Code and destroy all copies of it that are in your -possession or control. - -13.6 Dispute Resolution. Any litigation or other dispute resolution -between You and Apple relating to this License shall take place in the -Northern District of California, and You and Apple hereby consent to -the personal jurisdiction of, and venue in, the state and federal -courts within that District with respect to this License. The -application of the United Nations Convention on Contracts for the -International Sale of Goods is expressly excluded. - -13.7 Entire Agreement; Governing Law. This License constitutes the -entire agreement between the parties with respect to the subject -matter hereof. This License shall be governed by the laws of the -United States and the State of California, except that body of -California law concerning conflicts of law. - -Where You are located in the province of Quebec, Canada, the following -clause applies: The parties hereby confirm that they have requested -that this License and all related documents be drafted in English. Les -parties ont exige que le present contrat et tous les documents -connexes soient rediges en anglais. - -EXHIBIT A. - -"Portions Copyright (c) 1999-2000 Apple Computer, Inc. All Rights -Reserved. 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 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. - -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, -FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT. Please see the -License for the specific language governing rights and limitations -under the License." diff --git a/bootx.tproj/Makefile b/bootx.tproj/Makefile index edefa83..b214f14 100644 --- a/bootx.tproj/Makefile +++ b/bootx.tproj/Makefile @@ -31,7 +31,7 @@ PROF_LIBS = $(LIBS) HEADER_PATHS = -I$(SRCROOT)/bootx.tproj/include.subproj NEXTSTEP_PB_CFLAGS = -static -msoft-float -NEXTSTEP_PB_LDFLAGS = -nostdlib -e _StartTVector -seg1addr 05600000 +NEXTSTEP_PB_LDFLAGS = -nostdlib -e _StartTVector -seg1addr 06600000 NEXTSTEP_OBJCPLUS_COMPILER = /usr/bin/cc diff --git a/bootx.tproj/PB.project b/bootx.tproj/PB.project index 68d28a5..c3989e6 100644 --- a/bootx.tproj/PB.project +++ b/bootx.tproj/PB.project @@ -21,7 +21,7 @@ NEXTSTEP_COMPILEROPTIONS = "-static"; NEXTSTEP_INSTALLDIR = /bin; NEXTSTEP_JAVA_COMPILER = /usr/bin/javac; - NEXTSTEP_LINKEROPTIONS = "-nostdlib -e _StartTVector -seg1addr 05600000"; + NEXTSTEP_LINKEROPTIONS = "-nostdlib -e _StartTVector -seg1addr 06600000"; NEXTSTEP_OBJCPLUS_COMPILER = /usr/bin/cc; PDO_UNIX_BUILDTOOL = $NEXT_ROOT/Developer/bin/make; PDO_UNIX_INSTALLDIR = /bin; diff --git a/bootx.tproj/fs.subproj/net.c b/bootx.tproj/fs.subproj/net.c index 5ef461b..44882bc 100644 --- a/bootx.tproj/fs.subproj/net.c +++ b/bootx.tproj/fs.subproj/net.c @@ -22,7 +22,7 @@ /* * net.c - File System Module for wrapping TFTP. * - * Copyright (c) 1999-2002 Apple Computer, Inc. + * Copyright (c) 1999-2002, 2005 Apple Computer, Inc. * * DRI: Josh de Cesare */ @@ -82,6 +82,11 @@ long NetLoadFile(CICell ih, char *filePath) Close(netIH); + if (length > kLoadSize) { + printf("\nLoadFile failure: %ld bytes overran the load buffer (%ld bytes)\n", length, kLoadSize); + return -1; + } + return length; } diff --git a/bootx.tproj/fs.subproj/ufs.c b/bootx.tproj/fs.subproj/ufs.c index ae86f76..f6aa107 100644 --- a/bootx.tproj/fs.subproj/ufs.c +++ b/bootx.tproj/fs.subproj/ufs.c @@ -31,6 +31,8 @@ #include "ufs_byteorder.h" +#include // for MAXNAMLEN + typedef struct dinode Inode, *InodePtr; // Private function prototypes diff --git a/bootx.tproj/include.subproj/sl.h b/bootx.tproj/include.subproj/sl.h index 9667a41..9c6f971 100644 --- a/bootx.tproj/include.subproj/sl.h +++ b/bootx.tproj/include.subproj/sl.h @@ -22,7 +22,7 @@ /* * sl.h - Headers for configuring the Secondary Loader * - * Copyright (c) 1998-2003 Apple Computer, Inc. + * Copyright (c) 1998-2005 Apple Computer, Inc. * * DRI: Josh de Cesare */ @@ -35,26 +35,36 @@ /* -Memory Map: assumes 96 MB +Memory Map: assumed 96 MB (temporarily bumping to 112 MB for 4359362) Physical Address Open Firmware Version 3x, 4x, ... 00000000 - 00003FFF : Exception Vectors 00004000 - 057FFFFF : Free Memory -05800000 - 05FFFFFF : OF Image +// 05800000 - 05FFFFFF : OF Image (top 8 MB reserved) [96 MB map] +06800000 - 06FFFFFF : OF Image (top 8 MB reserved) [112 MB map] Logical Address +// 96 MB map (currently unused - 4363357 tracks re-adoption) 00000000 - 00003FFF : Exception Vectors -00004000 - 03FFFFFF : Kernel Image, Boot Struct and Drivers -04000000 - 04FFFFFF : File Load Area -05000000 - 053FFFFF : FS Cache -05400000 - 055FFFFF : Malloc Zone -05600000 - 057FFFFF : BootX Image -05800000 - 05FFFFFF : Unused - +00004000 - 03FFFFFF : Kernel Image, Boot Struct and Drivers (~64 MB) +04000000 - 04FFFFFF : File Load Area (16 MB) [80 MB] +05000000 - 053FFFFF : FS Cache (4 MB) [84 MB] +05400000 - 055FFFFF : Malloc Zone (2 MB) [86 MB] +05600000 - 057FFFFF : BootX Image (2 MB) [88 MB] +05800000 - 05FFFFFF : Unused/OF (8 MB) [96 MB] + +// 112 MB map (per 4359362) +00000000 - 00003FFF : Exception Vectors +00004000 - 03FFFFFF : Kernel Image, Boot Struct and Drivers (~64 MB) +04000000 - 05FFFFFF : File Load Area (32 MB) [96 MB] +06000000 - 063FFFFF : FS Cache (4 MB) [100 MB] +06400000 - 065FFFFF : Malloc Zone (2 MB) [102 MB] +06600000 - 067FFFFF : BootX Image (2 MB) [104 MB] +06800000 - 06FFFFFF : Unused/OF (8 MB) [112 MB] */ #define kVectorAddr (0x00000000) @@ -74,17 +84,18 @@ Logical Address #define kImageSize2 (0x03B00000) #define kLoadAddr (0x04000000) -#define kLoadSize (0x01000000) +#define kLoadSize (0x02000000) // 32 MB @ 64 +#define kMaxMKextSize (0x01000000) // only allow 16 MB of drivers -#define kFSCacheAddr (0x05000000) -#define kFSCacheSize (0x00400000) +#define kFSCacheAddr (0x06000000) +#define kFSCacheSize (0x00400000) // 4 MB @ 96 -#define kMallocAddr (0x05400000) -#define kMallocSize (0x00200000) +#define kMallocAddr (0x06400000) +#define kMallocSize (0x00200000) // 2 MB @ 100 -#define kMallocAddr_H (0x05400000) +#define kMallocAddr_H (0x06400000) // ditto for hibernate #define kMallocSize_H (0x00200000) -#define kImageAddr_H (0x06000000) +#define kImageAddr_H (0x07000000) // fallback for hiberate image buffer // Default Output Level #define kOutputLevelOff (0) diff --git a/bootx.tproj/sl.subproj/display.c b/bootx.tproj/sl.subproj/display.c index 700e870..3d48fae 100644 --- a/bootx.tproj/sl.subproj/display.c +++ b/bootx.tproj/sl.subproj/display.c @@ -28,6 +28,7 @@ */ #include +#include #include "clut.h" #include "appleboot.h" @@ -193,6 +194,140 @@ long DrawSplashScreen(long stage) return 0; } +DECLARE_IOHIBERNATEPROGRESSALPHA + +void SplashPreview(void *src, uint8_t * saveunder, uint32_t savelen) +{ + DisplayInfoPtr display; + uint8_t * screen; + uint32_t rowBytes, pixelShift; + uint32_t x, y; + int32_t blob; + uint32_t alpha, in, color, result; + uint8_t * out; + uint32_t saveindex[kIOHibernateProgressCount] = { 0 }; + + if (InitDisplays(0) != 0) return; + if (gMainDisplayNum == -1) return; + + display = &gDisplays[gMainDisplayNum]; + screen = (uint8_t *) display->address; + rowBytes = display->linebytes; + if (!src || !DecompressData(src, (void *) screen, + display->width, display->height, + display->depth >> 3, rowBytes)) + { + // Set the screen to 75% grey. + CallMethod(5, 0, display->screenIH, "fill-rectangle", + LookUpCLUTIndex(0x01, display->depth), + 0, 0, display->width, display->height); + DrawSplashScreen(0); + } + + pixelShift = display->depth >> 4; + if (pixelShift < 1) return; + + screen += ((display->width + - kIOHibernateProgressCount * (kIOHibernateProgressWidth + kIOHibernateProgressSpacing)) << (pixelShift - 1)) + + (display->height - kIOHibernateProgressOriginY - kIOHibernateProgressHeight) * rowBytes; + + for (y = 0; y < kIOHibernateProgressHeight; y++) + { + out = screen + y * rowBytes; + for (blob = 0; blob < kIOHibernateProgressCount; blob++) + { + color = blob ? kIOHibernateProgressDarkGray : kIOHibernateProgressMidGray; + for (x = 0; x < kIOHibernateProgressWidth; x++) + { + alpha = gIOHibernateProgressAlpha[y][x]; + result = color; + if (alpha) + { + if (0xff != alpha) + { + if (1 == pixelShift) + { + in = *((uint16_t *)out) & 0x1f; // 16 + in = (in << 3) | (in >> 2); + } + else + in = *((uint32_t *)out) & 0xff; // 32 + saveunder[blob * kIOHibernateProgressSaveUnderSize + saveindex[blob]++] = in; + result = ((255 - alpha) * in + alpha * result + 0xff) >> 8; + } + if (1 == pixelShift) + { + result >>= 3; + *((uint16_t *)out) = (result << 10) | (result << 5) | result; // 16 + } + else + *((uint32_t *)out) = (result << 16) | (result << 8) | result; // 32 + } + out += (1 << pixelShift); + } + out += (kIOHibernateProgressSpacing << pixelShift); + } + } +} + +void SplashProgress(uint8_t * saveunder, int32_t firstBlob, int32_t select) +{ + DisplayInfoPtr display; + uint8_t * screen; + uint32_t rowBytes, pixelShift; + uint32_t x, y; + int32_t blob, lastBlob; + uint32_t alpha, in, color, result; + uint8_t * out; + uint32_t saveindex[kIOHibernateProgressCount] = { 0 }; + + if (gMainDisplayNum == -1) return; + + display = &gDisplays[gMainDisplayNum]; + pixelShift = display->depth >> 4; + if (pixelShift < 1) return; + screen = (uint8_t *) display->address; + rowBytes = display->linebytes; + + screen += ((display->width + - kIOHibernateProgressCount * (kIOHibernateProgressWidth + kIOHibernateProgressSpacing)) << (pixelShift - 1)) + + (display->height - kIOHibernateProgressOriginY - kIOHibernateProgressHeight) * rowBytes; + + lastBlob = (select < kIOHibernateProgressCount) ? select : (kIOHibernateProgressCount - 1); + + screen += (firstBlob * (kIOHibernateProgressWidth + kIOHibernateProgressSpacing)) << pixelShift; + + for (y = 0; y < kIOHibernateProgressHeight; y++) + { + out = screen + y * rowBytes; + for (blob = firstBlob; blob <= lastBlob; blob++) + { + color = (blob < select) ? kIOHibernateProgressLightGray : kIOHibernateProgressMidGray; + for (x = 0; x < kIOHibernateProgressWidth; x++) + { + alpha = gIOHibernateProgressAlpha[y][x]; + result = color; + if (alpha) + { + if (0xff != alpha) + { + in = saveunder[blob * kIOHibernateProgressSaveUnderSize + saveindex[blob]++]; + result = ((255 - alpha) * in + alpha * result + 0xff) / 255; + } + if (1 == pixelShift) + { + result >>= 3; + *((uint16_t *)out) = (result << 10) | (result << 5) | result; // 16 + } + else + *((uint32_t *)out) = (result << 16) | (result << 8) | result; // 32 + } + out += (1 << pixelShift); + } + out += (kIOHibernateProgressSpacing << pixelShift); + } + } +} long DrawFailedBootPicture(void) { diff --git a/bootx.tproj/sl.subproj/drivers.c b/bootx.tproj/sl.subproj/drivers.c index 99d3430..d0c324d 100644 --- a/bootx.tproj/sl.subproj/drivers.c +++ b/bootx.tproj/sl.subproj/drivers.c @@ -22,7 +22,7 @@ /* * drivers.c - Driver Loading Functions. * - * Copyright (c) 2000 Apple Computer, Inc. + * Copyright (c) 2000-2005 Apple Computer, Inc. * * DRI: Josh de Cesare */ @@ -98,9 +98,9 @@ static char gFileName[4096]; long LoadDrivers(char *dirSpec) { if (gBootFileType == kNetworkDeviceType) { - NetLoadDrivers(dirSpec); + if(NetLoadDrivers(dirSpec) < 0) return -1; } else if (gBootFileType == kBlockDeviceType) { - FileLoadDrivers(dirSpec, 0); + FileLoadDrivers(dirSpec, 0); // never returns errors } else { return 0; } @@ -116,6 +116,7 @@ long LoadDrivers(char *dirSpec) // Private Functions +// XX FileLoadDrivers could use some more error checking static long FileLoadDrivers(char *dirSpec, long plugin) { long ret, length, index, flags, time, time2, bundleType; @@ -220,7 +221,10 @@ static long LoadDriverMKext(char *fileSpec) // Verify the MKext. if ((package->signature1 != kDriverPackageSignature1) || (package->signature2 != kDriverPackageSignature2)) return -1; - if (package->length > kLoadSize) return -1; + if (package->length > kMaxMKextSize) { + printf("mkext segment too big (%ld bytes)\n", package->length); + return -1; + } if (package->adler32 != Adler32((char *)&package->version, package->length - 0x10)) return -1; diff --git a/bootx.tproj/sl.subproj/main.c b/bootx.tproj/sl.subproj/main.c index fac6f82..a5362f2 100644 --- a/bootx.tproj/sl.subproj/main.c +++ b/bootx.tproj/sl.subproj/main.c @@ -30,6 +30,7 @@ #include #include "aes.h" +#include static void Start(void *unused1, void *unused2, ClientInterfacePtr ciPtr); static void Main(ClientInterfacePtr ciPtr); @@ -80,6 +81,8 @@ long *gDeviceTreeMMTmp = 0; long gOFVersion = 0; char *gKeyMap; +char gHibernateBoot; +unsigned long gHibernateKeySizeBytes; long gRootAddrCells; long gRootSizeCells; @@ -117,7 +120,316 @@ static void Start(void *unused1, void *unused2, ClientInterfacePtr ciPtr) Main(ciPtr); } +static long WakeKernel(void *p1, void *p2, void *p3, void *p4) +{ + IOHibernateImageHeader * header = (IOHibernateImageHeader *) p1; + unsigned long msr; + typedef void (*Proc)(void *, void *, void *, void *); + Proc proc; + unsigned long cnt, newSP; + unsigned long *src, *dst; + unsigned int count; + unsigned int page; + unsigned int compressedSize; + unsigned int uncompressedPages; + int32_t byteCnt; + u_int32_t lowHalf, highHalf; + u_int32_t sum; + + Quiesce(); + printf("\nWake Kernel!\n"); + + // Save SPRs for OF + __asm__ volatile("mfmsr %0" : "=r" (gOFMSRSave)); + __asm__ volatile("mfsprg %0, 0" : "=r" (gOFSPRG0Save)); + __asm__ volatile("mfsprg %0, 1" : "=r" (gOFSPRG1Save)); + __asm__ volatile("mfsprg %0, 2" : "=r" (gOFSPRG2Save)); + __asm__ volatile("mfsprg %0, 3" : "=r" (gOFSPRG3Save)); + + // Turn off translations + msr = 0x00001000; + __asm__ volatile("sync"); + __asm__ volatile("mtmsr %0" : : "r" (msr)); + __asm__ volatile("isync"); + + // Save OF's Exceptions Vectors + bcopy(0x0, gOFVectorSave, kVectorSize); + + dst = (unsigned long *) (header->restore1CodePage << 12); + count = header->restore1PageCount; + proc = (Proc) (header->restore1CodeOffset + ((uint32_t) dst)); + newSP = header->restore1StackOffset + (header->restore1CodePage << 12); + + src = (unsigned long *) (((u_int32_t) &header->fileExtentMap[0]) + + header->fileExtentMapSize); + sum = 0; + + for (page = 0; page < count; page++) + { + compressedSize = 4096; + + lowHalf = 1; + highHalf = 0; + + for (cnt = 0; cnt < compressedSize; cnt += 0x20) { + dst[0] = src[0]; + dst[1] = src[1]; + dst[2] = src[2]; + dst[3] = src[3]; + dst[4] = src[4]; + dst[5] = src[5]; + dst[6] = src[6]; + dst[7] = src[7]; + for (byteCnt = 0; byteCnt < 0x20; byteCnt++) { + lowHalf += ((u_int8_t *) dst)[byteCnt]; + highHalf += lowHalf; + } + __asm__ volatile("dcbf 0, %0" : : "r" (dst)); + __asm__ volatile("sync"); + __asm__ volatile("icbi 0, %0" : : "r" (dst)); + __asm__ volatile("isync"); + __asm__ volatile("sync"); + src += 8; + dst += 8; + } + + lowHalf %= 65521L; + highHalf %= 65521L; + sum += (highHalf << 16) | lowHalf; + } + uncompressedPages = count; + header->actualRestore1Sum = sum; + + __asm__ volatile("dcbf 0, %0" : : "r" (dst)); + __asm__ volatile("dcbf 0, %0" : : "r" (dst+32)); + __asm__ volatile("sync"); + __asm__ volatile("icbi 0, %0" : : "r" (dst)); + __asm__ volatile("icbi 0, %0" : : "r" (dst+32)); + __asm__ volatile("isync"); + __asm__ volatile("sync"); + + // Make sure everything get sync'd up. + __asm__ volatile("isync"); + __asm__ volatile("sync"); + __asm__ volatile("eieio"); + + // Move the Stack + __asm__ volatile("mr r1, %0" : : "r" (newSP)); + __asm__ volatile("ori 0, 0, 0" : : ); + proc(p1, p2, p3, p4); + + return -1; +} +void HibernateBoot(void) +{ + CICell dev, size, maxRead, imageSize, codeSize, allocSize, bytesToRead; + CICell memoryPH; + CICell available[2*16]; + long mem_base; + IOHibernateImageHeader _header; + IOHibernateImageHeader * header = &_header; + volatile IOPolledFileExtent * currentExtent; + long long extentStart; + long long extentLength; + long long position, positionMax; + long buffer; + char c; + int havePreview, readingPreview; + char * tail; + Boot_Video videoInfo; + hibernate_graphics_t * graphicsInfo; + uint32_t machineSignature; + int32_t blob, lastBlob = 0; + // decryption data + static const unsigned char first_iv[AES_BLOCK_SIZE] + = { 0xa3, 0x63, 0x65, 0xa9, 0x0b, 0x71, 0x7b, 0x1c, + 0xdf, 0x9e, 0x5f, 0x32, 0xd7, 0x61, 0x63, 0xda }; + hibernate_cryptvars_t _cryptvars; + hibernate_cryptvars_t * cryptvars = &_cryptvars; + hibernate_cryptwakevars_t * cryptwakevars; + + do { + tail = &gBootDevice[0]; + while ((c = *++tail) && (c != ',')) + {} + if (!c) + break; + + *tail++ = 0; + extentStart = strtouq(tail, 0, 16); + + printf("extentStart %s, %qx\n", gBootDevice, extentStart); + + dev = Open(gBootDevice); + Seek(dev, extentStart); + + size = Read(dev, (CICell) header, sizeof(IOHibernateImageHeader)); + printf("header read size %x\n", size); + + imageSize = header->image1Size; + codeSize = header->restore1PageCount << 12; + if (kIOHibernateHeaderSignature != header->signature) + break; + + size = GetProp(gChosenPH, kIOHibernateMachineSignatureKey, + (char *)&machineSignature, sizeof(machineSignature)); + if (size != sizeof(machineSignature)) machineSignature = 0; + if (machineSignature != header->machineSignature) + break; + + allocSize = imageSize + ((4095 + sizeof(hibernate_graphics_t) + sizeof(hibernate_cryptwakevars_t)) & ~4095); + + // try to allocate the image as high as possible - end of available memory + memoryPH = FindDevice("/memory"); + if (memoryPH == -1) break; + size = GetProp(memoryPH, "available", (char *) &available[0], sizeof(available)); + if (size == 0) break; + size /= sizeof(CICell); + mem_base = available[size - 2] + available[size - 1] - allocSize; + + if (-1 == Claim(mem_base, allocSize, 0)) { + // else try above BootX's image + mem_base = kImageAddr_H; + if (-1 == Claim(mem_base, allocSize, 0)) { + // else try below BootX's image + mem_base = (header->restore1CodePage << 12) + codeSize; + if (-1 == Claim(mem_base, allocSize, 0)) + break; + } + } + + printf("mem_base %x\n", mem_base); + + graphicsInfo = (hibernate_graphics_t *) mem_base; + cryptwakevars = (hibernate_cryptwakevars_t *) (graphicsInfo + 1); + mem_base += (allocSize - imageSize); + + bcopy(header, (void *) mem_base, sizeof(IOHibernateImageHeader)); + header = (IOHibernateImageHeader *) mem_base; + + imageSize -= sizeof(IOHibernateImageHeader); + // imageSize -= codeSize; + currentExtent = &header->fileExtentMap[0]; + extentLength = currentExtent->length - sizeof(IOHibernateImageHeader); + extentStart = currentExtent->start + sizeof(IOHibernateImageHeader); + buffer = (long)(header + 1); + + position = 0; + maxRead = 0; + bytesToRead = header->previewSize; + havePreview = readingPreview = (bytesToRead != 0); + if (readingPreview) { + bytesToRead += header->fileExtentMapSize - sizeof(header->fileExtentMap) + codeSize; + positionMax = header->imageSize - bytesToRead; + imageSize -= bytesToRead; + } else { + bytesToRead = imageSize; + positionMax = header->imageSize; + maxRead = positionMax / kIOHibernateProgressCount; + SplashPreview(NULL, &graphicsInfo->progressSaveUnder[0][0], sizeof(graphicsInfo->progressSaveUnder)); + } + + while (bytesToRead) { + + if (!extentLength) { + currentExtent++; + extentStart = currentExtent->start; + extentLength = currentExtent->length; + } + if (extentLength < bytesToRead) + size = extentLength; + else + size = bytesToRead; + + if (maxRead && (size > maxRead)) + size = maxRead; + + if (-1 == Seek(dev, extentStart)) { + printf("seek fail\n"); + break; + } + if (size != Read(dev, buffer, size)) { + printf("read fail\n"); + break; + } + + bytesToRead -= size; + + if (!bytesToRead && readingPreview) { + uint8_t * src = (uint8_t *) ( + ((uint32_t) &header->fileExtentMap[0]) + + header->fileExtentMapSize + + codeSize + + header->previewPageListSize); + + SplashPreview(src, &graphicsInfo->progressSaveUnder[0][0], sizeof(graphicsInfo->progressSaveUnder)); + readingPreview = 0; + bytesToRead = imageSize; + maxRead = positionMax / kIOHibernateProgressCount; + } else if (!readingPreview) { + // progress + position += size; + blob = (position * kIOHibernateProgressCount) / positionMax; + if (blob != lastBlob) + { + SplashProgress(&graphicsInfo->progressSaveUnder[0][0], lastBlob, blob); + lastBlob = blob; + } + } + + if (bytesToRead) { + extentStart += size; + extentLength -= size; + buffer += size; + } + } + if (bytesToRead) + break; + + if (header->encryptStart) { + aes_decrypt_key(&gExtensionsSpec[0], + gHibernateKeySizeBytes, + &cryptvars->ctx.decrypt); + + // set the vector for the following decryptions + bcopy(((uint8_t *) header) + header->image1Size - AES_BLOCK_SIZE, + &cryptvars->aes_iv[0], AES_BLOCK_SIZE); + + // decrypt the buffer + uint32_t len = (uint32_t)(header->image1Size - header->encryptStart); + aes_decrypt_cbc(((uint8_t *) header) + header->encryptStart, + &first_iv[0], + len >> 4, + ((uint8_t *) header) + header->encryptStart, + &cryptvars->ctx.decrypt); + } + + bcopy(&cryptvars->aes_iv[0], &cryptwakevars->aes_iv[0], sizeof(cryptwakevars->aes_iv)); + + bzero(&cryptvars->aes_iv[0], sizeof(cryptvars)); + bzero(&gExtensionsSpec[0], sizeof(gExtensionsSpec)); + + Close(dev); + + // Get the video info + GetMainScreenPH(&videoInfo, 0); + videoInfo.v_display = 1; + graphicsInfo->physicalAddress = videoInfo.v_baseAddr; + graphicsInfo->mode = videoInfo.v_display; + graphicsInfo->rowBytes = videoInfo.v_rowBytes; + graphicsInfo->width = videoInfo.v_width; + graphicsInfo->height = videoInfo.v_height; + graphicsInfo->depth = videoInfo.v_depth; + + WakeKernel(header, graphicsInfo, cryptwakevars, 0); + break; + } + while (0); + + // failures reboot + Interpret(0, 0, " reset-all"); +} static void Main(ClientInterfacePtr ciPtr) { @@ -129,6 +441,9 @@ static void Main(ClientInterfacePtr ciPtr) ret = InitEverything(ciPtr); if (ret != 0) Exit(); + if (gHibernateBoot) { + HibernateBoot(); + } // Get or infer the boot paths. ret = GetBootPaths(); @@ -337,7 +652,50 @@ static long InitEverything(ClientInterfacePtr ciPtr) gBootMode |= kBootModeSafe; } + size = GetProp(gOptionsPH, kIOHibernateBootImageKey, gBootDevice, 255); + if (size && (-1 != size)) do { + gBootDevice[size] = '\0'; + + // reuse gExtensionsSpec +#define keyBufSize (sizeof(gExtensionsSpec) / 2) + size = GetProp(gOptionsPH, kIOHibernateBootImageKeyKey, + gExtensionsSpec + keyBufSize, keyBufSize); + if (size && (-1 != size)) + gHibernateKeySizeBytes = UnescapeData(gExtensionsSpec + keyBufSize, size, + gExtensionsSpec, keyBufSize); + + // always clear the boot-image variable +#if kFailToBoot + Interpret(0, 0, " setenv " kIOHibernateBootImageKey); + Interpret(0, 0, " setenv " kIOHibernateBootImageKeyKey); // (will need to be done by OF) + Interpret(0, 0, " sync-nvram"); +#endif + + // safe mode means no hibernate + if (kBootModeSafe & gBootMode) break; + +#if kFailToBoot + // check we booted from nvram-set device + size = GetProp(gChosenPH, "bootpath", gBootFile, 255); + if (!size || (-1 == size)) break; + gBootFile[size] = '\0'; + + if (FindDevice(gBootFile) != FindDevice(gBootDevice)) break; +#endif + + gHibernateBoot = 1; + } while (0); + + if (gHibernateBoot) { + // Claim memory for malloc. + if (Claim(kMallocAddr_H, kMallocSize_H, 0) == 0) { + printf("Claim for malloc failed.\n"); + return -1; + } + malloc_init((char *)kMallocAddr_H, kMallocSize_H); + gImageFirstBootXAddr = kMallocAddr_H + kMallocSize_H; + } else { // Claim memory for the FS Cache. if (Claim(kFSCacheAddr, kFSCacheSize, 0) == 0) { printf("Claim for fs cache failed.\n"); diff --git a/dpkg/control b/dpkg/control deleted file mode 100644 index c3d9689..0000000 --- a/dpkg/control +++ /dev/null @@ -1,5 +0,0 @@ -Package: bootx -Maintainer: Darwin Developers -Vendor: Apple Computer, Inc. -Build-Depends: build-base -Description: Darwin booter.