len = ~0u;
if (iter->di.lbacnt < len)
len = (uint32_t)iter->di.lbacnt;
- *(uint32_t *)ha->start = lba2chs(&iter->di, 0, l2c_cadd);
- *(uint32_t *)ha->end = lba2chs(&iter->di, len - 1, l2c_cadd);
+ lba2chs(&ha->start, &iter->di, 0, l2c_cadd);
+ lba2chs(&ha->end, &iter->di, len - 1, l2c_cadd);
ha->active_flag = 0x80;
ha->ostype = 0xDA; /* "Non-FS Data", anything is good here though ... */
ha->start_lba = 0;
error("Could not build GPT hand-over record!\n");
goto bail;
}
- *(uint32_t *)ha->start = lba2chs(&iter->di, gp->lba_first, l2c_cadd);
- *(uint32_t *)ha->end = lba2chs(&iter->di, gp->lba_last, l2c_cadd);
+ lba2chs(&ha->start, &iter->di, gp->lba_first, l2c_cadd);
+ lba2chs(&ha->end, &iter->di, gp->lba_last, l2c_cadd);
ha->active_flag = 0x80;
ha->ostype = 0xED;
/* All bits set by default */
error("Could not build MBR hand-over record!\n");
goto bail;
}
- *(uint32_t *)ha->start = lba2chs(&iter->di, iter->start_lba, l2c_cadd);
- *(uint32_t *)ha->end = lba2chs(&iter->di, iter->start_lba + dp->length - 1, l2c_cadd);
+ lba2chs(&ha->start, &iter->di, iter->start_lba, l2c_cadd);
+ lba2chs(&ha->end, &iter->di, iter->start_lba + dp->length - 1, l2c_cadd);
ha->active_flag = dp->active_flag;
ha->ostype = dp->ostype;
ha->start_lba = (uint32_t)iter->start_lba; /* fine, we iterate over legacy scheme */
ochs1 = *(uint32_t *)dp->start;
ochs2 = *(uint32_t *)dp->end;
- *(uint32_t *)dp->start =
- lba2chs(di, lba1, l2c_cadd) |
- (*(uint32_t *)dp->start & 0xFF000000);
-
- *(uint32_t *)dp->end =
- lba2chs(di, lba1 + dp->length - 1, l2c_cadd) |
- (*(uint32_t *)dp->end & 0xFF000000);
+ lba2chs(&dp->start, di, lba1, l2c_cadd);
+ lba2chs(&dp->end, di, lba1 + dp->length - 1, l2c_cadd);
return
*(uint32_t *)dp->start != ochs1 ||
} while (!cnt || (cnt < 0 && errno == EAGAIN));
}
-uint32_t lba2chs(const struct disk_info *di, uint64_t lba, uint32_t mode)
+void lba2chs(disk_chs *dst, const struct disk_info *di, uint64_t lba, uint32_t mode)
{
uint32_t c, h, s, t;
uint32_t cs, hs, ss;
c = t / hs;
}
- return h | (s << 8) | ((c & 0x300) << 6) | ((c & 0xFF) << 16);
+ (*dst)[0] = h;
+ (*dst)[1] = s | ((c & 0x300) >> 2);
+ (*dst)[2] = c;
}
uint32_t get_file_lba(const char *filename)
void error(const char *msg);
int guid_is0(const struct guid *guid);
void wait_key(void);
-uint32_t lba2chs(const struct disk_info *di, uint64_t lba, uint32_t mode);
+void lba2chs(disk_chs *dst, const struct disk_info *di, uint64_t lba, uint32_t mode);
uint32_t get_file_lba(const char *filename);
int drvoff_detect(int type, unsigned int *off);
int bpb_detect(const uint8_t *bpb, const char *tag);