[coreboot] Multiboot
Carl-Daniel Hailfinger
c-d.hailfinger.devel.2006 at gmx.net
Tue Sep 23 16:08:06 CEST 2008
On 23.09.2008 15:19, Robert Millan wrote:
> On Tue, Sep 23, 2008 at 10:10:31AM +0200, Mathias Krause wrote:
>
>> Robert Millan wrote:
>>
>>> - Add "edx" to clobber list. Together with eax and ecx which are already
>>> in input list, this makes the call able to return for any payload that
>>> complies with "cdecl" calling convention.
>>>
>> ...
>>
>>> +
>>> +static int run_address_multiboot(void *f)
>>> +{
>>> + int ret;
>>> + __asm__ __volatile__ ("call *%3" : "=a" (ret) : "a" (MB_MAGIC2), "b" (0xf0000), "c" (f) : "edx");
>>> + return ret;
>>> +}
>>> +
>>>
>> this assembler inline is not quite correct to be able to let the call
>> return because the compiler assumes that after this assembler statement
>> %ecx still holds the value f which hasn't to be the case. It assumes the
>> same for %ebx but this should be no problem since the calling function
>> must preserve it's value if it follows the C calling convention. But
>> %ecx isn't one of the registers that needs to be preserved, so the
>> assumption the compiler makes here is wrong.
>>
>> How about this one:
>>
>> | static int run_address_multiboot(void *f)
>> | {
>> | int ret, dummy;
>> | __asm__ __volatile__ ("call *%4" : "=a" (ret), "=c" (dummy) : "a"
>> (MB_MAGIC2), "b" (0xf0000), "c" (f) : "edx", "memory");
>> | return ret;
>> | }
>>
>
> I see. But why not just add "ecx" to clobber list instead? Then a dummy
> variable isn't needed.
>
Try it and you'll see.
Regards,
Carl-Daniel
--
http://www.hailfinger.org/
More information about the coreboot
mailing list