@ @ requires \valid(disk); @ requires valid_disk(disk); @ requires 0 < disk->geom.heads_per_cylinder <= 255; @ requires 0 < disk->geom.sectors_per_head <= 63; @ requires \valid_read(buffer + (0 .. DEFAULT_SECTOR_SIZE-1)); @ requires separation: \separated(disk, buffer + (0 .. DEFAULT_SECTOR_SIZE-1)); @ decreases 0; @ ensures valid_disk(disk); @*/ assigns disk->geom.cylinders; ass
| 1654 | // ensures 0 < disk->geom.heads_per_cylinder <= 255; |
| 1655 | // ensures 0 < disk->geom.sectors_per_head <= 63; |
| 1656 | static void autoset_geometry(disk_t *disk, const unsigned char *buffer, const int verbose) |
| 1657 | { |
| 1658 | /*@ assert 0 < disk->sector_size; */ |
| 1659 | if((disk->arch)->get_geometry_from_mbr!=NULL) |
| 1660 | { |
| 1661 | /*@ assert \valid_function(disk->arch->get_geometry_from_mbr); */ |
| 1662 | CHSgeometry_t geometry; |
| 1663 | geometry.cylinders=0; |
| 1664 | geometry.heads_per_cylinder=0; |
| 1665 | geometry.sectors_per_head=0; |
| 1666 | geometry.bytes_per_sector=0; |
| 1667 | disk->arch->get_geometry_from_mbr(buffer, verbose, &geometry); |
| 1668 | disk->autodetect=1; |
| 1669 | if( geometry.heads_per_cylinder > 0 && |
| 1670 | geometry.heads_per_cylinder <= 255 && |
| 1671 | geometry.sectors_per_head > 0 && |
| 1672 | geometry.sectors_per_head <= 63 |
| 1673 | ) |
| 1674 | { |
| 1675 | /*@ assert 0 < geometry.heads_per_cylinder <= 255; */ |
| 1676 | /*@ assert 0 < geometry.sectors_per_head <= 63; */ |
| 1677 | disk->geom.heads_per_cylinder=geometry.heads_per_cylinder; |
| 1678 | disk->geom.sectors_per_head=geometry.sectors_per_head; |
| 1679 | /*@ assert 0 < disk->geom.heads_per_cylinder <= 255; */ |
| 1680 | /*@ assert 0 < disk->geom.sectors_per_head <= 63; */ |
| 1681 | if(geometry.bytes_per_sector!=0) |
| 1682 | { |
| 1683 | disk->geom.bytes_per_sector=geometry.bytes_per_sector; |
| 1684 | disk->sector_size=geometry.bytes_per_sector; |
| 1685 | /*@ assert 0 < disk->sector_size; */ |
| 1686 | } |
| 1687 | /*@ assert 0 < disk->sector_size; */ |
| 1688 | } |
| 1689 | else |
| 1690 | { |
| 1691 | disk->geom.heads_per_cylinder=255; |
| 1692 | disk->geom.sectors_per_head=63; |
| 1693 | } |
| 1694 | } |
| 1695 | /*@ assert 0 < disk->sector_size; */ |
| 1696 | /*@ assert 0 < disk->geom.heads_per_cylinder <= 255; */ |
| 1697 | /*@ assert 0 < disk->geom.sectors_per_head <= 63; */ |
| 1698 | /* Round up because file is often truncated. */ |
| 1699 | disk->geom.cylinders=(disk->disk_size / disk->sector_size + |
| 1700 | (uint64_t)disk->geom.sectors_per_head * disk->geom.heads_per_cylinder - 1) / |
| 1701 | disk->geom.sectors_per_head / disk->geom.heads_per_cylinder; |
| 1702 | } |
| 1703 | |
| 1704 | /*@ |
| 1705 | @ requires \valid_read(hdr); |
no outgoing calls
no test coverage detected