|
|
|
|
 如何修改编译器跳过lwl等四条非对齐指令? - jrjdr [ 2006-02-13 20:06 | 467 byte(s)]
 Re: 如何修改编译器跳过lwl等四条非对齐指令? - shy828301 [ 2006-02-14 10:53 | 156 byte(s)]
 Re: 如何修改编译器跳过lwl等四条非对齐指令? - jrjdr [ 2006-02-14 13:51 | 1,069 byte(s)]
 Re: 如何修改编译器跳过lwl等四条非对齐指令? - shy828301 [ 2006-02-14 15:28 | 56 byte(s)]
 Re: 如何修改编译器跳过lwl等四条非对齐指令? - jrjdr [ 2006-02-15 20:52 | 75 byte(s)]
 Re: 如何修改编译器跳过lwl等四条非对齐指令? - shy828301 [ 2006-02-16 09:32 | 80 byte(s)]
 Re: 如何修改编译器跳过lwl等四条非对齐指令? - jrjdr [ 2006-02-17 10:38 | 1,880 byte(s)]
|
|
|
|
[Original]
[Print]
[Top]
|
|
我在一个类似于龙芯的芯片上做linux系统的移植,正好这款cpu也没有实现这四条专利指令,原本是通过指令保留异常解决的,可是在mount根文件系统的时候报错,没办法,只好修改memcpy,memset,copy_from_user,copy_to_user这四个函数,因为这四个函数用到非对齐指令的频率最高,然后根文件系统是mount上了,可以在执行busybox的init程序的时候老是要出一个越界处理异常,这个异常的epc正好指向我修改过的memcpy函数,找了很长时间没有找到原因,只好请教懂GCC和GAS的朋友,怎么修改编译器才能不出这四条指令
|
|
|
[Original]
[Print]
[Top]
|
|
[Original]
[Print]
[Top]
|
|
修改编译器很简单,只要找到产生这四条指令的代码,删掉就可以了。如果是汇编代码写的只有一点一点的改了,而且mips/linux里用到非对齐指令的地方还有,不止这几个函数
|
|
|
[Original]
[Print]
[Top]
|
|
[Original]
[Print]
[Top]
|
是不是通过修改gas可以完全避免产生这四条非对齐指令,因为memcpy,memset,copy_from_user,copy_to_user这四个函数都是引用了arch/mips/lib/memcpy.S这个文件,这个文件就是用汇编语言写的,里边用到了lwl/lwr/swl/swr这四条指令。
其他函数虽然也用到了这四条指令,但通过做成保留指令异常的方法基本上我还没碰到过问题,就是效率低了。
我就是因为在出busybox的init程序的时候老是出现一个越界处理异常,这个异常epc返回地址就是我修改过的memcpy函数,所以我一直想找一个能够一次性解决这个问题的方法,使代码中不再出现这四条指令。
还有一个问题就是当把这四条指令做成异常处理,我不能保证如果这四条指令是在延迟槽里边的话,我的epc返回地址是正确的,在做异常的时候,我就是简单的把epc的地址加4,指向下一条指令,所以发生地址跳转这一类的错误是不可避免的(难道可以通过读cp0的cause寄存器的第31BD来判断是否是在延迟槽中,如果在,就将epc-4,如果不在延迟槽,就epc+4,我初步是这么想的,不知道对不对)。
还有我想知道如果修改gas的话,是不是只需要把生成这几条指令的代码注释掉,还是需要做修改,通过其他指令去代替。
谢谢你的回复
|
|
|
[Original]
[Print]
[Top]
|
|
[Original]
[Print]
[Top]
|
我以前尝试改过gcc,是按照这篇文档的方法
http://gcc.gnu.org/ml/gcc-patches/2005-05/msg01249.html
两个问题:
1.可能他修改的gcc太老,mips_block_move_straight这个函数我只在3.1之前的版本看到过,3.1以后的版本我就没有查到这个函数,所以不知道怎么改,才能使每次move的bits个数为一个字节8,我本来是使用2.96的版本,但是这个版本编译glibc和uclibc有问题,所以直接使用了buildroot做了一个3.4版本的工具链,不知道在这个版本之后,gcc/config/mips/mips.c这个文件中哪个地方是定义block_move的字节数。
2.也是由于版本原因,在gcc/config/mips/mips.md这个文件中,需要注掉的那几句生成四条非对齐指令的语句我找不到,主要是这些要被注掉的语句在后续版本中的对应语句我都找不到
关于在linux中直接修改memcpy.S这个文件,本人水平有限,有一个宏定义一直不能看明白,我对gcc的汇编一直不感冒
这里有一个宏定义:
#define EXC(inst_reg,addr,handler)
9: inst_reg, addr
.section __ex_table,"a"
PTR 9b, handler;
.previous
然后在后面是用四条非对齐指令的时候都是调用了这个宏定义
#define LOADL lwl
#define LOADR lwr
#define STOREL swl
#define LOADL swr
#define LDFTRST LOADR
#define LDREST LOADL
#define STFTRST STORER
#define STREST STOREL
......................
比如这一句:
#define FIRST(unit) ((unit)*NBYTES)
EXC( LDFIRST t3, FIRST(0)(src), l_exc);
展开之后就不明白是什么意思了
有高人可以指点一下吗,谢谢
|
|
|
[Original]
[Print]
[Top]
|
|
|