Search Linux Wireless

b43 : unaligned access on mips

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi,

b43_generate_plcp_hdr generate unaligned access on mips with gcc [1] from openwrt.

A small testcase [2] show that &plcp->data is access as a 32 bit aligned variable (see the "lw $2,0($4)" and "sw $2,0($4)"). I don't know enough mips to know if it is a gcc bug (ignoring the packed attribute) or something missing in b43 code.


Matthieu



[1]
mipsel-openwrt-linux-uclibc-gcc -v
Using built-in specs.
Target: mipsel-openwrt-linux-uclibc
Configured with: /mnt/data/routeur/trunk/build_dir/toolchain-mipsel_gcc-4.1.2_uClibc-0.9.29/gcc-4.1.2/configure --prefix=/mnt/data/routeur/trunk/staging_dir/toolchain-mipsel_gcc-4.1.2_uClibc-0.9.29/usr --build=i486-linux-gnu --host=i486-linux-gnu --target=mipsel-openwrt-linux-uclibc --with-gnu-ld --enable-target-optspace --disable-libgomp --disable-libmudflap --disable-multilib --disable-nls --disable-libssp --disable-__cxa_atexit --enable-languages=c,c++ --enable-shared --enable-threads --with-slibdir=/mnt/data/routeur/trunk/staging_dir/toolchain-mipsel_gcc-4.1.2_uClibc-0.9.29/lib
Thread model: posix
gcc version 4.1.2

[2]
$cat test.c
#define __le32 unsigned int
#define u32 unsigned int
#define __u8 unsigned char
#define u8 unsigned char
#define u16 unsigned short
#define cpu_to_le32(x) (x)

#define _b43_declare_plcp_hdr(size) \
        struct b43_plcp_hdr##size {             \
                union {                         \
                        __le32 data;            \
                        __u8 raw[size];         \
                } __attribute__((__packed__));  \
        } __attribute__((__packed__))

/* struct b43_plcp_hdr4 */
_b43_declare_plcp_hdr(4);

void b43_generate_plcp_hdr(struct b43_plcp_hdr4 *plcp,
                               const u16 octets, const u8 bitrate)
{
                u32 plen;
            __le32 *data = &(plcp->data);
                plen = octets * 16 / bitrate;
                *data |= cpu_to_le32(plen << 16);
}

$mipsel-openwrt-linux-uclibc-gcc test.c -Os -S
$cat test.s
        .file   1 "test.c"
        .section .mdebug.abi32
        .previous
        .abicalls
        .text
        .align  2
        .globl  b43_generate_plcp_hdr
        .ent    b43_generate_plcp_hdr
        .type   b43_generate_plcp_hdr, @function
b43_generate_plcp_hdr:
.frame $sp,0,$31 # vars= 0, regs= 0/0, args= 0, gp= 0
        .mask   0x00000000,0
        .fmask  0x00000000,0
        .set    noreorder
        .set    nomacro

        andi    $5,$5,0xffff
        sll     $5,$5,4
        andi    $6,$6,0x00ff
        bne     $6,$0,1f
        div     $0,$5,$6
        break   7
1:
        lw      $2,0($4)
        mflo    $5
        sll     $5,$5,16
        or      $2,$2,$5
        j       $31
        sw      $2,0($4)

        .set    macro
        .set    reorder
        .end    b43_generate_plcp_hdr
        .ident  "GCC: (GNU) 4.1.2"
--
To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Linux Host AP]     [ATH6KL]     [Linux Bluetooth]     [Linux Netdev]     [Kernel Newbies]     [Linux Kernel]     [IDE]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux ATA RAID]     [Samba]     [Device Mapper]
  Powered by Linux