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