Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F112055600
D10302.id27162.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
2 KB
Referenced Files
None
Subscribers
None
D10302.id27162.diff
View Options
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
Details
Attached
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)
Attached To
Mode
D10302: loader: r316585 did miss sparc/ofw and userboot update
Attached
Detach File
Event Timeline
Log In to Comment