diff options
-rw-r--r-- | com32/include/syslinux/disk.h | 2 | ||||
-rw-r--r-- | com32/lib/syslinux/disk.c | 29 | ||||
-rw-r--r-- | com32/modules/chain.c | 18 |
3 files changed, 32 insertions, 17 deletions
diff --git a/com32/include/syslinux/disk.h b/com32/include/syslinux/disk.h index ef002e22..82513ced 100644 --- a/com32/include/syslinux/disk.h +++ b/com32/include/syslinux/disk.h @@ -63,5 +63,7 @@ extern void *disk_read_sectors(struct disk_info *diskinfo, uint64_t lba, uint8_t count); extern int disk_write_sector(struct disk_info *diskinfo, unsigned int lba, const void *data); +extern int disk_write_verify_sector(struct disk_info *diskinfo, + unsigned int lba, const void *buf); #endif /* _SYSLINUX_DISK_H */ diff --git a/com32/lib/syslinux/disk.c b/com32/lib/syslinux/disk.c index 7b7cbe4d..8223534e 100644 --- a/com32/lib/syslinux/disk.c +++ b/com32/lib/syslinux/disk.c @@ -254,3 +254,32 @@ int disk_write_sector(struct disk_info *diskinfo, unsigned int lba, return 0; /* ok */ } + +/** + * Write a disk block and verify it was written. + * + * @v diskinfo The disk drive to write to + * @v lba The logical block address to begin writing at + * @v buf The data to write + * @ret rv 0 upon success, -1 upon failure + * + * Uses the disk number and information from diskinfo. + * Writes a sector to a disk drive starting at lba, then reads it back + * to verify it was written correctly. + */ +int disk_write_verify_sector(struct disk_info *diskinfo, unsigned int lba, + const void *buf) +{ + char *rb; + int rv; + + rv = disk_write_sector(diskinfo, lba, buf); + if (rv) + return rv; /* Write failure */ + rb = disk_read_sectors(diskinfo, lba, 1); + if (!rb) + return -1; /* Readback failure */ + rv = memcmp(buf, rb, SECTOR); + free(rb); + return rv ? -1 : 0; +} diff --git a/com32/modules/chain.c b/com32/modules/chain.c index de827a20..6bf8827e 100644 --- a/com32/modules/chain.c +++ b/com32/modules/chain.c @@ -147,22 +147,6 @@ static inline void error(const char *msg) static struct disk_info diskinfo; -static int write_verify_sector(unsigned int lba, const void *buf) -{ - char *rb; - int rv; - - rv = disk_write_sector(&diskinfo, lba, buf); - if (rv) - return rv; /* Write failure */ - rb = disk_read_sectors(&diskinfo, lba, 1); - if (!rb) - return -1; /* Readback failure */ - rv = memcmp(buf, rb, SECTOR); - free(rb); - return rv ? -1 : 0; -} - /* * CHS (cylinder, head, sector) value extraction macros. * Taken from WinVBlock. Does not expand to an lvalue @@ -1008,7 +992,7 @@ static int hide_unhide(struct mbr *mbr, int part) } if (write_back) - return write_verify_sector(0, mbr); + return disk_write_verify_sector(&diskinfo, 0, mbr); return 0; /* ok */ } |