Index: trunk/CHANGES =================================================================== --- trunk/CHANGES (revision 255) +++ trunk/CHANGES (revision 256) @@ -1,3 +1,4 @@ +- md0 code. Notified xnu when an md ramdisk is specified - Optimized memory detection speed - Added displaying source device and partition number for file read operations. - Increased boot2's maximum size from 383.5k to 447.5k. Index: trunk/i386/boot2/ramdisk.h =================================================================== --- trunk/i386/boot2/ramdisk.h (revision 255) +++ trunk/i386/boot2/ramdisk.h (revision 256) @@ -8,7 +8,15 @@ #define __BOOT_RAMDISK_H #define RAMDISKCONFIG_FILENAME "rd(0,0)/RAMDisk.plist" +//#define kPostbootRamdisk +void md0Ramdisk(); +typedef struct RAMDiskParam +{ + ppnum_t base; + unsigned int size; +} RAMDiskParam; + /* mboot.c */ extern struct multiboot_info *gMI; extern int multibootRamdiskReadBytes( int biosdev, unsigned int blkno, Index: trunk/i386/boot2/boot.c =================================================================== --- trunk/i386/boot2/boot.c (revision 255) +++ trunk/i386/boot2/boot.c (revision 256) @@ -162,6 +162,8 @@ setupFakeEfi(); + md0Ramdisk(); + verbose("Starting Darwin %s\n",( archCpuType == CPU_TYPE_I386 ) ? "x86" : "x86_64"); // Cleanup the PXE base code. Index: trunk/i386/boot2/boot.h =================================================================== --- trunk/i386/boot2/boot.h (revision 255) +++ trunk/i386/boot2/boot.h (revision 256) @@ -92,6 +92,7 @@ #define kLegacyOff "USBLegacyOff" /* usb.c */ #define kEHCIhard "EHCIhard" /* usb.c */ #define kDefaultPartition "Default Partition" /* sys.c */ +#define kMD0Image "md0" /* ramdisk.h */ /* * Flags to the booter or kernel Index: trunk/i386/boot2/ramdisk.c =================================================================== --- trunk/i386/boot2/ramdisk.c (revision 255) +++ trunk/i386/boot2/ramdisk.c (revision 256) @@ -16,6 +16,89 @@ bool gRAMDiskBTAliased = false; char gRAMDiskFile[512]; + +// Notify OS X that a ramdisk has been setup. XNU with attach this to /dev/md0 +void md0Ramdisk() +{ + RAMDiskParam ramdiskPtr; + char filename[512]; + const char* override_filename = 0; + int fh = -1; + int len; + + if(getValueForKey(kMD0Image, &override_filename, &len, + &bootInfo->bootConfig)) + { + // Use user specified md0 file + sprintf(filename, "%s", override_filename); + fh = open(filename, 0); + + if(fh < 0) + { + sprintf(filename, "rd(0,0)/Extra/%s", override_filename); + if((fh = open(filename, 0)) < 0) + { + sprintf(filename, "/Extra/%s", override_filename); + fh = open(filename, 0); + + } + } + } + + + if(fh < 0) + { + // Fallback to Postboot.img + sprintf(filename, "rd(0,0)/Extra/Postboot.img"); + fh = open(filename, 0); + if(fh < 0) + { + sprintf(filename, "/Extra/Postboot.img"); // Check /Extra if not in rd(0,0) + fh = open(filename, 0); + + } + } + + if (fh >= 0) + { + verbose("Enabling ramdisk %s\n", filename); + + ramdiskPtr.size = file_size(fh); + ramdiskPtr.base = AllocateKernelMemory(ramdiskPtr.size); + + if(ramdiskPtr.size && ramdiskPtr.base) + { + // Read new ramdisk image contents in kernel memory. + if (read(fh, (char*) ramdiskPtr.base, ramdiskPtr.size) == ramdiskPtr.size) + { + AllocateMemoryRange("RAMDisk", ramdiskPtr.base, ramdiskPtr.size, kBootDriverTypeInvalid); + Node* node = DT__FindNode("/chosen/memory-map", false); + if(node != NULL) + { + DT__AddProperty(node, "RAMDisk", sizeof(RAMDiskParam), (void*)&ramdiskPtr); + + } + else + { + verbose("Unable to notify Mac OS X of the ramdisk %s.\n", filename); + } + + } + else { + verbose("Unable to read md0 image %s.\n", filename); + } + + } else { + verbose("md0 image %s is empty.\n", filename); + } + + + close(fh); + + } +} + + void umountRAMDisk() { if (gRAMDiskMI != NULL)