Chameleon

Chameleon Commit Details

Date:2011-06-26 01:55:57 (12 years 9 months ago)
Author:Evan Lojewski
Commit:1083
Parents: 1082
Message:add GetDriveInfo
Changes:
M/branches/rewrite/i386/modules/BiosDisk/BiosDisk.cpp
M/branches/rewrite/i386/modules/BiosDisk/include/BiosDisk.hpp

File differences

branches/rewrite/i386/modules/BiosDisk/include/BiosDisk.hpp
8484
8585
8686
87
87
8888
8989
9090
bool mNoEmulation;
bool mValid;
boot_drive_info_t mDriveInfo;
boot_drive_info_t* mDriveInfo;
};
branches/rewrite/i386/modules/BiosDisk/BiosDisk.cpp
7575
7676
7777
78
78
79
7980
8081
81
82
8283
8384
8485
......
8990
9091
9192
92
93
9394
9495
9596
......
232233
233234
234235
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
236342
237343
sscanf(name, "bios:/hd%d/", &mDiskID);
mDiskID += 0x80; // 0x80 = fixed disk
mDriveInfo = (boot_drive_info_t*)malloc(sizeof(boot_drive_info_t));
if(BIOSRead(0, 0, 1, 1) == 0 && GetDriveInfo() == 0)
{
mBytesPerSector = mDriveInfo.params.phys_nbps;
mBytesPerSector = mDriveInfo->params.phys_nbps;
printf("Disk: 0x%X (%d sectors)\n", mDiskID, mBytesPerSector);
}
else
BiosDisk::~BiosDisk()
{
if(mDriveInfo) free(mDriveInfo);
}
IOReturn BiosDisk::Read(UInt64 sector, UInt64 size, UInt8* buffer)
UInt8 BiosDisk::GetDriveInfo()
{
return 0; // TODO: finish this
// we use the BIOS_ADDR (disk buffer) to ensure that the buffer
// is in low mem
boot_drive_info_t* actualInfo = mDriveInfo;
mDriveInfo = (boot_drive_info_t*)BIOS_ADDR;
biosBuf_t bb;
int ret = 0;
#if UNUSED
if (maxhd == 0) {
bb.intno = 0x13;
bb.eax.r.h = 0x08;
bb.edx.r.l = 0x80;
bios(&bb);
if (bb.flags.cf == 0)
maxhd = 0x7f + bb.edx.r.l;
};
#endif
/* Check for El Torito no-emulation mode. */
//dp->no_emulation = is_no_emulation(drive);
/* Check drive for EBIOS support. */
bb.intno = 0x13;
bb.eax.r.h = 0x41;
bb.edx.r.l = mDiskID;
bb.ebx.rr = 0x55aa;
bios(&bb);
if ((bb.ebx.rr == 0xaa55) && (bb.flags.cf == 0)) {
/* Get flags for supported operations. */
mUsesEBIOS = bb.ecx.r.l;
}
if (mUsesEBIOS & (EBIOS_ENHANCED_DRIVE_INFO | EBIOS_LOCKING_ACCESS | EBIOS_FIXED_DISK_ACCESS)) {
/* Get EBIOS drive info. */
mDriveInfo->params.buf_size = sizeof(mDriveInfo->params);
bb.intno = 0x13;
bb.eax.r.h = 0x48;
bb.edx.r.l = mDiskID;
bb.esi.rr = NORMALIZED_OFFSET((unsigned)&mDriveInfo->params);
bb.ds = NORMALIZED_SEGMENT((unsigned)&mDriveInfo->params);
bios(&bb);
if (bb.flags.cf != 0 /* || params.phys_sectors < 2097152 */) {
mUsesEBIOS = 0;
mDriveInfo->params.buf_size = 1;
}
else
{
if (mDiskID >= BASE_HD_DRIVE &&
(mUsesEBIOS & EBIOS_ENHANCED_DRIVE_INFO) &&
mDriveInfo->params.buf_size >= 30 &&
!(mDriveInfo->params.dpte_offset == 0xFFFF && mDriveInfo->params.dpte_segment == 0xFFFF)) {
void *ptr = (void *)(mDriveInfo->params.dpte_offset + ((unsigned int)mDriveInfo->params.dpte_segment << 4));
bcopy(ptr, &mDriveInfo->dpte, sizeof(mDriveInfo->dpte));
}
}
}
/*
* zef: This code will fail on recent JMicron and Intel option ROMs
*/
//if (mDriveInfo->params.phys_heads == 0 || mDriveInfo->params.phys_spt == 0) {
///* Either it's not EBIOS, or EBIOS didn't tell us. */
//bb.intno = 0x13;
//bb.eax.r.h = 0x08;
//bb.edx.r.l = drive;
//bios(&bb);
//if (bb.flags.cf == 0 && bb.eax.r.h == 0) {
//unsigned long cyl;
//unsigned long sec;
//unsigned long hds;
//
//hds = bb.edx.r.h;
//sec = bb.ecx.r.l & 0x3F;
//if ((dp->uses_ebios & EBIOS_ENHANCED_DRIVE_INFO) && (sec != 0)) {
//cyl = (mDriveInfo->params.phys_sectors / ((hds + 1) * sec)) - 1;
//} else {
//cyl = bb.ecx.r.h | ((bb.ecx.r.l & 0xC0) << 2);
//}
//mDriveInfo->params.phys_heads = hds;
//mDriveInfo->params.phys_spt = sec;
//mDriveInfo->params.phys_cyls = cyl;
//} else {
//ret = -1;
//}
//}
/*
if (dp->no_emulation) {
// Some BIOSes give us erroneous EBIOS support information.
// Assume that if you're on a CD, then you can use
// EBIOS disk calls.
//
dp->uses_ebios |= EBIOS_FIXED_DISK_ACCESS;
}*/
if (ret == 0) {
mValid = 1;
}
bcopy(mDriveInfo, actualInfo, sizeof(boot_drive_info_t));
mDriveInfo = actualInfo;
return ret;
}

Archive Download the corresponding diff file

Revision: 1083