Page MenuHomeFreeBSD

D10302.id27162.diff
No OneTemporary

D10302.id27162.diff

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)
{

File Metadata

Mime Type
text/plain
Expires
Thu, Mar 13, 4:45 AM (17 h, 22 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
17130122
Default Alt Text
D10302.id27162.diff (2 KB)

Event Timeline