在arc平台上的linux wifi驱动程序上未对齐的地址访问崩溃

湿婆

我在WIFI Marvell PCIe驱动程序的insmod上崩溃。我在ARCH = arc OS = linux和little endian上运行WIFI驱动程序。崩溃回溯表示未对齐的地址访问会导致崩溃。我做了一些调查,发现了崩溃的地方,下面是代码片段。

case NullPktPeriod_i:
        /** keep alive null data pkt interval in full power mode */
        psnmp_mib->oid = wlan_cpu_to_le16((t_u16)NullPktPeriod_i);
        if (cmd_action == HostCmd_ACT_GEN_SET) {
            psnmp_mib->query_type =
                wlan_cpu_to_le16(HostCmd_ACT_GEN_SET);
            psnmp_mib->buf_size = wlan_cpu_to_le16(sizeof(t_u32));
            ul_temp = *((t_u32 *)pdata_buf);
            *((t_u32 *)(psnmp_mib->value)) =
                wlan_cpu_to_le32((t_u32)ul_temp);
            cmd->size += sizeof(t_u32);
        }
        break;

*((t_u32 *)(psnmp_mib->value)) = wlan_cpu_to_le32((t_u32)ul_temp);由于psnmp_mib->value未签名的char和类型转换为,崩溃在线unsigned long int但是我们从中分配的pdata_buf值仅是1个字节的值ul_temp = *((t_u32 *)pdata_buf);

奇怪的行为是,如果将初始化ul_temp (unsigned long int variable)为零(任何值),并且运行,则不会看到崩溃。但是PCI命令超时发生在获取get_hardware_spec命令时,内核挂起。

我没有解决此问题的线索。请提供一些输入以进一步进行操作。

打击是我的崩溃日志,

[   29.920000] Path: (null)
[   29.930000] CPU: 0 PID: 1047 Comm: kworker/u3:1 Tainted: P           O 3.12.0 #103
[   29.930000] Workqueue: MOAL_WORK_QUEUE woal_main_work_queue [pcie8xxx]
[   29.940000] task: 9f0e02c0 ti: 9d192000 task.ti: 9d192000
[   29.940000]
[ECR   ]: 0x00230400 => Misaligned r/w from 0x9d451072
[   29.950000] [EFA   ]: 0x9d451072
[   29.950000] [BLINK ]: wlan_prepare_cmd+0x1be/0x478 [mlan]
[   29.950000] [ERET  ]: wlan_ops_sta_prepare_cmd+0x1fe0/0x37dc [mlan]
[   29.950000] [STAT32]: 0x00000a06 :          E2 E1
[   29.970000] BTA: 0x78571ccc   SP: 0x9d193c34  FP: 0x00000000
[   29.980000] LPS: 0x982de26c  LPE: 0x982de270 LPC: 0x00000000
[   29.980000] r00: 0x00000000  r01: 0x00000016 r02: 0x00000012
r03: 0x0000001e r04: 0x00000000 r05: 0x9d193cb4
r06: 0x9d451064 r07: 0x7857129c r08: 0xfffffffe
r09: 0x00000000 r10: 0x000004cf r11: 0x00000002
r12: 0x00000000
[   29.990000]
[   29.990000] Stack Trace:

请帮忙。

安蒂·哈帕拉(Antti Haapala)

简单。正确的事在一般情况下,可以使用memcpy

t_u32 value = wlan_cpu_to_le32((t_u32)ul_temp);
memcpy(psnmp_mib->value, &value, sizeof (t_u32));

0andriy所指出put_unaligned可以在此处使用:

put_unaligned(wlan_cpu_to_le32((t_u32)ul_temp), (t_u32*)psnmp_mib->value);

但是,这非常令人担忧,因为C标准确实在以下情况下声明行为未定义

两种指针类型之间的转换会产生错误对齐的结果(6.3.2.3)。

因此,即使仅仅是强制转换的存在(t_u32*) 也可能导致编译器“意识到”指针psnmp_mib->value始终与对齐要求对齐t_u32


即使在“应该”允许“无处不在”的情况下,未对齐的访问-甚至将指针转换为未对齐的结构-仍具有未定义的行为

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在多个平台上构建程序?

为什么同一JAVA程序在Windows和Linux等不同平台上的工作方式不同?

如何在 Linux 平台上编译和运行 ESQL/C 程序?

linux如何在x64平台上实现mprotect的PROT_NONE模式?

Elastic Beanstalk:Amazon Linux 2平台上的日志任务自定义

在WinCE 6.0平台上启用ehci USB驱动程序

使用Maven程序集插件即使在其他平台上运行时也可以设置Linux文件权限?

ASPNETCORE 容器在 linux 服务器上加载,但“图像操作系统“windows”不能在此平台上使用”

无法在linuxmusl-x64平台上使用linux-x64二进制文件错误

不同平台上的MQ Managers上的CCSID

Intel 6280 WiFi Linux驱动程序

Linux内核初始化中未调用内置平台驱动程序__initcall

Linux设备驱动程序访问控制

如何确定Linux上的驱动程序支持哪种类型的wifi网络

如何找到Mac硬件上的macOS和linux wifi驱动程序之间的区别?

如何在Linux上安装WiFi和蓝牙驱动程序?

Photo / VideoDetector启动方法在Ubuntu平台上崩溃

可以在Linux NIC驱动程序上动态更改Rx / Tx数据包缓冲区的大小吗?

在 SAP 云平台上访问 Java Servlet

如何在Google AppEngine平台上访问Fauxton?

在各种平台上打包C ++应用程序

Android或ios平台上的Node -WebKit应用程序

如何使用delphi在多个平台上编译程序?

Linux平台驱动程序和普通设备驱动程序有什么区别?

Win 32平台上的几个Netbeans实例

Windows上的TensorFlow:“此平台上不受支持的轮子”错误

在64位平台上的WinAPI IcmpSendEcho

Linux上的NVIDIA驱动程序黑屏

AMD驱动程序使Linux Mint 17 Cinnamon崩溃