- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在开发一个带有几个 PCI 插槽的 arm-linux 板。
我想检查 UBoot 中 PCI 模块的供应商 ID/设备 ID。所以我将 PCI 驱动程序的初始化部分从 linux 移植到 UBoot。
黑客:由于我板上的 PCI 拓扑是固定的,我冒昧地在 UBoot 中硬编码了总线编号(主要、次要、从属),所以我不必将枚举代码移植到 UBoot。为了获取总线编号,我编写了一个小型可加载内核模块,一旦内核完成 PCI 总线上的枚举设备,它就会为我获取
device
总线编号。
问题:现在,如果模块存在于 PCI 插槽中,我就可以成功读取它们的 ID。但是,如果某个模块不存在并且我尝试读取它的 ID,我就会被 ARM 的数据中止处理程序击中。
是否有解决此数据中止异常的方法,或者在尝试读取 ID 之前提前知道插槽是否已填充。
更新 1:我根据auselen的输入修改了UBoot源码如下:
开始.S
//添加了以下宏
.macro irq_restore_user_regs_mod
ldmia sp, {r0 - lr}^ @ Calling r0 - lr
mov r0, r0
ldr lr, [sp, #S_PC] @ Get PC
add sp, sp, #S_FRAME_SIZE
mov pc, lr @ return & move spsr_svc into cpsr
.endm
修改data_abort代码如下
data_abort:
get_bad_stack
irq_save_user_regs
bl do_data_abort
irq_restore_user_regs_mod
中断.c修改 do_data_abort 为
void do_data_abort (struct pt_regs *pt_regs)
{
if (flag == 1)
{
flag = 0;
return;
}
printf ("data abort handler\n");
printf ("Originally installed by U-Boot\n");
show_regs (pt_regs);
bad_mode ();
}
mypcie.c 尝试读取可能无效地址的代码部分
printf("Trying possibly invalid address\n");
flag = 1;
data = *((volatile unsigned int *)(0xbe200000)) ;
if (flag == 0) printf("Bad address \n");
flag = 1;
UBoot日志关注部分:
Trying possibly invalid address
data abort handler
Originally installed by U-Boot
pc : [<00012150>] lr : [<00012144>]
sp : 46069a00 ip : 78000000 fp : 00000000
r10: 07f7eca4 r9 : 00000000 r8 : 07f7efdc
r7 : 00000000 r6 : 000000f8 r5 : 00000001 r4 : bb000000
r3 : be200000 r2 : 00020b28 r1 : 00000020 r0 : 07f7ea49
Flags: nzcv IRQs on FIQs on Mode USER_32
U-Boot::Resetting CPU ...
我怀疑 *irq_restore_user_regs_mod* 正在将 UBoot 发送回 *do_data_abort*。所以第一次do_data_abort执行时flag为1,do_data_abort将flag改为0,irq_restore_user_regs_mod将UBoot发回给do_data_abort。由于标志为 0,UBoot 进入错误模式。
请告诉我是否应该使用
MOVS PC, LR
或
MOV PC, LR
在 irq_restore_user_regs_mod(代码段中的命令与文本不同)。
另外请详细说明为什么您使用MOV(S) PC, LR 而不是SUBS PC, LR, #4。
更新 2:(根据 auselen 的评论)
i) 将标志从简单的 int 更改为 volatileii) 在 interrupts.c 中添加了 printf(s) 用于调试目的如下:
printf("flag = %d\n",flag);
if (flag == 1)
{
flag = 0;
printf("FLAG = %d\n",flag);
return;
}
iii) 在文件 mypcie.c 中添加了 asm volatile(""::::"memory");
flag = 1;
asm volatile("" ::: "memory");
data = *((volatile unsigned int *)(0xbe200000)) ;
asm volatile("" ::: "memory");
if (flag == 0) printf("Bad address \n");
结果
UBoot 日志 1:
Trying possibly invalid address
flag = 1
FLAG = 0
flag = 1
FLAG = 0
(continues forever)
似乎控制一直回到flag=1; mypcie.c 中的说明如果我注释掉这条指令,并在这个函数之外将标志初始化为 1,那么我会得到以下日志:
UBoot日志2:
Trying possibly invalid address
flag = 1
FLAG = 0
flag = 0
data abort handler
Originally installed by U-Boot
pc : [<00012174>] lr : [<5306b01e>]
sp : c6a69a08 ip : 78000000 fp : 00000000
r10: 07f7eca1 r9 : 00000000 r8 : 07f7efdc
r7 : 00000000 r6 : 000000fb r5 : 00000001 r4 : bb000000
r3 : be200000 r2 : 00000000 r1 : 00000020 r0 : 07f7ea4d
Flags: nzcv IRQs on FIQs on Mode USER_32
U-Boot::Resetting CPU ...
现在看起来好像下面的指令执行了两次:
data = *((volatile unsigned int *)(0xbe200000)) ;
在第二次执行中,标志为 0,因此我们命中了数据中止。
更新 3(根据 auselen 关于 MOV、MOVS 和 SUBS 的评论)从 UBoot 目录中的 config.mk 文件中删除了 -O2 标志。
UBoot 日志
使用 subs pc, lr, #4
Trying possibly invalid address
flag = 1
FLAG = 0
prefetch abort handler
Originally installed by U-Boot
pc : [<90000004>] lr : [<00012174>]
sp : 07f7eb80 ip : 78000000 fp : 00000000
r10: 00000000 r9 : 00000000 r8 : 07f7efdc
r7 : 00000000 r6 : 00000000 r5 : 00000000 r4 : 00008e00
r3 : 00000000 r2 : c6a68e1c r1 : 00010001 r0 : 00000003
Flags: nZCv IRQs on FIQs on Mode USER_32
U-Boot::Resetting CPU ...
使用 subs pc, lr, #8
Trying possibly invalid address
flag = 1
FLAG = 0
flag = 0
data abort handler
Originally installed by U-Boot
pc : [<00012174>] lr : [<00008e7c>]
sp : c6a68cf4 ip : 78000000 fp : 00000000
r10: 07f7eca1 r9 : 00000000 r8 : 07f7efdc
r7 : 00000000 r6 : 000000fb r5 : 00000001 r4 : bb000000
r3 : be200000 r2 : 00000000 r1 : 00000020 r0 : 07f7ea4d
Flags: nzcv IRQs on FIQs on Mode USER_32
U-Boot::Resetting CPU ...
最佳答案
我自己还没有尝试过,但应该能够修改 u-boot 以处理某些地址访问期间的数据中止。
data_abort:
get_bad_stack
bad_save_user_regs
bl do_data_abort
从代码看来,bad_save_user_regs
需要更改为 irq_save_user_regs/irq_restore_user_regs*
对,就像处理 IRQ/FIQ 一样。使 data_abort
读起来像
data_abort:
get_bad_stack
irq_save_user_regs
bl do_data_abort
irq_restore_user_regs*
do_data_abort
位于 arch/arm/lib/interrupts.c
void do_data_abort (struct pt_regs *pt_regs)
{
printf ("data abort\n\n MAYBE you should read doc/README.arm-unaligned-accesses\n\n");
show_regs (pt_regs);
bad_mode ();
}
bad_mode
重置 cpu。
一种方法可能是在尝试可能的中止地址之前升起标志,然后在 do_data_abort
中检查标志而不是 bad_mode
如果是这种情况,则降低标志并继续下一条指令,它应该检查标志是否被降低。
[*]返回到下一条指令可以通过 subs PC, LR, #4
在 irq_restore_user_regs
的修改副本中处理。让它读作
.macro irq_restore_user_regs_mod
ldmia sp, {r0 - lr}^ @ Calling r0 - lr
mov r0, r0
ldr lr, [sp, #S_PC] @ Get PC
add sp, sp, #S_FRAME_SIZE
subs PC, LR, #4 @ return & move spsr_svc into
@ cpsr
.endm
关于linux - PCI 枚举 hack 以数据中止异常结束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21235303/
我希望在我的页面上使用一些吸引眼球的实验性 CSS,例如 border-radius(圆 Angular )和渐变。不幸的是,Internet Explorer 还不支持任何这些。至少 border-
我不喜欢微软的字体渲染。 我为客户创建了一个站点,我的调试列表中最后一个未选中的框是最大的。 (顺便说一句,它还没有“上线”,所以请忽略任何其他错误 - http://baked-beans.tv/b
一般情况下,当我们想在同一页面显示某个网页的内容时,我们会使用ajax请求。如果说,我使用 AJAX 请求不同域中的网页,由于跨端脚本错误,这是不允许的。但是为什么允许通过服务器端页面访问。例如我们可
在我的 css 代码中,我有一些 hack,我想影响 IE6/7 #topmenu li a.activa, #topmenu li a.activa:hover{ *background:
在过去的两个月里,我一直在试图“愚弄”safari,让它认为它正在查看服务器上的一个文件,这实际上是来自摄像机的实时视频流,根据请求使用 Gstreamer 编码和混合成一种格式这是浏览器支持的。由于
怎么说呢,相信很多考过竞赛的同学都会在平时的练习/考试中遭遇过100分但没有AC的情况,结果一看评测结果:subtask的数据点没过! 这时候就是遇到hack数据了,如果被这类数据卡住,说明你
Avast 不时出现在我的一个网站上。有点奇怪,因为我对安全性非常严格,但我检查了 index.php 文件和所有相关的包含和脚本。在我删除的“header.php”文件中发现了一些奇怪的 PHP 代
所以我使用一个程序,我在 lua 中编写 mods,lua 处于沙箱状态,这意味着大多数功能都被阻止,如 IO 和 OS,我什至不能使用 REQUIRE 添加库。我需要一个功能来解压缩我的一个 mod
在 Wiki page for Sudoku solutions ,一种解决方案声称使用“Dot Hack”。链接的 Github 页面不再可用,我在别处找不到任何关于它的信息。 这是关于什么的?它有
嗨, friend 们,是否有可能获得像这样 100% 宽度和高度的双色背景 这是示例图像: Sample Image http://www.mediaserveit.com/demo/vivek/r
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 关闭 9 年前。 Improve this
我有一个网站使用来自谷歌字体的自定义字体。在我的网站上它是正常对齐的,但在我的 android 上,源不对齐。通过各种移动技巧进行研究,我想知道它们是否真的有效,因为经过一项一项的测试,它并没有奏效。
我正在使用... background:url(menu-bg.png) repeat-x, url(spot.gif) repeat; background:url(spot.gif)\0/; 在
我尝试隐藏/显示 div“游戏类型”,但如果输入复选框在列表项中,则以下代码不会运行,我不明白为什么 是否可以在不使用 js 的情况下使用“no-game”输入禁用“pc”和“xbox”输入? inp
简单的问题:我正在 HTML5/Socket.io 中构建一个多人游戏,并使用 Phaser 作为游戏框架。我现在已经进入了为黑客行为添加预防措施的阶段了。 基本上我的问题很简单:潜在的黑客是否可以实
是否有任何方法(hack)插入 Python 函数(def)通过引用返回结果,即使对于不可变类型也是如此? 提案申请(swap as subroutine): def swap(a, b): ....
谁能帮我解决这个问题。我是 css 样式的新手。我有一个 css 文件,其中包含我要构建的 asp.net 网站的所有样式。然而,它在安装了 IE 7 的服务器上运行良好,当我尝试使用 chrome、
以下制作可变大小结构的方法有什么问题? struct tode{ int g; int *p; }; struct tode *lp = malloc(sizeof
我已经停止为不同的浏览器使用 CSS hack,而是支持“条件注释将类添加到 html 标记”方法。 这让我想到了我的问题。我如何编写这个 ie8 hack 没有 hack? .grab-cursor
这样的闭包实现有什么问题吗(从python hack中偷来的)? void function(int value) { struct closure { closure(int
我是一名优秀的程序员,十分优秀!