Le 11 nov. 2015 12:09 AM, "Paulo Flabiano Smorigo" < pfsmor...@linux.vnet.ibm.com> a écrit : > > Same patch with the fixes. > > --- > grub-core/disk/ieee1275/ofdisk.c | 77 ++++++++++++++++++++++++++++++++++++++++ > 1 file changed, 77 insertions(+) > > diff --git a/grub-core/disk/ieee1275/ofdisk.c b/grub-core/disk/ieee1275/ofdisk.c > index 297f058..8caca16 100644 > --- a/grub-core/disk/ieee1275/ofdisk.c > +++ b/grub-core/disk/ieee1275/ofdisk.c > @@ -260,6 +260,83 @@ dev_iterate (const struct grub_ieee1275_devalias *alias) > grub_free (buf); > return; > } > + else if (grub_strcmp (alias->type, "sas_ioa") == 0) > + { > + /* The method returns the number of disks and a table where > + * each ID is 64-bit long. Example of sas paths: > + * /pci@80000002000001f/pci1014,034A@0/sas/disk@c05db70800 > + * /pci@80000002000001f/pci1014,034A@0/sas/disk@a05db70800 > + * /pci@80000002000001f/pci1014,034A@0/sas/disk@805db70800 */ > + > + struct sas_children > + { > + struct grub_ieee1275_common_hdr common; > + grub_ieee1275_cell_t method; > + grub_ieee1275_cell_t ihandle; > + grub_ieee1275_cell_t max; > + grub_ieee1275_cell_t table; > + grub_ieee1275_cell_t catch_result; > + grub_ieee1275_cell_t nentries; > + } > + args; > + char *buf, *bufptr, *table; > + unsigned i; > + grub_uint16_t table_size; > + grub_ieee1275_ihandle_t ihandle; > + > + buf = grub_malloc (grub_strlen (alias->path) > + + sizeof ("/disk@7766554433221100")); > + if (!buf) > + return; > + > + /* Power machines documentation specify 672 as maximum SAS disks in > + one system. Using a slightly larger value to be safe. */ > + table_size = 768; > + table = grub_malloc (table_size * sizeof (grub_uint64_t)); > + > + if (!table) > + { > + grub_free (buf); > + return; > + } > + > + bufptr = grub_stpcpy (buf, alias->path); > + > + if (grub_ieee1275_open (alias->path, &ihandle)) > + { > + grub_free (buf); > + grub_free (table); > + return; > + } > + > + INIT_IEEE1275_COMMON (&args.common, "call-method", 4, 2); > + args.method = (grub_ieee1275_cell_t) "get-sas-children"; > + args.ihandle = ihandle; > + args.max = table_size; > + args.table = (grub_ieee1275_cell_t) table; > + args.catch_result = 0; > + args.nentries = 0; > + > + if (IEEE1275_CALL_ENTRY_FN (&args) == -1) > + { > + grub_ieee1275_close (ihandle); > + grub_free (table); > + grub_free (buf); > + return; > + } > + > + grub_uint64_t *ptr; > + for (i = 0; i < args.nentries; i++) > + { > + ptr = (grub_uint64_t *) (table + sizeof (grub_uint64_t) * i); > + grub_snprintf (bufptr, 64, "/disk@%" PRIxGRUB_UINT64_T, *ptr); 64 still doesn't match hour many extra bytes you have allocated > + dev_iterate_real (buf, buf); > + } > + > + grub_ieee1275_close (ihandle); > + grub_free (table); > + grub_free (buf); > + } > > if (!grub_ieee1275_test_flag (GRUB_IEEE1275_FLAG_NO_TREE_SCANNING_FOR_DISKS) > && grub_strcmp (alias->type, "block") == 0) > -- > 2.1.0 > > > _______________________________________________ > Grub-devel mailing list > Grub-devel@gnu.org > https://lists.gnu.org/mailman/listinfo/grub-devel
_______________________________________________ Grub-devel mailing list Grub-devel@gnu.org https://lists.gnu.org/mailman/listinfo/grub-devel