On 08.02.2012, at 14:30, Peter Crosthwaite wrote:

> 
> 
> On Wed, Feb 8, 2012 at 11:10 PM, Alexander Graf <ag...@suse.de> wrote:
> 
> On 08.02.2012, at 14:04, Peter Crosthwaite wrote:
> 
>> 
>> 
>> On Wed, Feb 8, 2012 at 10:41 PM, Alexander Graf <ag...@suse.de> wrote:
>> 
>> On 08.02.2012, at 13:27, Paul Brook wrote:
>> 
>> >> 2012/2/8 Paul Brook <p...@codesourcery.com>
>> >>
>> >>>>> I suspect we want to replace the arm_load_kernel call with an
>> >>>>> arm_linux_loader device with appropriate properties.
>> >>>>
>> >>>> Ok, so does this mean the machine model would still explicitly
>> >>>> instantiate the bootloader device?
>> >>>
>> >>> Yes.  Bootloaders inherently have machine specific knowledge.  They need
>> >>> to know ram location, board ID, secondary CPU boot protocols, etc.
>> >>> Requiring the user specify all these things separately from the rest of
>> >>> the machine description is IMO not acceptable.
>> >>
>> >> So what im suggesting here is that machines export these properties to a
>> >> globally accessible location. Perhaps via the machine opts mechanism? Then
>> >> we are in a best of both worls situation where machine models do not need
>> >> bootloader awareness yet bootloaders can still query qemu for ram_size,
>> >> smp#, board_id and friends.
>> >
>> > Hmm, I suppose this might work.  I'm not sure what you think the benefit of
>> > this is though.  Fact is the machine needs to have bootloader awareness,
>> > whether it be instantating an object or setting magic variables.
>> > Having devices rummage around in global state feels messy.  I'd much rather
>> > use actual properties on the device.  IMO changing the bootloader is 
>> > similar
>> > complexity to (say) changing a UART. i.e. it's a board-level change not an
>> > end-user level change.  Board-level changes are something that will happen
>> > after QOM conversion, i.e. when we replace machine->init with a board 
>> > config
>> > file.
>> 
>> 
>> Yeah, basically the variable flow goes:
>> 
>>  vl.c -> machine_opts -> machine_init() -> device properties -> device_init()
>>  
>> So that the machine init function that creates the bootloader device 
>> enumerates the machine_opts (just like is done in Peter's patches) and then 
>> passes those on to the bootloader device as device properties.
>> 
>> 
>> So in patch 4/4 in Peters series where he adds a new bootloader feature (the 
>> -dtb switch) its done slightly differently, the machine model does not 
>> handle the machine_opts at all, i.e. The machine model has no awareness of 
>> this dtb argument. Instead the arm boot loader directly queries the 
>> machine_opts API itself:
>> 
>> @@ -251,6 +317,9 @@ void arm_load_kernel(CPUState *env, struct arm_boot_info 
>> *info)
>>         exit(1);
>>     }
>> 
>> +    info->dtb_filename = 
>> qemu_opt_get(qemu_opts_find(qemu_find_opts("machine"),
>> +                                                     0), "dtb");
>> +
>> 
>> There is no path through the machine_init for this particular property.
> 
> Ah, I see. So he derived from the original proposal, oh well :).
> 
> 
> Isn't this the best approach tho? If you changed it over to the other flow, 
> then you would end up with a change pattern where every machine model would 
> need to get and pass the new argument. This way the diff is limited to the 
> command line infrastructure and the bootloader.

If you want the smallest diff, just make things globals and call it a day. This 
whole thing is a discussion around device architecture, right?

>  
>> What I am suggesting is that a similar approach is take for machine model 
>> set properties (such as ram_size), but instead of the command line setting 
>> the props its done by the machine model. The machine model qemu_opt_set() 
>> the ram_size = whatever. Then the bootloader qemu_opt_get()s it. If you did 
>> this for the key properties related to boot then you would remove the need 
>> for machines to have awareness of their boot process.
> 
> But that's exactly what we want. We want the machine to be aware of its boot 
> process, because that's the one place that needs to instantiate the boot 
> device, no?
> 
> 
> More a case of the reverse isnt it? The bootloader needs to know about the 
> machine its generating code for, but the machine generation process doesnt 
> need to know about the software its going to run. The machine being aware of 
> the bootloader implementation and instantiating it you are putting in place a 
> policy where you forcing a particular bootflow on every user of that machine. 
> The hardware is placing policy on what software its running.
> 
> In the case of arm boot you end up with a situation where you are trying to 
> write a bootloader that can handle every possible scenario, what I am 
> suggesting is arm_boot.c as it is becomes a linux specific bootloader and 
> other bootflows such as booting from elfs or raw images (or other unforseen 
> bootflows) are different bootloader devices. The choice of which bootloader 
> you use is driven by which -device you put down on command line.

Hrm. I wouldn't want to have to select different bootloader types using 
-device. Today, we have autodetect code in almost all targets that checks the 
binary and figures out what to load from it. So on x86 you just do -kernel foo 
and if foo is a Linux kernel, it will run it using that loader, while if it's a 
multiboot image, it will load it through that.

Any reason you can't just upstream your specific bootloader code? We can then 
worry about replacing the loader device at a different point in time and model 
things easily now.


Alex

Reply via email to