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

Archive Download this file

Revision: 789