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

Archive Download this file

Revision: 1468