Fixed some bugs in hal_io.h

Jonathan Larmour jifl@eCosCentric.com
Tue Dec 19 02:56:00 GMT 2006


David Fernandez wrote:
> Hi there,
> 
> This fixes some bugs in hal_io.h regarding the STRING macros that were
> lacking the "rep" prefix.

Those changes are fair enough, good catch.

> It also adds memory string macros,

I'm a bit hesitant about these, as they aren't part of the HAL API, which 
could be detrimental to code reuse. But I'll let them pass as they're 
entirely novel and no-one can fail to notice if their HAL doesn't have them.

> and does a
> slight reformat to keep everything with 80 columns.

Ok.

But those aren't the only changes:

>  #define HAL_READ_UINT8( _register_, _value_ )   \
> -CYG_MACRO_START                                 \
> -{                                               \
> -    asm volatile ( "xor %%eax,%%eax ;"          \
> -                   "inb %%dx, %%al"             \
> +({                                              \
> +    asm volatile(                               \
> +    "       xor     %%eax,%%eax     \n"         \
> +    "       inb     %%dx, %%al      \n"         \
>                     : "=a" (_value_)             \
>                     :  "d"(_register_)           \
>          );                                      \
> -}                                               \
> -CYG_MACRO_END
> +    (_value_);                                  \
> +})

You make this an expression which can be an rvalue. This is outside the 
HAL spec, and would mean that code that might initially seem usable by 
non-i386 packages, would not be. It does not really add anything. I would 
be against this change and the others like it.

>  #define HAL_READ_UINT8_STRING( _register_, _buf_, _count_)      \
>  CYG_MACRO_START                                                 \
> -    asm volatile ( "insb"                                       \
> -                   :                                            \
> -                   : "c" (_count_), "d"(_register_), "D"(_buf_) \
> +    typedef volatile struct { CYG_BYTE m[_count_]; } *mp;   \
> +    asm volatile(                                           \
> +    "       rep insb                \n"                     \
> +    :  "=m" (*(mp) (_buf_))                                 \
> +    :   "c" (_count_),                                      \
> +        "d" (_register_),                                   \
> +        "D" (_buf_)                                         \
>          );                                                      \
>  CYG_MACRO_END

Here you have added an output constraint for the _buf_ array. Won't this 
make GCC allocate an extra unused register? I'm not sure what it is 
intended to achieve either. Similarly in other _STRING functions.

A ChangeLog entry would also be appreciated, thanks.

Jifl
-- 
eCosCentric    http://www.eCosCentric.com/    The eCos and RedBoot experts
------["The best things in life aren't things."]------      Opinions==mine



More information about the Ecos-patches mailing list