1 | /*␊ |
2 | * Supplemental ramdisk functions for the multiboot ramdisk driver.␊ |
3 | * Copyright 2009 Tamas Kosarszky. All rights reserved.␊ |
4 | *␊ |
5 | */␊ |
6 | ␊ |
7 | #include "boot.h"␊ |
8 | #include "bootstruct.h"␊ |
9 | #include "multiboot.h"␊ |
10 | #include "ramdisk.h"␊ |
11 | ␊ |
12 | struct multiboot_info * gRAMDiskMI = NULL;␊ |
13 | ␊ |
14 | // gRAMDiskVolume holds the bvr for the mounted ramdisk image.␊ |
15 | BVRef gRAMDiskVolume = NULL;␊ |
16 | bool gRAMDiskBTAliased = 0;␊ |
17 | char gRAMDiskFile[512];␊ |
18 | ␊ |
19 | void umountRAMDisk()␊ |
20 | {␊ |
21 | if (gRAMDiskMI != NULL)␊ |
22 | {␊ |
23 | // Release ramdisk BVRef and DiskBVMap.␊ |
24 | struct DiskBVMap *oldMap = diskResetBootVolumes(0x100);␊ |
25 | CacheReset();␊ |
26 | diskFreeMap(oldMap);␊ |
27 | ␊ |
28 | // Free multiboot info and module structures.␊ |
29 | if ((void *)gRAMDiskMI->mi_mods_addr != NULL) free((void *)gRAMDiskMI->mi_mods_addr);␊ |
30 | if (gRAMDiskMI != NULL) free(gRAMDiskMI);␊ |
31 | ␊ |
32 | // Reset multiboot structures.␊ |
33 | gMI = gRAMDiskMI = NULL;␊ |
34 | *gRAMDiskFile = '\0';␊ |
35 | ␊ |
36 | // Release ramdisk driver hooks.␊ |
37 | p_get_ramdisk_info = NULL;␊ |
38 | p_ramdiskReadBytes = NULL;␊ |
39 | ␊ |
40 | printf("\nunmounting: done");␊ |
41 | }␊ |
42 | }␊ |
43 | ␊ |
44 | int mountRAMDisk(const char * param)␊ |
45 | {␊ |
46 | int fh = 0, ramDiskSize;␊ |
47 | int error = 0;␊ |
48 | ␊ |
49 | // Get file handle for ramdisk file.␊ |
50 | fh = open(param, 0);␊ |
51 | if (fh != -1)␊ |
52 | {␊ |
53 | ␉printf("\nreading ramdisk image: %s", param);␊ |
54 | ␊ |
55 | ␉ramDiskSize = file_size(fh);␊ |
56 | if (ramDiskSize > 0)␊ |
57 | {␊ |
58 | // Unmount previously mounted image if exists.␊ |
59 | umountRAMDisk();␊ |
60 | ␊ |
61 | // Read new ramdisk image contents into PREBOOT_DATA area.␊ |
62 | if (read(fh, (char *)PREBOOT_DATA, ramDiskSize) != ramDiskSize) error = -1;␊ |
63 | }␊ |
64 | else error = -1;␊ |
65 | ␊ |
66 | close(fh);␊ |
67 | }␊ |
68 | else error = -1;␊ |
69 | ␊ |
70 | if (error == 0)␊ |
71 | {␊ |
72 | // Save filename in gRAMDiskFile to display information.␊ |
73 | strcpy(gRAMDiskFile, param);␊ |
74 | ␊ |
75 | // Set gMI as well for the multiboot ramdisk driver hook.␊ |
76 | gMI = gRAMDiskMI = malloc(sizeof(multiboot_info));␊ |
77 | struct multiboot_module * ramdisk_module = malloc(sizeof(multiboot_module));␊ |
78 | ␊ |
79 | // Fill in multiboot info and module structures.␊ |
80 | if (gRAMDiskMI != NULL && ramdisk_module != NULL)␊ |
81 | {␊ |
82 | gRAMDiskMI->mi_mods_count = 1;␊ |
83 | gRAMDiskMI->mi_mods_addr = (uint32_t)ramdisk_module;␊ |
84 | ramdisk_module->mm_mod_start = PREBOOT_DATA;␊ |
85 | ramdisk_module->mm_mod_end = PREBOOT_DATA + ramDiskSize;␊ |
86 | ␊ |
87 | // Set ramdisk driver hooks.␊ |
88 | p_get_ramdisk_info = &multiboot_get_ramdisk_info;␊ |
89 | p_ramdiskReadBytes = &multibootRamdiskReadBytes;␊ |
90 | ␊ |
91 | int partCount; // unused␊ |
92 | // Save bvr of the mounted image.␊ |
93 | gRAMDiskVolume = diskScanBootVolumes(0x100, &partCount);␊ |
94 | if(gRAMDiskVolume == NULL)␊ |
95 | {␊ |
96 | umountRAMDisk();␊ |
97 | printf("\nRamdisk contains no partitions.");␊ |
98 | }␊ |
99 | else␊ |
100 | {␊ |
101 | char dirSpec[128];␊ |
102 | ␊ |
103 | // Reading ramdisk configuration.␊ |
104 | strcpy(dirSpec, RAMDISKCONFIG_FILENAME);␊ |
105 | ␊ |
106 | if (loadConfigFile(dirSpec, &bootInfo->ramdiskConfig) == 0)␊ |
107 | {␊ |
108 | getBoolForKey("BTAlias", &gRAMDiskBTAliased, &bootInfo->ramdiskConfig);␊ |
109 | }␊ |
110 | else␊ |
111 | {␊ |
112 | printf("\nno ramdisk config...\n");␊ |
113 | }␊ |
114 | ␊ |
115 | printf("\nmounting: done");␊ |
116 | }␊ |
117 | }␊ |
118 | ␊ |
119 | }␊ |
120 | ␊ |
121 | return error;␊ |
122 | }␊ |
123 | ␊ |
124 | void setRAMDiskBTHook(bool mode)␊ |
125 | {␊ |
126 | gRAMDiskBTAliased = mode;␊ |
127 | if (mode == 1)␊ |
128 | {␊ |
129 | printf("\nEnabled bt(0,0) alias.");␊ |
130 | }␊ |
131 | else␊ |
132 | {␊ |
133 | printf("\nDisabled bt(0,0) alias.");␊ |
134 | }␊ |
135 | }␊ |
136 | ␊ |
137 | void showInfoRAMDisk()␊ |
138 | {␊ |
139 | int len;␊ |
140 | const char *val;␊ |
141 | ␊ |
142 | if (gRAMDiskMI != NULL)␊ |
143 | {␊ |
144 | struct multiboot_module * ramdisk_module = (void *)gRAMDiskMI->mi_mods_addr;␊ |
145 | ␊ |
146 | printf("\nfile: %s %d", gRAMDiskFile,␊ |
147 | ramdisk_module->mm_mod_end - ramdisk_module->mm_mod_start);␊ |
148 | printf("\nalias: %s", (gRAMDiskBTAliased == 1) ? "enabled" : "disabled");␊ |
149 | ␊ |
150 | // Display ramdisk information if available.␊ |
151 | ␊ |
152 | if (getValueForKey("Info", &val, &len, &bootInfo->ramdiskConfig))␊ |
153 | printf("\ninfo: %s", val);␊ |
154 | else␊ |
155 | printf("\nramdisk info not available.");␊ |
156 | ␊ |
157 | }␊ |
158 | else␊ |
159 | {␊ |
160 | printf("\nNo ramdisk mounted.");␊ |
161 | }␊ |
162 | }␊ |
163 | ␊ |
164 | int loadPrebootRAMDisk()␊ |
165 | {␊ |
166 | mountRAMDisk("bt(0,0)/Extra/Preboot.dmg");␊ |
167 | if (gRAMDiskMI != NULL)␊ |
168 | {␊ |
169 | printf("\n");␊ |
170 | return 0;␊ |
171 | }␊ |
172 | else␊ |
173 | {␊ |
174 | return -1;␊ |
175 | }␊ |
176 | }␊ |
177 | ␊ |
178 | void processRAMDiskCommand(char ** argPtr, const char * cmd)␊ |
179 | {␊ |
180 | char * ptr = *argPtr;␊ |
181 | char param[1024];␊ |
182 | getNextArg(&ptr, param);␊ |
183 | ␊ |
184 | if (strcmp(cmd, "m") == 0)␊ |
185 | {␊ |
186 | mountRAMDisk(param);␊ |
187 | sleep(2);␊ |
188 | }␊ |
189 | else if (strcmp(cmd, "u") == 0)␊ |
190 | {␊ |
191 | umountRAMDisk();␊ |
192 | sleep(2);␊ |
193 | }␊ |
194 | else if (strcmp(cmd, "e") == 0)␊ |
195 | {␊ |
196 | setRAMDiskBTHook(1);␊ |
197 | sleep(2);␊ |
198 | }␊ |
199 | else if (strcmp(cmd, "d") == 0)␊ |
200 | {␊ |
201 | setRAMDiskBTHook(0);␊ |
202 | sleep(2);␊ |
203 | }␊ |
204 | else if (strcmp(cmd, "i") == 0)␊ |
205 | {␊ |
206 | setActiveDisplayPage(1);␊ |
207 | clearScreenRows(0, 24);␊ |
208 | setCursorPosition(0, 0, 1);␊ |
209 | showInfoRAMDisk();␊ |
210 | printf("\n\nPress any key to continue.\n");␊ |
211 | getc();␊ |
212 | setActiveDisplayPage(0);␊ |
213 | }␊ |
214 | else␊ |
215 | {␊ |
216 | setActiveDisplayPage(1);␊ |
217 | clearScreenRows(0, 24);␊ |
218 | setCursorPosition(0, 0, 1);␊ |
219 | printf("\nusage:\n");␊ |
220 | printf("\n?rd i - display ramdisk information");␊ |
221 | printf("\n?rd m <filename> - mount ramdisk image\n?rd u - unmount ramdisk image");␊ |
222 | printf("\n?rd e - enable bt(0,0) alias\n?rd d - disable bt(0,0) alias");␊ |
223 | printf("\n\nPress any key to continue.\n");␊ |
224 | getc();␊ |
225 | setActiveDisplayPage(0);␊ |
226 | }␊ |
227 | }␊ |
228 | |