[Skiboot] [PATCH 02/14] hdat: Parse hostboot memory reservations from HDAT

Oliver O'Halloran oohall at gmail.com
Fri Jan 13 14:41:26 AEDT 2017


On Fri, Jan 13, 2017 at 1:49 PM, Balbir Singh <bsingharora at gmail.com> wrote:
> On Thu, Jan 12, 2017 at 02:54:01PM +1100, Oliver O'Halloran wrote:
>> From: Vasant Hegde <hegdevasant at linux.vnet.ibm.com>
>>
>> +#define HRMOR_BIT (1ul << 63)
>> +
>> +static void get_hb_reserved_mem(struct HDIF_common_hdr *ms_vpd)
>> +{
>> +     const struct msvpd_hb_reserved_mem *hb_resv_mem;
>> +     u64 start_addr, end_addr, label_size;
>> +     int unnamed = 0, count, i;
>> +     char label[65];
>
> I presume this includes the NULL terminator, the HDAT structure is
> of size 64, but it also has a size field, so its not NULL terminated?

The spec doesn't say. Even if the 64 is supposed to include a
terminator I think being paranoid is a good idea here. Especially
since stewart is known to run AFL against the hdat parser...

>
>> +
>> +     /*
>> +      * XXX: Reservation names only exist on P9 and on P7/8 we get the
>> +      *      reserved ranges through the hostboot mini-FDT instead.
>> +      */
>> +     if (proc_gen < proc_gen_p9)
>> +             return;
>> +
>> +     count = HDIF_get_iarray_size(ms_vpd, MSVPD_IDATA_HB_RESERVED_MEM);
>> +     if (count <= 0) {
>> +             prerror("MS VPD: No hostboot reserved memory found\n");
>> +             return;
>> +     }
>> +
>> +     for (i = 0; i < count; i++) {
>> +             hb_resv_mem = HDIF_get_iarray_item(ms_vpd,
>> +                                                MSVPD_IDATA_HB_RESERVED_MEM,
>> +                                                i, NULL);
>> +             if (!CHECK_SPPTR(hb_resv_mem))
>> +                     continue;
>> +
>> +             label_size = be32_to_cpu(hb_resv_mem->label_size);
>> +             start_addr = be64_to_cpu(hb_resv_mem->start_addr);
>> +             end_addr = be64_to_cpu(hb_resv_mem->end_addr);
>> +
>> +             /* remove the HRMOR bypass bit */
>> +             start_addr &= ~HRMOR_BIT;
>> +             end_addr &= ~HRMOR_BIT;
>> +
>> +             if (label_size > 64)
>> +                     label_size = 64;
>> +
>> +             memcpy(label, hb_resv_mem->label, label_size);
>> +             label[label_size] = '\0';
>> +
>> +             if (strlen(label) == 0)
>> +                     snprintf(label, 64, "hostboot-reserve-%d", unnamed++);
>> +
>
> 64 including NULL terminator?
>
> Balbir Singh.


More information about the Skiboot mailing list