Chameleon

Chameleon Svn Source Tree

Root/branches/cparm/i386/modules/RamDiskLoader/RamDiskLoader.c

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
19void loadPrebootRAMDisk_hook(void* arg1, void* arg2, void* arg3, void* arg4, void* arg5, void* arg6);
20void md0Ramdisk_hook(void* arg1, void* arg2, void* arg3, void* arg4, void* arg5, void* arg6);
21void processRAMDiskCommand_hook(void* arg1, void* arg2, void* arg3, void* arg4, void* arg5, void* arg6);
22void ramDiskLoadDrivers_hook(void* arg1, void* arg2, void* arg3, void* arg4, void* arg5, void* arg6);
23void newRamDisk_BVR_hook(void* arg1, void* arg2, void* arg3, void* arg4, void* arg5, void* arg6);
24void p_get_ramdisk_info_hook(void* arg1, void* arg2, void* arg3, void* arg4, void* arg5, void* arg6);
25void p_ramdiskReadBytes_hook(void* arg1, void* arg2, void* arg3, void* arg4, void* arg5, void* arg6);
26void is_Ram_Disk_Registred_Hook(void* arg1, void* arg2, void* arg3, void* arg4, void* arg5, void* arg6);
27
28
29enum {
30kPseudoBIOSDevRAMDisk = 0x100,
31kPseudoBIOSDevBooter = 0x101
32};
33
34void loadPrebootRAMDisk_hook(void* arg1, void* arg2, void* arg3, void* arg4, void* arg5, void* arg6)
35{
36loadPrebootRAMDisk();
37}
38
39void md0Ramdisk_hook(void* arg1, void* arg2, void* arg3, void* arg4, void* arg5, void* arg6)
40{
41md0Ramdisk();
42}
43
44void processRAMDiskCommand_hook(void* arg1, void* arg2, void* arg3, void* arg4, void* arg5, void* arg6)
45{
46char * argPtr = (char *)arg1;
47const char*bp = (const char *)arg2;
48processRAMDiskCommand(&argPtr, bp);
49}
50
51void ramDiskLoadDrivers_hook(void* arg1, void* arg2, void* arg3, void* arg4, void* arg5, void* arg6)
52{
53char dirSpecExtra[1024];
54int step = *(int*)arg1;
55switch (step) {
56case 0:
57if (LoadExtraDrivers_p != NULL)
58{
59(*LoadExtraDrivers_p)(&FileLoadDrivers);
60}
61break;
62case 1:
63// First try a specfic OS version folder ie 10.5
64snprintf(dirSpecExtra, sizeof(dirSpecExtra),"rd(0,0)/Extra/%s/", (char*)((BVRef)(uint32_t)get_env(envgBootVolume))->OSVersion);
65if (FileLoadDrivers(dirSpecExtra, sizeof(dirSpecExtra),0) != 0)
66{
67// Next we'll try the base
68strlcpy(dirSpecExtra, "rd(0,0)/Extra/",sizeof(dirSpecExtra));
69FileLoadDrivers(dirSpecExtra,sizeof(dirSpecExtra), 0);
70}
71break;
72case 2:
73// First try a specfic OS version folder ie 10.5
74snprintf(dirSpecExtra, sizeof(dirSpecExtra),"bt(0,0)/Extra/%s/", (char*)((BVRef)(uint32_t)get_env(envgBootVolume))->OSVersion);
75if (FileLoadDrivers(dirSpecExtra,sizeof(dirSpecExtra), 0) != 0)
76{
77// Next we'll try the base
78strlcpy(dirSpecExtra, "bt(0,0)/Extra/",sizeof(dirSpecExtra));
79FileLoadDrivers(dirSpecExtra,sizeof(dirSpecExtra), 0);
80}
81break;
82default:
83break;
84}
85}
86
87void newRamDisk_BVR_hook(void* arg1, void* arg2, void* arg3, void* arg4, void* arg5, void* arg6)
88{
89int biosdev = *(int*)arg1;
90BVRef *bvr1 = (BVRef*)arg2;
91if (biosdev == kPseudoBIOSDevRAMDisk)
92{
93if (gRAMDiskVolume)
94 *bvr1 = gRAMDiskVolume;
95}
96else if (biosdev == kPseudoBIOSDevBooter)
97{
98if (gRAMDiskVolume != NULL && gRAMDiskBTAliased)
99*bvr1 = gRAMDiskVolume;
100}
101}
102
103void p_get_ramdisk_info_hook(void* arg1, void* arg2, void* arg3, void* arg4, void* arg5, void* arg6)
104{
105int cc;
106int biosdev = *(int *)arg1;
107struct driveInfo *dip = (struct driveInfo *)arg2;
108int *ret = (int *)arg3;
109if(p_get_ramdisk_info != NULL)
110cc = (*p_get_ramdisk_info)(biosdev, dip);
111else
112cc = -1;
113if(cc < 0)
114{
115dip->valid = 0;
116*ret = -1;
117}
118}
119
120void p_ramdiskReadBytes_hook(void* arg1, void* arg2, void* arg3, void* arg4, void* arg5, void* arg6)
121{
122int biosdev= *(int*)arg1;
123unsigned long long blkno= *(unsigned long long*)arg2;
124unsigned int byteoff= *(unsigned int*)arg3;
125unsigned int byteCount= *(unsigned int*)arg4;
126void * buffer= (void*)arg5;
127int *ret= (int*)arg6;
128
129if(p_ramdiskReadBytes != NULL && biosdev >= 0x100)
130 *ret = (*p_ramdiskReadBytes)(biosdev, blkno, byteoff, byteCount, buffer);
131}
132
133void is_Ram_Disk_Registred_Hook(void* arg1, void* arg2, void* arg3, void* arg4, void* arg5, void* arg6){}
134
135void RamDiskLoader_start(void);
136void 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}

Archive Download this file

Revision: 2044