Changeset View
Changeset View
Standalone View
Standalone View
head/sys/boot/efi/libefi/efipart.c
Show First 20 Lines • Show All 248 Lines • ▼ Show 20 Lines | efipart_cdinfo_add(EFI_HANDLE handle, EFI_HANDLE alias, | ||||
STAILQ_FOREACH(pd, &cdinfo, pd_link) { | STAILQ_FOREACH(pd, &cdinfo, pd_link) { | ||||
if (efi_devpath_match(pd->pd_devpath, devpath) != 0) { | if (efi_devpath_match(pd->pd_devpath, devpath) != 0) { | ||||
pd->pd_handle = handle; | pd->pd_handle = handle; | ||||
pd->pd_alias = alias; | pd->pd_alias = alias; | ||||
return (0); | return (0); | ||||
} | } | ||||
unit++; | unit++; | ||||
} | } | ||||
cd = malloc(sizeof(pdinfo_t)); | cd = malloc(sizeof(pdinfo_t)); | ||||
if (cd == NULL) { | if (cd == NULL) { | ||||
printf("Failed to add cd %d, out of memory\n", unit); | printf("Failed to add cd %d, out of memory\n", unit); | ||||
return (ENOMEM); | return (ENOMEM); | ||||
} | } | ||||
memset(cd, 0, sizeof(pdinfo_t)); | memset(cd, 0, sizeof(pdinfo_t)); | ||||
STAILQ_INIT(&cd->pd_part); | STAILQ_INIT(&cd->pd_part); | ||||
Show All 19 Lines | for (i = 0; i < nin; i++) { | ||||
devpath = efi_lookup_devpath(efipart_handles[i]); | devpath = efi_lookup_devpath(efipart_handles[i]); | ||||
if (devpath == NULL) | if (devpath == NULL) | ||||
continue; | continue; | ||||
if ((node = efi_devpath_last_node(devpath)) == NULL) | if ((node = efi_devpath_last_node(devpath)) == NULL) | ||||
continue; | continue; | ||||
if (efipart_floppy(node) != NULL) | if (efipart_floppy(node) != NULL) | ||||
continue; | continue; | ||||
status = BS->HandleProtocol(efipart_handles[i], | status = BS->HandleProtocol(efipart_handles[i], | ||||
&blkio_guid, (void **)&blkio); | &blkio_guid, (void **)&blkio); | ||||
if (EFI_ERROR(status)) | if (EFI_ERROR(status)) | ||||
continue; | continue; | ||||
/* | /* | ||||
* If we come across a logical partition of subtype CDROM | * If we come across a logical partition of subtype CDROM | ||||
* it doesn't refer to the CD filesystem itself, but rather | * it doesn't refer to the CD filesystem itself, but rather | ||||
* to any usable El Torito boot image on it. In this case | * to any usable El Torito boot image on it. In this case | ||||
▲ Show 20 Lines • Show All 282 Lines • ▼ Show 20 Lines | efipart_print_common(struct devsw *dev, pdinfo_list_t *pdlist, int verbose) | ||||
EFI_HANDLE h; | EFI_HANDLE h; | ||||
pdinfo_t *pd; | pdinfo_t *pd; | ||||
CHAR16 *text; | CHAR16 *text; | ||||
struct disk_devdesc pd_dev; | struct disk_devdesc pd_dev; | ||||
char line[80]; | char line[80]; | ||||
if (STAILQ_EMPTY(pdlist)) | if (STAILQ_EMPTY(pdlist)) | ||||
return (0); | return (0); | ||||
printf("%s devices:", dev->dv_name); | printf("%s devices:", dev->dv_name); | ||||
if ((ret = pager_output("\n")) != 0) | if ((ret = pager_output("\n")) != 0) | ||||
return (ret); | return (ret); | ||||
STAILQ_FOREACH(pd, pdlist, pd_link) { | STAILQ_FOREACH(pd, pdlist, pd_link) { | ||||
h = pd->pd_handle; | h = pd->pd_handle; | ||||
if (verbose) { /* Output the device path. */ | if (verbose) { /* Output the device path. */ | ||||
text = efi_devpath_name(efi_lookup_devpath(h)); | text = efi_devpath_name(efi_lookup_devpath(h)); | ||||
if (text != NULL) { | if (text != NULL) { | ||||
printf(" %S", text); | printf(" %S", text); | ||||
efi_free_devpath_name(text); | efi_free_devpath_name(text); | ||||
if ((ret = pager_output("\n")) != 0) | if ((ret = pager_output("\n")) != 0) | ||||
break; | break; | ||||
} | } | ||||
} | } | ||||
▲ Show 20 Lines • Show All 94 Lines • ▼ Show 20 Lines | efipart_open(struct open_file *f, ...) | ||||
pdi = efiblk_get_pdinfo_list(dev->d_dev); | pdi = efiblk_get_pdinfo_list(dev->d_dev); | ||||
if (pdi == NULL) | if (pdi == NULL) | ||||
return (EINVAL); | return (EINVAL); | ||||
pd = efiblk_get_pdinfo(pdi, dev->d_unit); | pd = efiblk_get_pdinfo(pdi, dev->d_unit); | ||||
if (pd == NULL) | if (pd == NULL) | ||||
return (EIO); | return (EIO); | ||||
if (pd->pd_blkio == NULL) { | if (pd->pd_blkio == NULL) { | ||||
status = BS->HandleProtocol(pd->pd_handle, &blkio_guid, | status = BS->HandleProtocol(pd->pd_handle, &blkio_guid, | ||||
(void **)&pd->pd_blkio); | (void **)&pd->pd_blkio); | ||||
if (EFI_ERROR(status)) | if (EFI_ERROR(status)) | ||||
return (efi_status_to_errno(status)); | return (efi_status_to_errno(status)); | ||||
} | } | ||||
blkio = pd->pd_blkio; | blkio = pd->pd_blkio; | ||||
▲ Show 20 Lines • Show All 67 Lines • ▼ Show 20 Lines | if (rc != ENOTTY) | ||||
return (rc); | return (rc); | ||||
} | } | ||||
switch (cmd) { | switch (cmd) { | ||||
case DIOCGSECTORSIZE: | case DIOCGSECTORSIZE: | ||||
*(u_int *)data = pd->pd_blkio->Media->BlockSize; | *(u_int *)data = pd->pd_blkio->Media->BlockSize; | ||||
break; | break; | ||||
case DIOCGMEDIASIZE: | case DIOCGMEDIASIZE: | ||||
*(off_t *)data = pd->pd_blkio->Media->BlockSize * | *(uint64_t *)data = pd->pd_blkio->Media->BlockSize * | ||||
(pd->pd_blkio->Media->LastBlock + 1); | (pd->pd_blkio->Media->LastBlock + 1); | ||||
break; | break; | ||||
default: | default: | ||||
return (ENOTTY); | return (ENOTTY); | ||||
} | } | ||||
return (0); | return (0); | ||||
} | } | ||||
▲ Show 20 Lines • Show All 107 Lines • ▼ Show 20 Lines | if ((off + size) / blkio->Media->BlockSize - 1 > | ||||
size = blkio->Media->LastBlock + 1 - | size = blkio->Media->LastBlock + 1 - | ||||
off / blkio->Media->BlockSize; | off / blkio->Media->BlockSize; | ||||
size = size * blkio->Media->BlockSize; | size = size * blkio->Media->BlockSize; | ||||
} | } | ||||
if (rsize != NULL) | if (rsize != NULL) | ||||
*rsize = size; | *rsize = size; | ||||
if ((size % blkio->Media->BlockSize == 0) && | if ((size % blkio->Media->BlockSize == 0) && | ||||
((blk * 512) % blkio->Media->BlockSize == 0)) | ((blk * 512) % blkio->Media->BlockSize == 0)) | ||||
return (efipart_readwrite(blkio, rw, | return (efipart_readwrite(blkio, rw, | ||||
blk * 512 / blkio->Media->BlockSize, | blk * 512 / blkio->Media->BlockSize, | ||||
size / blkio->Media->BlockSize, buf)); | size / blkio->Media->BlockSize, buf)); | ||||
/* | /* | ||||
* The block size of the media is not a multiple of I/O. | * The block size of the media is not a multiple of I/O. | ||||
*/ | */ | ||||
blkbuf = malloc(blkio->Media->BlockSize); | blkbuf = malloc(blkio->Media->BlockSize); | ||||
if (blkbuf == NULL) | if (blkbuf == NULL) | ||||
Show All 23 Lines |