1 | /*␊ |
2 | * RamDiskLoader.c␊ |
3 | * Chameleon␊ |
4 | *␊ |
5 | * Created by cparm on 05/12/10. <armelcadetpetit@gmail.com>␊ |
6 | * Copyright 2010. All rights reserved.␊ |
7 | *␊ |
8 | */␊ |
9 | ␊ |
10 | #include "boot.h"␊ |
11 | #include "libsaio.h"␊ |
12 | #include "bootstruct.h"␊ |
13 | #include "modules.h"␊ |
14 | #include "ramdisk.h"␊ |
15 | #include "drivers.h"␊ |
16 | #include "disk.h"␊ |
17 | ␊ |
18 | ␊ |
19 | #define kEnableEDL␉␉␉"EnableRamDiskLoader"␊ |
20 | ␊ |
21 | ␊ |
22 | enum {␊ |
23 | ␉kPseudoBIOSDevRAMDisk = 0x100,␊ |
24 | ␉kPseudoBIOSDevBooter = 0x101␊ |
25 | };␊ |
26 | ␊ |
27 | void loadPrebootRAMDisk_hook(void* arg1, void* arg2, void* arg3, void* arg4, void* arg5, void* arg6)␊ |
28 | {␊ |
29 | ␉loadPrebootRAMDisk();␉␊ |
30 | }␊ |
31 | ␊ |
32 | void md0Ramdisk_hook(void* arg1, void* arg2, void* arg3, void* arg4, void* arg5, void* arg6)␊ |
33 | {␊ |
34 | ␉md0Ramdisk();␉␊ |
35 | }␊ |
36 | ␊ |
37 | void processRAMDiskCommand_hook(void* arg1, void* arg2, void* arg3, void* arg4, void* arg5, void* arg6)␊ |
38 | {␊ |
39 | ␉char * argPtr = (char *)arg1;␊ |
40 | ␉const char*bp = (const char *)arg2;␊ |
41 | ␉processRAMDiskCommand(&argPtr, bp);␊ |
42 | }␊ |
43 | ␊ |
44 | void ramDiskLoadDrivers_hook(void* arg1, void* arg2, void* arg3, void* arg4, void* arg5, void* arg6)␊ |
45 | {␊ |
46 | ␉char dirSpecExtra[1024];␊ |
47 | ␉int step = *(int*)arg1;␉␊ |
48 | ␉switch (step) {␊ |
49 | ␉␉case 0:␊ |
50 | ␉␉␉if (LoadExtraDrivers_p != NULL)␊ |
51 | ␉␉␉{␊ |
52 | ␉␉␉␉(*LoadExtraDrivers_p)(&FileLoadDrivers);␊ |
53 | ␉␉␉}␊ |
54 | ␉␉␉break;␊ |
55 | ␉␉case 1:␊ |
56 | ␉␉␉// First try a specfic OS version folder ie 10.5␊ |
57 | ␉␉␉sprintf(dirSpecExtra, "rd(0,0)/Extra/%s/", &gMacOSVersion);␊ |
58 | ␉␉␉if (FileLoadDrivers(dirSpecExtra, 0) != 0)␊ |
59 | ␉␉␉{␉␊ |
60 | ␉␉␉␉// Next we'll try the base␊ |
61 | ␉␉␉␉strcpy(dirSpecExtra, "rd(0,0)/Extra/");␊ |
62 | ␉␉␉␉FileLoadDrivers(dirSpecExtra, 0);␊ |
63 | ␉␉␉}␊ |
64 | ␉␉␉break;␊ |
65 | ␉␉case 2:␊ |
66 | ␉␉␉// First try a specfic OS version folder ie 10.5␊ |
67 | ␉␉␉sprintf(dirSpecExtra, "bt(0,0)/Extra/%s/", &gMacOSVersion);␊ |
68 | ␉␉␉if (FileLoadDrivers(dirSpecExtra, 0) != 0)␊ |
69 | ␉␉␉{␉␊ |
70 | ␉␉␉␉// Next we'll try the base␊ |
71 | ␉␉␉␉strcpy(dirSpecExtra, "bt(0,0)/Extra/");␊ |
72 | ␉␉␉␉FileLoadDrivers(dirSpecExtra, 0);␊ |
73 | ␉␉␉}␊ |
74 | ␉␉␉break;␊ |
75 | ␉␉default:␊ |
76 | ␉␉␉break;␊ |
77 | ␉}␉␊ |
78 | }␊ |
79 | ␊ |
80 | void newRamDisk_BVR_hook(void* arg1, void* arg2, void* arg3, void* arg4, void* arg5, void* arg6)␊ |
81 | {␊ |
82 | ␉int biosdev = *(int*)arg1;␊ |
83 | ␉BVRef *bvr1 = (BVRef*)arg2;␊ |
84 | ␉if (biosdev == kPseudoBIOSDevRAMDisk)␊ |
85 | ␉{␉␉␊ |
86 | ␉␉if (gRAMDiskVolume)␊ |
87 | ␉␉ *bvr1 = gRAMDiskVolume;␊ |
88 | ␉} ␊ |
89 | ␉else if (biosdev == kPseudoBIOSDevBooter)␊ |
90 | ␉{␊ |
91 | ␉␉if (gRAMDiskVolume != NULL && gRAMDiskBTAliased)␊ |
92 | ␉␉␉*bvr1 = gRAMDiskVolume;␊ |
93 | ␉}␊ |
94 | }␊ |
95 | ␊ |
96 | void p_get_ramdisk_info_hook(void* arg1, void* arg2, void* arg3, void* arg4, void* arg5, void* arg6)␊ |
97 | {␊ |
98 | ␉int cc;␊ |
99 | ␉int biosdev = *(int *)arg1;␊ |
100 | ␉struct driveInfo *dip = (struct driveInfo *)arg2;␉␊ |
101 | ␉int *ret = (int *)arg3;␊ |
102 | ␉if(p_get_ramdisk_info != NULL)␊ |
103 | ␉␉cc = (*p_get_ramdisk_info)(biosdev, dip);␊ |
104 | ␉else␊ |
105 | ␉␉cc = -1;␊ |
106 | ␉if(cc < 0)␊ |
107 | ␉{␊ |
108 | ␉␉dip->valid = 0;␊ |
109 | ␉␉*ret = -1;␊ |
110 | ␉}␉␊ |
111 | }␊ |
112 | ␊ |
113 | void p_ramdiskReadBytes_hook(void* arg1, void* arg2, void* arg3, void* arg4, void* arg5, void* arg6)␊ |
114 | {␉␊ |
115 | ␉int biosdev␉␉␉␉␉= *(int*)arg1;␊ |
116 | ␉unsigned long long blkno␉= *(unsigned long long*)arg2;␊ |
117 | ␉unsigned int byteoff␉␉= *(unsigned int*)arg3;␊ |
118 | ␉unsigned int byteCount␉␉= *(unsigned int*)arg4;␊ |
119 | ␉void * buffer␉␉␉␉= (void*)arg5;␊ |
120 | ␉int *ret␉␉␉␉␉= (int*)arg6;␊ |
121 | ␉␊ |
122 | ␉if(p_ramdiskReadBytes != NULL && biosdev >= 0x100)␊ |
123 | *ret = (*p_ramdiskReadBytes)(biosdev, blkno, byteoff, byteCount, buffer);␉␊ |
124 | }␊ |
125 | ␊ |
126 | void is_Ram_Disk_Registred_Hook(void* arg1, void* arg2, void* arg3, void* arg4, void* arg5, void* arg6){}␊ |
127 | ␊ |
128 | ␊ |
129 | void RamDiskLoader_start()␊ |
130 | {␊ |
131 | ␉bool enable = true;␊ |
132 | ␉getBoolForKey(kEnableEDL, &enable, &bootInfo->bootConfig) ;␊ |
133 | ␉␊ |
134 | ␉if (enable)␊ |
135 | ␉{␊ |
136 | ␉␉register_hook_callback("loadPrebootRAMDisk", &loadPrebootRAMDisk_hook);␊ |
137 | ␉␉register_hook_callback("md0Ramdisk", &md0Ramdisk_hook);␊ |
138 | ␉␉register_hook_callback("processRAMDiskCommand", &processRAMDiskCommand_hook);␊ |
139 | ␉␉register_hook_callback("ramDiskLoadDrivers", &ramDiskLoadDrivers_hook);␉␊ |
140 | ␉␉register_hook_callback("newRamDisk_BVR", &newRamDisk_BVR_hook);␊ |
141 | ␉␉register_hook_callback("p_get_ramdisk_info", &p_get_ramdisk_info_hook);␊ |
142 | ␉␉register_hook_callback("p_ramdiskReadBytes", &p_ramdiskReadBytes_hook);␊ |
143 | register_hook_callback("isRamDiskRegistred", &is_Ram_Disk_Registred_Hook);␊ |
144 | ␉}␊ |
145 | ␊ |
146 | } |