+++ /dev/null
-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."
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
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;
/*
* 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
*/
Close(netIH);
+ if (length > kLoadSize) {
+ printf("\nLoadFile failure: %ld bytes overran the load buffer (%ld bytes)\n", length, kLoadSize);
+ return -1;
+ }
+
return length;
}
#include "ufs_byteorder.h"
+#include <dirent.h> // for MAXNAMLEN
+
typedef struct dinode Inode, *InodePtr;
// Private function prototypes
/*
* 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
*/
/*
-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)
#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)
*/
#include <sl.h>
+#include <IOKit/IOHibernatePrivate.h>
#include "clut.h"
#include "appleboot.h"
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)
{
/*
* drivers.c - Driver Loading Functions.
*
- * Copyright (c) 2000 Apple Computer, Inc.
+ * Copyright (c) 2000-2005 Apple Computer, Inc.
*
* DRI: Josh de Cesare
*/
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;
}
// 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;
// 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;
#include <sl.h>
#include "aes.h"
+#include <IOKit/IOHibernatePrivate.h>
static void Start(void *unused1, void *unused2, ClientInterfacePtr ciPtr);
static void Main(ClientInterfacePtr ciPtr);
long gOFVersion = 0;
char *gKeyMap;
+char gHibernateBoot;
+unsigned long gHibernateKeySizeBytes;
long gRootAddrCells;
long gRootSizeCells;
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)
{
ret = InitEverything(ciPtr);
if (ret != 0) Exit();
+ if (gHibernateBoot) {
+ HibernateBoot();
+ }
// Get or infer the boot paths.
ret = GetBootPaths();
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");
+++ /dev/null
-Package: bootx
-Maintainer: Darwin Developers <darwin-development@public.lists.apple.com>
-Vendor: Apple Computer, Inc.
-Build-Depends: build-base
-Description: Darwin booter.