Index: sys/boot/ofw/libofw/ofw_disk.c =================================================================== --- sys/boot/ofw/libofw/ofw_disk.c +++ sys/boot/ofw/libofw/ofw_disk.c @@ -154,11 +154,26 @@ } static int -ofwd_ioctl(struct open_file *f __unused, u_long cmd __unused, - void *data __unused) +ofwd_ioctl(struct open_file *f, u_long cmd, void *data) { + struct ofw_devdesc *dev = f->f_devdata; + int block_size; + unsigned int n; - return (EINVAL); + switch (cmd) { + case DIOCGSECTORSIZE: + block_size = OF_block_size(dev->d_handle); + *(u_int *)data = block_size; + break; + case DIOCGMEDIASIZE: + block_size = OF_block_size(dev->d_handle); + n = OF_blocks(dev->d_handle); + *(uint64_t *)data = (uint64_t)(n * block_size); + break; + default: + return (ENOTTY); + } + return (0); } static int Index: sys/boot/ofw/libofw/openfirm.h =================================================================== --- sys/boot/ofw/libofw/openfirm.h +++ sys/boot/ofw/libofw/openfirm.h @@ -105,6 +105,8 @@ int OF_read(ihandle_t, void *, int); int OF_write(ihandle_t, void *, int); int OF_seek(ihandle_t, u_quad_t); +unsigned int OF_blocks(ihandle_t); +int OF_block_size(ihandle_t); /* Memory functions */ void *OF_claim(void *, u_int, u_int); Index: sys/boot/ofw/libofw/openfirm.c =================================================================== --- sys/boot/ofw/libofw/openfirm.c +++ sys/boot/ofw/libofw/openfirm.c @@ -622,6 +622,53 @@ return (args.status); } +/* Blocks. */ +unsigned int +OF_blocks(ihandle_t instance) +{ + static struct { + cell_t name; + cell_t nargs; + cell_t nreturns; + cell_t instance; + cell_t result; + cell_t blocks; + } args = { + (cell_t)"#blocks", + 2, + 1, + }; + + args.instance = instance; + if (openfirmware(&args) == -1) + return ((unsigned int)-1); + return (args.blocks); +} + +/* Block size. */ +int +OF_block_size(ihandle_t instance) +{ + static struct { + cell_t name; + cell_t nargs; + cell_t nreturns; + cell_t instance; + cell_t result; + cell_t size; + } args = { + (cell_t)"block-size", + 2, + 1, + }; + + args.instance = instance; + if (openfirmware(&args) == -1) + return (512); + return (args.size); +} + +/* /* * Memory functions */ Index: sys/boot/sparc64/loader/main.c =================================================================== --- sys/boot/sparc64/loader/main.c +++ sys/boot/sparc64/loader/main.c @@ -735,6 +735,16 @@ } #ifdef LOADER_ZFS_SUPPORT +uint64_t +ldi_get_size(void *priv) +{ + int fd = (uintptr_t) priv; + uint64_t size; + + ioctl(fd, DIOCGMEDIASIZE, &size); + return (size); +} + static void sparc64_zfs_probe(void) {