[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH] x86/xen: populate boot_params with EDD data



On 03/04/13 15:53, Konrad Rzeszutek Wilk wrote:
> On Wed, Apr 03, 2013 at 12:10:49PM +0100, David Vrabel wrote:
>> From: David Vrabel <david.vrabel@xxxxxxxxxx>
>>
>> During early setup of a dom0 kernel, populate boot_params with the
>> Enhanced Disk Drive (EDD) and MBR signature data.  This makes
>> information on the BIOS boot device available in /sys/firmware/edd/.
[...]
>> --- a/arch/x86/xen/enlighten.c
>> +++ b/arch/x86/xen/enlighten.c
>> @@ -1306,6 +1307,60 @@ static const struct machine_ops xen_machine_ops 
>> __initconst = {
>>      .emergency_restart = xen_emergency_restart,
>>  };
>>  
>> +#if defined(CONFIG_EDD) || defined(CONFIG_EDD_MODULE)
>> +static void __init load_edd(void)
>> +{
>> +    struct xen_platform_op op;
>> +    struct edd_info *edd_info;
>> +    u32 *mbr_signature;
>> +    unsigned nr;
>> +    int ret;
>> +
>> +    edd_info = boot_params.eddbuf;
>> +    mbr_signature = boot_params.edd_mbr_sig_buffer;
>> +
>> +    op.cmd = XENPF_firmware_info;
>> +
>> +    op.u.firmware_info.type = XEN_FW_DISK_INFO;
>> +    for (nr = 0; nr < EDDMAXNR; nr++) {
>> +            struct edd_info *info = edd_info + nr;
>> +
>> +            op.u.firmware_info.index = nr;
>> +            info->params.length = sizeof(info->params);
>> +            set_xen_guest_handle(op.u.firmware_info.u.disk_info.edd_params,
>> +                                 &info->params);
>> +            ret = HYPERVISOR_dom0_op(&op);
>> +            if (ret)
>> +                    break;
>> +
>> +#define C(x) info->x = op.u.firmware_info.u.disk_info.x
>> +            C(device);
>> +            C(version);
>> +            C(interface_support);
>> +            C(legacy_max_cylinder);
>> +            C(legacy_max_head);
>> +            C(legacy_sectors_per_track);
>> +#undef C
>> +    }
>> +    boot_params.eddbuf_entries = nr;
>> +
>> +    op.u.firmware_info.type = XEN_FW_DISK_MBR_SIGNATURE;
>> +    for (nr = 0; nr < EDD_MBR_SIG_MAX; nr++) {
>> +            op.u.firmware_info.index = nr;
>> +            ret = HYPERVISOR_dom0_op(&op);
>> +            if (ret)
>> +                    break;
>> +            mbr_signature[nr] = 
>> op.u.firmware_info.u.disk_mbr_signature.mbr_signature;
>> +    }
>> +    boot_params.edd_mbr_sig_buf_entries = nr;
> 
> If those two loops end up terminating at different spots (say first
> one ends at nr=1, and the second at nr=5), is that going to present
> a problem?
> 
> Should we have some form of 'min(nr_earlier, nr)' to clamp down in
> case of weird oddities?

The edd firmware driver looks to correctly handle this -- it will only
show attributes for things that exist.

David

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.