Mercurial > ecos-v3_0-branch
diff packages/io/disk/current/src/disk.c @ 2274:16ea61a1d5d4
* cdl/io_disk.cdl: Made debugging CDL controlled.
* src/disk.c: Added support to allow non-CHS disk devices to
use LBA information in MBR.
| author | asl |
|---|---|
| date | Mon, 21 Aug 2006 21:10:31 +0000 |
| parents | 0ad51d0b250b |
| children | 654c837cc618 |
line wrap: on
line diff
--- a/packages/io/disk/current/src/disk.c +++ b/packages/io/disk/current/src/disk.c @@ -58,7 +58,9 @@ // --------------------------------------------------------------------------- -//#define DEBUG 1 +#ifdef CYGDBG_IO_DISK_DEBUG +#define DEBUG 1 +#endif #ifdef DEBUG # define D(_args_) diag_printf _args_ @@ -160,18 +162,37 @@ read_partition(cyg_uint8 *dat cyg_disk_info_t *info, cyg_disk_partition_t *part) { + cyg_disk_identify_t *ident = &info->ident; cyg_uint16 c, h, s; + // Retrieve basic information part->type = data[4]; part->state = data[0]; - - READ_CHS(&data[1], c, h, s); - CHS_TO_LBA(&info->ident, c, h, s, part->start); + READ_DWORD(&data[12], part->size); - READ_CHS(&data[5], c, h, s); - CHS_TO_LBA(&info->ident, c, h, s, part->end); - - READ_DWORD(&data[12], part->size); + // If disk doesn't have cylinders/heads, use LBA data rather than CHS + if (ident->cylinders_num == 0 && ident->heads_num == 0 && + ident->sectors_num== 0) + { + // Use LBA data to determine disk size + READ_DWORD(&data[8], part->start); + part->end = (part->start + part->size) - 1; + D(("LBA partition data (%d,%d,%d)\n", + part->start, part->end, part->size)); + } + else + { + // Use CHS data to determine disk size + READ_CHS(&data[1], c, h, s); + D(("partition start CHS %d,%d,%d\n", c, h, s)); + CHS_TO_LBA(ident, c, h, s, part->start); + + READ_CHS(&data[5], c, h, s); + D(("partition end CHS %d,%d,%d\n", c, h, s)); + CHS_TO_LBA(ident, c, h, s, part->end); + D(("CHS partition data (%d,%d,%d)\n", + part->start, part->end, part->size)); + } } //
