void remove_driver(partition_map *entry) { partition_map_header *map; Block0 *p; DDMap *m; int i; int j; int f; u32 start; map = entry->the_map; p = map->misc; if (p == NULL) { return; } if (p->sbSig != BLOCK0_SIGNATURE) { return; } if (map->logical_block > p->sbBlkSize) { /* this is not supposed to happen, but let's just ignore it. */ return; } else { /* * compute the factor to convert the block numbers in block0 * into partition map block numbers. */ f = p->sbBlkSize / map->logical_block; } if (p->sbDrvrCount > 0) { m = (DDMap *) p->sbMap; for (i = 0; i < p->sbDrvrCount; i++) { start = get_align_long(&m[i].ddBlock); /* zap the driver if it is wholly contained in the partition */ if (entry->data->dpme_pblock_start <= f*start && f*(start + m[i].ddSize) <= (entry->data->dpme_pblock_start + entry->data->dpme_pblocks)) { // delete this driver // by copying down later ones and zapping the last for (j = i+1; j < p->sbDrvrCount; j++, i++) { put_align_long(get_align_long(&m[j].ddBlock), &m[i].ddBlock); m[i].ddSize = m[j].ddSize; m[i].ddType = m[j].ddType; } put_align_long(0, &m[i].ddBlock); m[i].ddSize = 0; m[i].ddType = 0; p->sbDrvrCount -= 1; return; /* XXX if we continue we will delete other drivers? */ } } } }
void remove_driver(partition_map *entry) { partition_map_header *map; Block0 *p; DDMap *m; int i; int j; int f; u32 start; map = entry->the_map; p = map->misc; if (p == NULL) { return; } if (p->sbSig != BLOCK0_SIGNATURE) { return; } if (map->logical_block > p->sbBlkSize) { return; } else { f = p->sbBlkSize / map->logical_block; } if (p->sbDrvrCount > 0) { m = (DDMap *) p->sbMap; for (i = 0; i < p->sbDrvrCount; i++) { start = get_align_long(&m[i].ddBlock); if (entry->data->dpme_pblock_start <= f*start && f*(start + m[i].ddSize) <= (entry->data->dpme_pblock_start + entry->data->dpme_pblocks)) { // delete this driver // by copying down later ones and zapping the last for (j = i+1; j < p->sbDrvrCount; j++, i++) { put_align_long(get_align_long(&m[j].ddBlock), &m[i].ddBlock); m[i].ddSize = m[j].ddSize; m[i].ddType = m[j].ddType; } put_align_long(0, &m[i].ddBlock); m[i].ddSize = 0; m[i].ddType = 0; p->sbDrvrCount -= 1; return; } } } }
void dump_block_zero(partition_map_header *map) { Block0 *p; DDMap *m; int i; double value; int prefix; int32_t t; p = map->misc; if (p->sbSig != BLOCK0_SIGNATURE) { return; } value = ((double)p->sbBlkCount) * p->sbBlkSize; adjust_value_and_compute_prefix(&value, &prefix); printf("\nDevice block size=%u, Number of Blocks=%"PRIu32" (%1.1f%c)\n", p->sbBlkSize, p->sbBlkCount, value, prefix); printf("DeviceType=0x%x, DeviceId=0x%x\n", p->sbDevType, p->sbDevId); if (p->sbDrvrCount > 0) { printf("Drivers-\n"); m = (DDMap *) p->sbMap; for (i = 0; i < p->sbDrvrCount; i++) { printf("%u: %3u @ %"PRIu32", ", i+1, m[i].ddSize, get_align_long(&m[i].ddBlock)); if (map->logical_block != p->sbBlkSize) { t = (m[i].ddSize * p->sbBlkSize) / map->logical_block; printf("(%"PRIu32"@", t); t = (get_align_long(&m[i].ddBlock) * p->sbBlkSize) / map->logical_block; printf("%"PRIu32") ", t); } printf("type=0x%x\n", m[i].ddType); } } printf("\n"); }
int contains_driver(partition_map *entry) { partition_map_header *map; Block0 *p; DDMap *m; int i; int f; u32 start; map = entry->the_map; p = map->misc; if (p == NULL) { return 0; } if (p->sbSig != BLOCK0_SIGNATURE) { return 0; } if (map->logical_block > p->sbBlkSize) { return 0; } else { f = p->sbBlkSize / map->logical_block; } if (p->sbDrvrCount > 0) { m = (DDMap *) p->sbMap; for (i = 0; i < p->sbDrvrCount; i++) { start = get_align_long(&m[i].ddBlock); if (entry->data->dpme_pblock_start <= f*start && f*(start + m[i].ddSize) <= (entry->data->dpme_pblock_start + entry->data->dpme_pblocks)) { return 1; } } } return 0; }
void show_data_structures(partition_map_header *map) { Block0 *zp; DDMap *m; int i; int j; partition_map * entry; DPME *p; BZB *bp; const char *s; if (map == NULL) { printf("No partition map exists\n"); return; } printf("Header:\n"); printf("map %d blocks out of %d, media %"PRIu32" blocks (%d byte blocks)\n", map->blocks_in_map, map->maximum_in_map, map->media_size, map->logical_block); printf("Map is%s writable", (map->writable)?kStringEmpty:kStringNot); printf(", but%s changed", (map->changed)?kStringEmpty:kStringNot); printf(" and has%s been written\n", (map->written)?kStringEmpty:kStringNot); printf("\n"); if (map->misc == NULL) { printf("No block zero\n"); } else { zp = map->misc; printf("Block0:\n"); printf("signature 0x%x", zp->sbSig); if (zp->sbSig == BLOCK0_SIGNATURE) { printf("\n"); } else { printf(" should be 0x%x\n", BLOCK0_SIGNATURE); } printf("Block size=%u, Number of Blocks=%"PRIu32"\n", zp->sbBlkSize, zp->sbBlkCount); printf("DeviceType=0x%x, DeviceId=0x%x, sbData=0x%"PRIx32"\n", zp->sbDevType, zp->sbDevId, zp->sbData); if (zp->sbDrvrCount == 0) { printf("No drivers\n"); } else { printf("%u driver%s-\n", zp->sbDrvrCount, (zp->sbDrvrCount>1)?"s":kStringEmpty); m = (DDMap *) zp->sbMap; for (i = 0; i < zp->sbDrvrCount; i++) { printf("%u: @ %"PRIu32" for %u, type=0x%x\n", i+1, get_align_long(&m[i].ddBlock), m[i].ddSize, m[i].ddType); } } } printf("\n"); /* uint32_t dpme_boot_args[32] ; uint32_t dpme_reserved_3[62] ; */ printf(" #: type length base " "flags (logical)\n"); for (entry = map->disk_order; entry != NULL; entry = entry->next_on_disk) { p = entry->data; printf("%2"PRIu32": %20.32s ", entry->disk_address, p->dpme_type); printf("%7"PRIu32" @ %-7"PRIu32" ", p->dpme_pblocks, p->dpme_pblock_start); printf("%c%c%c%c%c%c%c%c%c%c%c%c ", (dpme_valid_get(p))?'V':'.', (dpme_allocated_get(p))?'A':'.', (dpme_in_use_get(p))?'I':'.', (dpme_bootable_get(p))?'B':'.', (dpme_readable_get(p))?'R':'.', (dpme_writable_get(p))?'W':'.', (dpme_os_pic_code_get(p))?'P':'.', (dpme_os_specific_2_get(p))?'2':'.', (dpme_chainable_get(p))?'C':'.', (dpme_diskdriver_get(p))?'D':'.', (bitfield_get(p->dpme_flags, 30, 1))?'M':'.', (bitfield_get(p->dpme_flags, 31, 1))?'X':'.'); if (p->dpme_lblock_start != 0 || p->dpme_pblocks != p->dpme_lblocks) { printf("(%"PRIu32" @ %"PRIu32")", p->dpme_lblocks, p->dpme_lblock_start); } printf("\n"); } printf("\n"); printf(" #: booter bytes load_address " "goto_address checksum processor\n"); for (entry = map->disk_order; entry != NULL; entry = entry->next_on_disk) { p = entry->data; printf("%2"PRIu32": ", entry->disk_address); printf("%7"PRIu32" ", p->dpme_boot_block); printf("%7"PRIu32" ", p->dpme_boot_bytes); printf("%8"PRIx32" ", (uint32_t)p->dpme_load_addr); printf("%8"PRIx32" ", (uint32_t)p->dpme_load_addr_2); printf("%8"PRIx32" ", (uint32_t)p->dpme_goto_addr); printf("%8"PRIx32" ", (uint32_t)p->dpme_goto_addr_2); printf("%8"PRIx32" ", p->dpme_checksum); printf("%.32s", p->dpme_process_id); printf("\n"); } printf("\n"); /* xx: cccc RU *dd s... */ printf(" #: type RU *slice mount_point (A/UX only fields)\n"); for (entry = map->disk_order; entry != NULL; entry = entry->next_on_disk) { p = entry->data; printf("%2"PRIu32": ", entry->disk_address); bp = (BZB *) (p->dpme_bzb); j = -1; if (bp->bzb_magic == BZBMAGIC) { switch (bp->bzb_type) { case FSTEFS: s = "esch"; break; case FSTSFS: s = "swap"; j = 1; break; case FST: default: s = "fsys"; if (bzb_root_get(bp) != 0) { j = 0; } else if (bzb_usr_get(bp) != 0) { j = 2; } break; } printf("%4s ", s); printf("%c%c ", (bzb_root_get(bp))?'R':' ', (bzb_usr_get(bp))?'U':' '); if (bzb_slice_get(bp) != 0) { printf(" %2"PRIu32"", bzb_slice_get(bp)-1); } else if (j >= 0) { printf(" *%2d", j); } else { printf(" "); } if (bp->bzb_mount_point[0] != 0) { printf(" %.64s", bp->bzb_mount_point); } } printf("\n"); } }