Christian Franke <[EMAIL PROTECTED]> writes:
> Marco Gerards wrote:
>> ...
>>> +static int
>>> +addr_is_valid (grub_addr_t addr)
>>> +{
>>> + volatile unsigned char * p = (volatile unsigned char *)addr;
>>>
>>
>> Why volatile? I have the feeling it is not needed.
>>
>>
>>> + unsigned char x, y;
>>> + x = *p;
>>> + *p = x ^ 0xcf;
>>> + y = *p;
>>> + *p = x;
>>> + return y == (x ^ 0xcf);
>>> +}
>>>
>>
>>
>
> volatile is necessary here to tell the complier that the memory
> address might not behave like regular memory. Otherwise, the optimizer
> might legitimately remove memory accesses and then constant
> propagation detects an unchanged value.
>
> gcc actually does a very good job here. Result with volatile removed:
I think this is just normal memory, not memory mapped hardware. Or
perhaps I am misunderstanding something here.
>
> $ gcc -S -O -fomit-frame-pointer init.c && cat init.s
> ...
> addr_is_valid:
> movl $1, %eax
> ret
> ...
>
>
> aka:
>
> static int
> addr_is_valid (grub_addr_t addr)
> {
> return 1;
> }
>
>
> This is at least a proof that the original function returns the
> correct result when real memory is present :-)
:-)
--
Marco
_______________________________________________
Grub-devel mailing list
[email protected]
http://lists.gnu.org/mailman/listinfo/grub-devel