Home | History | Annotate | Download | only in syslinux

Lines Matching refs:diskinfo

71  * @v diskinfo			The structure to save the queried params to
74 int disk_get_params(int disk, struct disk_info *const diskinfo)
80 memset(diskinfo, 0, sizeof *diskinfo);
81 diskinfo->disk = disk;
82 diskinfo->bps = SECTOR;
95 diskinfo->ebios = 1;
103 if (diskinfo->ebios) {
116 diskinfo->lbacnt = eparam->lbacnt;
118 diskinfo->bps = eparam->bps;
137 rv = diskinfo->ebios ? 0 : -1;
141 diskinfo->spt = 0x3f & outreg.ecx.b[0];
142 diskinfo->head = 1 + outreg.edx.b[1];
143 diskinfo->cyl = 1 + (outreg.ecx.b[1] | ((outreg.ecx.b[0] & 0xc0u) << 2));
145 if (diskinfo->spt)
146 diskinfo->cbios = 1; /* Valid geometry */
148 diskinfo->head = 1;
149 diskinfo->spt = 1;
150 diskinfo->cyl = 1;
153 if (!diskinfo->lbacnt)
154 diskinfo->lbacnt = diskinfo->cyl * diskinfo->head * diskinfo->spt;
164 * @v diskinfo The disk drive to read from
171 static void *ebios_setup(const struct disk_info *const diskinfo, com32sys_t *inreg,
183 buf = lmalloc(count * diskinfo->bps);
196 inreg->edx.b[0] = diskinfo->disk;
204 * @v diskinfo The disk drive to read from
211 static void *chs_setup(const struct disk_info *const diskinfo, com32sys_t *inreg,
217 buf = lmalloc(count * diskinfo->bps);
227 s = lba % diskinfo->spt;
228 t = lba / diskinfo->spt;
229 h = t % diskinfo->head;
230 c = t / diskinfo->head;
238 inreg->edx.b[0] = diskinfo->disk;
248 * @v diskinfo The disk drive to read from
253 * Uses the disk number and information from diskinfo. Read count sectors
256 void *disk_read_sectors(const struct disk_info *const diskinfo, uint64_t lba,
265 maxcnt = (size - diskinfo->bps) / diskinfo->bps;
266 if (!count || count > maxcnt || lba + count > diskinfo->lbacnt)
271 if (diskinfo->ebios)
272 buf = ebios_setup(diskinfo, &inreg, lba, count, EBIOS_READ_CODE);
274 buf = chs_setup(diskinfo, &inreg, lba, count, CHS_READ_CODE);
282 data = malloc(count * diskinfo->bps);
284 memcpy(data, buf, count * diskinfo->bps);
293 * @v diskinfo The disk drive to write to
299 * Uses the disk number and information from diskinfo.
302 int disk_write_sectors(const struct disk_info *const diskinfo, uint64_t lba,
311 maxcnt = (size - diskinfo->bps) / diskinfo->bps;
312 if (!count || count > maxcnt || lba + count > diskinfo->lbacnt)
317 if (diskinfo->ebios)
318 buf = ebios_setup(diskinfo, &inreg, lba, count, EBIOS_WRITE_CODE);
320 buf = chs_setup(diskinfo, &inreg, lba, count, CHS_WRITE_CODE);
325 memcpy(buf, data, count * diskinfo->bps);
339 * @v diskinfo The disk drive to write to
345 * Uses the disk number and information from diskinfo.
349 int disk_write_verify_sectors(const struct disk_info *const diskinfo,
355 rv = disk_write_sectors(diskinfo, lba, buf, count);
358 rb = disk_read_sectors(diskinfo, lba, count);
361 rv = memcmp(buf, rb, count * diskinfo->bps);