龙芯开源社区

 找回密码
 注册新用户(newuser)
查看: 2611|回复: 14

龙芯3A2000上,64位地址0x9000000000000000以后的地址如何访问?

[复制链接]
发表于 2016-5-25 01:30:24 | 显示全部楼层 |阅读模式
本人配置串口中断相关寄存器。在系统初始化早期阶段,访问0x9000000000000000+0x3ff0140a 读写一个字节都是正常的,可是等系统起来后,再测试这个寄存器的读写,直接就死机了。 也就是说相同的地址,早期能访问,启动起来后不让访问了。

串口中断线输入10号,输出0号,挂接到0号CPU。
/* 写一个字节到 9000000000000000开始的地址*/
static __inline__  void MIPS_SB64(unsigned int address, unsigned char value)
{

  unsigned long long tmp; /* 64bit */
__asm__ volatile (
        ".set noreorder \n"
        "dli        %0,0x9000000000000000 \n"
        "or  %0,%0,%1 \n"
        "sb        %2, 0(%0) \n"
        "sync \n"
        ".set reorder \n"
        : "=&r" (tmp)
    : "r" (address) , "r" (value)  : "memory"
    );
}

void test_0x9000000000000000(void)
{
    unsigned int addr = 0x3ff0140a; /* 串口偏移量*/
    unsigned char value = 0;

    value = 0x11;
    MIPS_SB64(addr, value);
}
就是这个测试函数,放在很早的地方能用,晚了就挂机了。搞不清楚这其中哪里的配置影响它了。 请大侠支招,万分感谢!困扰了好多天了。
 楼主| 发表于 2016-6-24 16:30:57 | 显示全部楼层
经过不断地刻苦攻关,终于找到了原因!物理地址类型 phys_addr_t 用了默认的4字节,修改成8字节就好了。所有这些莫名其妙的问题,都没了!
两个周的全职工作量,就是改了两行代码,解决了此问题!
回复 支持 1 反对 0

使用道具 举报

发表于 2016-5-25 01:58:33 | 显示全部楼层
PMON里面还是内核里面?
 楼主| 发表于 2016-5-25 02:31:49 | 显示全部楼层
不是Linux内核。 是PMON引导的一个只有串口和时钟的小系统,运行 在k0空间,没有配置TLB相关的MMU。如果尽早初始化串口,就启动起来系统了,否则切换到根任务入口再用,就挂了。
 楼主| 发表于 2016-5-25 02:33:59 | 显示全部楼层
前后的差别,涉及一次无任务到根任务的切换,暂时还不好找哪里的代码影响了。
发表于 2016-5-25 02:53:48 | 显示全部楼层
请确认打开了64位模式,32位模式下访问这样的地址会挂掉的。
 楼主| 发表于 2016-5-25 03:01:32 | 显示全部楼层
在哪里打开64位模式? 我没找到相关资料。 是CPU的某个寄存器bit位吧?
发表于 2016-5-25 05:22:04 | 显示全部楼层
Status寄存器,确保KX,SX,UX三个位是打开的。
 楼主| 发表于 2016-5-25 15:07:56 | 显示全部楼层
太感谢了,果然是这里!
我分别打印出了第一次能用的,和第二次不能访问时的SR值:
test_0x9000000000000000:  SR = 0x3400ff80
test_0x9000000000000000:  SR = 0x9000ff21
差别在于SR[7] 开始是1,后来是0了, 我把SR |= 0X80 , 把bit7置位,就可以访问64位地址了。 十分感谢!! 结贴
 楼主| 发表于 2016-6-14 19:26:01 | 显示全部楼层
还是这里,又出问题了。上次是整个程序都在K0的空间里运行,都没有问题了。现在是把程序挪到0xc0000000开始的空间里运行,在汇编阶段就设置TLB把这个虚拟地址映射为物理地址 0 ,程序能运行,但是又到这个写64位的地方死机了,检查了SR确实没问题了:
SR = [9000FFA0] 这个状态下调用MIPS_SB64函数,又挂掉了。无法解释啊!

访问0x9000000000000000开始的64位地址,是否一定会触发TLB异常? 异常程序里做了点改动,不知道有没有关系
发表于 2016-6-16 09:24:29 | 显示全部楼层
0x9000000000000000开始的地址不经过TLB,所以无所谓TLB异常。我想知道你写地址的具体值,也就是相对于0x9000000000000000的offset。

本版积分规则

小黑屋|手机版|Archiver|Lemote Inc.  

GMT+8, 2019-6-25 01:21 , Processed in 0.190458 second(s), 18 queries .

快速回复 返回顶部 返回列表