Quoting Vladimir 'φ-coder/phcoder' Serbinenko <phco...@gmail.com>:
On 28.01.2013 18:18, Paulo Flabiano Smorigo/Brazil/IBM wrote:
Quoting Vladimir 'φ-coder/phcoder' Serbinenko <phco...@gmail.com>:
On 22.01.2013 18:44, Paulo Flabiano Smorigo/Brazil/IBM wrote:
+ grub_ieee1275_open (device, &dev_ihandle);
Please don't open another handle. This can cause lockdown on some
platforms. Use the already available framework.
--
Regards
Vladimir 'φ-coder/phcoder' Serbinenko
Hi phcoder,
Here is a new version of my patch using last_ihandle. Is it ok now?
This patch lacks sanity checks. You need to check that sector size is
sane (never trust openfirmware or BIOS). Like this (taken from biosdisk.c):
if (drp->bytes_per_sector
&& !(drp->bytes_per_sector & (drp->bytes_per_sector - 1))
&& drp->bytes_per_sector >= 512
&& drp->bytes_per_sector <= 16384)
Thanks in advance
_______________________________________________
Grub-devel mailing list
Grub-devel@gnu.org
https://lists.gnu.org/mailman/listinfo/grub-devel
--
Regards
Vladimir 'φ-coder/phcoder' Serbinenko
Hi,
Sanity check added.
Best regards,
--
Paulo Flabiano Smorigo
Software Engineer
Linux Technology Center - IBM Systems & Technology Group
=== modified file 'ChangeLog'
--- ChangeLog 2013-01-27 15:17:21 +0000
+++ ChangeLog 2013-01-28 16:39:41 +0000
@@ -1,3 +1,15 @@
+2013-01-28 Paulo Flabiano Smorigo <pfsmor...@br.ibm.com>
+
+ Support Openfirmware disks with non-512B sectors.
+
+ * grub-core/disk/ieee1275/ofdisk.c (grub_ofdisk_open): Get the block
+ size of the disk.
+ * (grub_ofdisk_get_block_size): New function.
+ * (grub_ofdisk_prepare): Use the correct block size.
+ * (grub_ofdisk_read): Likewise.
+ * (grub_ofdisk_write): Likewise.
+ * include/grub/ieee1275/ofdisk.h (grub_ofdisk_get_block_size): New proto.
+
2013-01-27 Andrey Borzenkov <arvidj...@gmail.com>
* util/grub-install.in: change misleading comment about
=== modified file 'grub-core/disk/ieee1275/ofdisk.c'
--- grub-core/disk/ieee1275/ofdisk.c 2013-01-20 15:52:15 +0000
+++ grub-core/disk/ieee1275/ofdisk.c 2013-01-30 19:05:49 +0000
@@ -349,6 +349,14 @@
return grub_error (GRUB_ERR_UNKNOWN_DEVICE, "not a block device");
}
+ grub_uint32_t block_size = 0;
+ if (grub_ofdisk_get_block_size (devpath, &block_size) == 0)
+ {
+ for (disk->log_sector_size = 0;
+ (1U << disk->log_sector_size) < block_size;
+ disk->log_sector_size++);
+ }
+
/* XXX: There is no property to read the number of blocks. There
should be a property `#blocks', but it is not there. Perhaps it
is possible to use seek for this. */
@@ -415,7 +423,7 @@
last_devpath = disk->data;
}
- pos = sector << GRUB_DISK_SECTOR_BITS;
+ pos = sector << disk->log_sector_size;
grub_ieee1275_seek (last_ihandle, pos, &status);
if (status < 0)
@@ -434,9 +442,9 @@
err = grub_ofdisk_prepare (disk, sector);
if (err)
return err;
- grub_ieee1275_read (last_ihandle, buf, size << GRUB_DISK_SECTOR_BITS,
+ grub_ieee1275_read (last_ihandle, buf, size << disk->log_sector_size,
&actual);
- if (actual != (grub_ssize_t) (size << GRUB_DISK_SECTOR_BITS))
+ if (actual != (grub_ssize_t) (size << disk->log_sector_size))
return grub_error (GRUB_ERR_READ_ERROR, N_("failure reading sector 0x%llx "
"from `%s'"),
(unsigned long long) sector,
@@ -454,9 +462,9 @@
err = grub_ofdisk_prepare (disk, sector);
if (err)
return err;
- grub_ieee1275_write (last_ihandle, buf, size << GRUB_DISK_SECTOR_BITS,
+ grub_ieee1275_write (last_ihandle, buf, size << disk->log_sector_size,
&actual);
- if (actual != (grub_ssize_t) (size << GRUB_DISK_SECTOR_BITS))
+ if (actual != (grub_ssize_t) (size << disk->log_sector_size))
return grub_error (GRUB_ERR_WRITE_ERROR, N_("failure writing sector 0x%llx "
"to `%s'"),
(unsigned long long) sector,
@@ -493,3 +501,44 @@
grub_disk_dev_unregister (&grub_ofdisk_dev);
}
+
+grub_err_t
+grub_ofdisk_get_block_size (const char *device, grub_uint32_t *block_size)
+{
+ struct size_args_ieee1275
+ {
+ struct grub_ieee1275_common_hdr common;
+ grub_ieee1275_cell_t method;
+ grub_ieee1275_cell_t ihandle;
+ grub_ieee1275_cell_t result;
+ grub_ieee1275_cell_t size1;
+ grub_ieee1275_cell_t size2;
+ } args_ieee1275;
+
+ if (last_ihandle)
+ grub_ieee1275_close (last_ihandle);
+
+ last_ihandle = 0;
+ last_devpath = NULL;
+
+ grub_ieee1275_open (device, &last_ihandle);
+ if (! last_ihandle)
+ return grub_error (GRUB_ERR_UNKNOWN_DEVICE, "can't open device");
+
+ INIT_IEEE1275_COMMON (&args_ieee1275.common, "call-method", 2, 2);
+ args_ieee1275.method = (grub_ieee1275_cell_t) "block-size";
+ args_ieee1275.ihandle = last_ihandle;
+ args_ieee1275.result = 1;
+
+ *block_size = GRUB_DISK_SECTOR_SIZE;
+
+ if ((IEEE1275_CALL_ENTRY_FN (&args_ieee1275) == -1) || (args_ieee1275.result))
+ grub_dprintf ("disk", "can't get block size\n");
+ else
+ if (args_ieee1275.size1
+ && !(args_ieee1275.size1 & (args_ieee1275.size1 - 1))
+ && args_ieee1275.size1 >= 512 && args_ieee1275.size1 <= 16384)
+ *block_size = args_ieee1275.size1;
+
+ return 0;
+}
=== modified file 'include/grub/ieee1275/ofdisk.h'
--- include/grub/ieee1275/ofdisk.h 2007-07-21 23:32:33 +0000
+++ include/grub/ieee1275/ofdisk.h 2013-01-28 16:14:09 +0000
@@ -22,4 +22,7 @@
extern void grub_ofdisk_init (void);
extern void grub_ofdisk_fini (void);
+extern grub_err_t grub_ofdisk_get_block_size (const char *device,
+ grub_uint32_t *block_size);
+
#endif /* ! GRUB_INIT_HEADER */
_______________________________________________
Grub-devel mailing list
Grub-devel@gnu.org
https://lists.gnu.org/mailman/listinfo/grub-devel