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

Archive Download this file

Revision: 1931