龙芯开源社区

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

求教关于龙芯3A多核启动的问题

[复制链接]
发表于 2013-6-25 11:51:35 | 显示全部楼层 |阅读模式
lz工作中需将我们的操作系统移到龙芯3A上,
通过阅读相关文档得知对于龙芯3A,pmon中会先让每个从核处于循环等待中,直至从mailbox中获取到启动参数,从而实现启动3个从核,因此操作系统主要工作是在主核初始化完成后向每个从核的mailbox寄存器(地址为64位)发送启动参数即可,你们的kernel是直接通过C代码来向mailbox寄存器写值,但是由于我们的操作系统目前编译出的指针为32位,因此不能直接通过C代码向64位地址写值,所以我是通过汇编来向mailbox寄存器写值,具体汇编代码如下:
dli t1, 0x900000003ff01138
xor t2, t2, t2
sd t2, 0(t1)
但是当执行完sd t2, 0(t1)后程序不继续往下执行(通过在该句后加打印,但未打印出得知未往下执行),但是上述代码中将地址改为如0xffffffff83000000之类的地址能正常写值,并且诸如0x900000003ff01120、0x900000003ff01128、0x900000003ff01130都不能正常写值,而且使用ld指令读取0x900000003ff01138,也不能正常读取。
我的疑问是:
1)、core1的4个mailbox寄存器的地址是否为上述4个地址?因为我看你们的kernel代码中对core1的mailbox0值的定义为0x900000003ff01120(见loongson/arch/mips/loongson-3/smp.c),但是pmon代码中(见targets/bonito3a780e/bonito/start.S)line2812有以下代码:
mtc0 t2 $15,1
andi t2, 0x3ff
dli t0, 0x900000003ff01000
andi t3, t2, 0x3
sll t3, 8
or t0, t0, t3
andi t4, t2, 0xc
dsll t4, t2
or t0, t0,t4
t0保存的为mailbox的起始地址,但是这里面的t0通过计算其值为0x900034003ff01100(也通过汇编向该值写值,同样不能正常写入),跟上面的值有差异。
2)、如果地址没问题,那应该怎样才能正确向该地址写值,或者是否跟工具链有关?我们系统使用的是GNU3.4.4工具链。
请求各位大神解答,万分感激!
 楼主| 发表于 2013-6-26 09:20:39 | 显示全部楼层
急求各路大神指教啊
发表于 2013-6-26 10:49:30 | 显示全部楼层
我想你不能访问mailbox的原因是你的地址有问题。在龙芯3A上每个core有4个mailbox,而pmon代码的只是使用了mailbox0。pmon代码的意思是让core1-core3检查自己core的mailbox0的值是否为0,如果为0则继续等待,如果不为0执行接下来的流程。
core1mailbox0 :0x900000003ff01120
core2mailbox0 :0x900000003ff01220
core3mailbox0 :0x900000003ff01320
你只要向core1mailbox0, core2mailbox0, core3mailbox0,写入一个不为0 的值就可以了。
发表于 2013-6-26 10:55:27 | 显示全部楼层
地址0x900000003ff01138是Core1_ MailBox3 ,它的权限是你只能写不能读。
发表于 2013-6-26 17:03:19 | 显示全部楼层

本版积分规则

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

GMT+8, 2019-8-22 05:17 , Processed in 0.184255 second(s), 21 queries .

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