18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * fs/partitions/sysv68.c 48c2ecf20Sopenharmony_ci * 58c2ecf20Sopenharmony_ci * Copyright (C) 2007 Philippe De Muyter <phdm@macqel.be> 68c2ecf20Sopenharmony_ci */ 78c2ecf20Sopenharmony_ci 88c2ecf20Sopenharmony_ci#include "check.h" 98c2ecf20Sopenharmony_ci 108c2ecf20Sopenharmony_ci/* 118c2ecf20Sopenharmony_ci * Volume ID structure: on first 256-bytes sector of disk 128c2ecf20Sopenharmony_ci */ 138c2ecf20Sopenharmony_ci 148c2ecf20Sopenharmony_cistruct volumeid { 158c2ecf20Sopenharmony_ci u8 vid_unused[248]; 168c2ecf20Sopenharmony_ci u8 vid_mac[8]; /* ASCII string "MOTOROLA" */ 178c2ecf20Sopenharmony_ci}; 188c2ecf20Sopenharmony_ci 198c2ecf20Sopenharmony_ci/* 208c2ecf20Sopenharmony_ci * config block: second 256-bytes sector on disk 218c2ecf20Sopenharmony_ci */ 228c2ecf20Sopenharmony_ci 238c2ecf20Sopenharmony_cistruct dkconfig { 248c2ecf20Sopenharmony_ci u8 ios_unused0[128]; 258c2ecf20Sopenharmony_ci __be32 ios_slcblk; /* Slice table block number */ 268c2ecf20Sopenharmony_ci __be16 ios_slccnt; /* Number of entries in slice table */ 278c2ecf20Sopenharmony_ci u8 ios_unused1[122]; 288c2ecf20Sopenharmony_ci}; 298c2ecf20Sopenharmony_ci 308c2ecf20Sopenharmony_ci/* 318c2ecf20Sopenharmony_ci * combined volumeid and dkconfig block 328c2ecf20Sopenharmony_ci */ 338c2ecf20Sopenharmony_ci 348c2ecf20Sopenharmony_cistruct dkblk0 { 358c2ecf20Sopenharmony_ci struct volumeid dk_vid; 368c2ecf20Sopenharmony_ci struct dkconfig dk_ios; 378c2ecf20Sopenharmony_ci}; 388c2ecf20Sopenharmony_ci 398c2ecf20Sopenharmony_ci/* 408c2ecf20Sopenharmony_ci * Slice Table Structure 418c2ecf20Sopenharmony_ci */ 428c2ecf20Sopenharmony_ci 438c2ecf20Sopenharmony_cistruct slice { 448c2ecf20Sopenharmony_ci __be32 nblocks; /* slice size (in blocks) */ 458c2ecf20Sopenharmony_ci __be32 blkoff; /* block offset of slice */ 468c2ecf20Sopenharmony_ci}; 478c2ecf20Sopenharmony_ci 488c2ecf20Sopenharmony_ci 498c2ecf20Sopenharmony_ciint sysv68_partition(struct parsed_partitions *state) 508c2ecf20Sopenharmony_ci{ 518c2ecf20Sopenharmony_ci int i, slices; 528c2ecf20Sopenharmony_ci int slot = 1; 538c2ecf20Sopenharmony_ci Sector sect; 548c2ecf20Sopenharmony_ci unsigned char *data; 558c2ecf20Sopenharmony_ci struct dkblk0 *b; 568c2ecf20Sopenharmony_ci struct slice *slice; 578c2ecf20Sopenharmony_ci char tmp[64]; 588c2ecf20Sopenharmony_ci 598c2ecf20Sopenharmony_ci data = read_part_sector(state, 0, §); 608c2ecf20Sopenharmony_ci if (!data) 618c2ecf20Sopenharmony_ci return -1; 628c2ecf20Sopenharmony_ci 638c2ecf20Sopenharmony_ci b = (struct dkblk0 *)data; 648c2ecf20Sopenharmony_ci if (memcmp(b->dk_vid.vid_mac, "MOTOROLA", sizeof(b->dk_vid.vid_mac))) { 658c2ecf20Sopenharmony_ci put_dev_sector(sect); 668c2ecf20Sopenharmony_ci return 0; 678c2ecf20Sopenharmony_ci } 688c2ecf20Sopenharmony_ci slices = be16_to_cpu(b->dk_ios.ios_slccnt); 698c2ecf20Sopenharmony_ci i = be32_to_cpu(b->dk_ios.ios_slcblk); 708c2ecf20Sopenharmony_ci put_dev_sector(sect); 718c2ecf20Sopenharmony_ci 728c2ecf20Sopenharmony_ci data = read_part_sector(state, i, §); 738c2ecf20Sopenharmony_ci if (!data) 748c2ecf20Sopenharmony_ci return -1; 758c2ecf20Sopenharmony_ci 768c2ecf20Sopenharmony_ci slices -= 1; /* last slice is the whole disk */ 778c2ecf20Sopenharmony_ci snprintf(tmp, sizeof(tmp), "sysV68: %s(s%u)", state->name, slices); 788c2ecf20Sopenharmony_ci strlcat(state->pp_buf, tmp, PAGE_SIZE); 798c2ecf20Sopenharmony_ci slice = (struct slice *)data; 808c2ecf20Sopenharmony_ci for (i = 0; i < slices; i++, slice++) { 818c2ecf20Sopenharmony_ci if (slot == state->limit) 828c2ecf20Sopenharmony_ci break; 838c2ecf20Sopenharmony_ci if (be32_to_cpu(slice->nblocks)) { 848c2ecf20Sopenharmony_ci put_partition(state, slot, 858c2ecf20Sopenharmony_ci be32_to_cpu(slice->blkoff), 868c2ecf20Sopenharmony_ci be32_to_cpu(slice->nblocks)); 878c2ecf20Sopenharmony_ci snprintf(tmp, sizeof(tmp), "(s%u)", i); 888c2ecf20Sopenharmony_ci strlcat(state->pp_buf, tmp, PAGE_SIZE); 898c2ecf20Sopenharmony_ci } 908c2ecf20Sopenharmony_ci slot++; 918c2ecf20Sopenharmony_ci } 928c2ecf20Sopenharmony_ci strlcat(state->pp_buf, "\n", PAGE_SIZE); 938c2ecf20Sopenharmony_ci put_dev_sector(sect); 948c2ecf20Sopenharmony_ci return 1; 958c2ecf20Sopenharmony_ci} 96