Think you !
Oh , I was wrong . How careless I was.
I have fixed it :
#define _IOC_NRMASK     (((1 << _IOC_NRBITS)-1) << _IOC_NRSHIFT)  // if the  
_IOC_NRBITS is 8 ,then the result is 0XFF
#define _IOC_DIR(nr)        ((nr &  _IOC_DIRMASK) >> _IOC_DIRSHIFT)  // when 
decode , keep the same.
Now I think this will spend more time than the kernel code when executed. It 
performs an extra operation ">>", but I think it better to understand. 
     _IOC_DIRMASK         0xC0000000
     _IOC_TYPEMASK      0x0000FF00
     _IOC_NRMASK          0x000000FF
     _IOC_SIZEMASK        0x3FFF0000





At 2013-03-30 16:41:55,"Tobias Boege" <tob...@gambas-buch.de> wrote:
>On Sat, 30 Mar 2013, RS wrote:
>> it defines in the kernel:  #define _IOC_NRMASK       ((1 << _IOC_NRBITS)-1)  
>>  //define  ...  #define _IOC_NRSHIFT    0  ...  #define _IOC_DIR(nr)         
>>    (((nr) >> _IOC_DIRSHIFT) & _IOC_DIRMASK)  //when decode
>> 
>> why not define it like this:
>>   #define _IOC_NRSHIFT       0
>>   ...
>>   #define _IOC_NRMASK ((_IOC_NRSHIFT >> _IOC_NRBITS) - _IOC_NRSHIFT)   
>> //define
>>   ...
>>   #define _IOC_DIR(nr)        ((nr &  _IOC_DIRMASK) >> _IOC_DIRSHIFT)  // 
>> when decode
>> 
>> 
>> I think it is better for the word "mask" . 
>> 
>
>It can't be better this way because it's wrong. Let's compute a bit:
>
>You are referring include/uapi/asm-generic/ioctl.h AFAICS:
>
>       #define _IOC_NRBITS     8
>       #define _IOC_NRSHIFT    0
>       #define _IOC_NRMASK     ((1 << _IOC_NRBITS)-1)
>
>This gives _IOC_NRMASK = ((1 << 8) - 1) = 0xff. But supposing your
>
>       _IOC_NRMASK     ((_IOC_NRSHIFT >> _IOC_NRBITS) - _IOC_NRSHIFT)
>
>it yields _IOC_NRMASK = ((0 >> 8) - 0) = 0x00.
>
>You see? With your mask you'll never get any bits out of the ioctl number
>because it's just wrong.
>
>The same applies to _IOC_DIR(nr). You can't just exchange bitwise ands and
>shifts - you'd have to change the constants for this... and there is really
>no point in it.
>
>Regards,
>Tobi
>
>
>_______________________________________________
>Kernelnewbies mailing list
>Kernelnewbies@kernelnewbies.org
>http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies
_______________________________________________
Kernelnewbies mailing list
Kernelnewbies@kernelnewbies.org
http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies

Reply via email to