VisionFive v1下移植xv6

xv6运行。


两个问题
1、设置物理内存不能超过128M,否则kinit()会正常退出,但只有hart0在跑,hart1跑不起来。
1711696772564
只设置了22M,再高就会出问题,但有时设置高点也不会出问题,甚至设置两段物理内存有时也会正常。问题好像随机的。奇幻!
2、捕捉不到时钟中断处理结束时设置的软中断,就是下面这个,在kernel/kernelvec.S中。
1711694429275
按说时间中断发生时,硬件会自动关中断,sip中pending一个S模式软中断,时间中断处理结束后退出,如果中断是开着的,这时就会发生软中断,为什么会不发生呢?
感谢路过大佬请不惜指导!

  1. 具体是什么样的问题?
  2. 怎么确定software interrupt 没有发生?

1、具体问题是:时间中断如期发生,时间中断处理程序在M模式处理,M模式处理结束前设置sip寄存器的软中断位,然后执行mret退出。

2、如何确定software interrupt没有发生:我在scheduler开了S模式中断,其中包括软中断,打印sip内容,未发现sip软中断位置位,但始终有外部中断位置位,也有可能是优级问题。其实也捕捉到过,但是没没办法重现。

哈哈,终于重现一次

我感觉还是先用spike或者qemu把xv6跑起来吧。直接实机太难debug

1 Like

在qemu下跑总感觉不真实:-(,现在只开S模式的软中断,时间中断基本正常,看来的确是中断优先级问题没有处理好。


只开软中断:
1712537218919

我觉得xv6的设计在这里是有问题的。为什么不直接把timer interrupt forward给S mode呢?为什么要通过software interrupt来做呢?这样

w_sie(r_sie() | SIE_SEIE | SIE_STIE | SIE_SSIE);

还有什么意义呢?SIE_STIE根本没有用啊

另外可以看看这个:

xv6设计的没错。timer interrupt必须在M模式下响应,不能直接forward给S模式,在此xv6玩了个技巧。

多谢!我看到过,水平不够,不敢献丑。多谢大佬一直以来的指点!

xv6跑到涉及文件系统的部分,要对写到SD card的fs.img进行读写了,为此零零散散找到了一些VisionFive V1下相关的一些信息:
1、
1712803323916
这里的意思是SD card不直接通过SDIO?
2、


3、


问题:如何把这些零碎信息组合起来对SD card进行读写呢?
从网上找了一些相关的SDIO的材料,我的理解是要把pin与GPIO联系起来,GPIO是直联SDIO的,是直接读写pin还是读写GPIO呢,还有这些都要初始化,如何初始化呢?这是个复杂的问题,如何能提供一些相关帮助,感激不尽!!

我的意思是在M mode设置MIP[STIP]来转发timer interrupt,这样就不会和software interrupt混淆,opensbi就是这么做的:

而xv6这种用software interrupt的方式我是感到不解

其实那个图已经告诉答案了。SD_SDIO0_D2是SDIO模块的讯号,它可以被选择输出到任意一个GPIO pin上面。这里是因为电路版的设计,需要把它选择到GPIO51。你自己设计一块板把它连到GPIO19也是完全可以的。只不过因为芯片本身不知道板是怎么画的,你需要告诉他这个。总之这些GPIO pin的功能是不固定的,可以切换到任何功能模块,比如sdio/i2c/spi,或者纯粹作为gpio来使用。Linux的pinctrl driver就是用来做这个切换的,你可以实现一个简易的pinctrl。具体需要怎么设置可以看这个dts:

感谢,明白了,sbi保持了底层发生一切的原貌,交到运行在S mode的os来自行处理,这是不忘初衷啊 :rofl:

讲真的,我直到现在才知道有dts这个东东的存在,xv6面对的差不多是祼板(前面SecondBoot和DDRInit应该做了些初始化工作)没有使用dts,因此,我想知道是开发板环境下不使用dts“如何把这些零碎信息组合起来对SD card进行读写呢”?dts是先进的东东,以后有机会一定学习。

pinctrl部分:要按照那些对应的GPIOMUX的值和那些bias-disable/input-enable...之类的写到pinctrl@11910000的对应寄存器里面
clock部分:按照时钟树的关系设置对应的时钟,写clock-controller@11800000对应的寄存器
reset部分:写reset-controller@11840000对应的bit
interrupt部分:这个最简单,dts里面看是接到plic哪个irq就行了
这些信息都可以从dts里面找到,只不过你得自己来写寄存器。另外得自己写snps,dw-mshc驱动

看起来很复杂,晚上浏览了一下linux关于7100的pinctrl代码,完全看不懂,慢慢来吧,感谢大佬指路!!

感谢,太难了,到现在也没找到这些对应寄存器说明,尤其是synopsys sd host controller,linux下可以找到对应驱动,可惜完全看不懂. 看样子光有兴趣还不行,实力决定一切,兴趣要完玩:rofl:


visionfive 1的sd card 也是根据这张图设计的吗?

我将visionfive 1的JH7100_ddrinit下的有关SD卡的代码移植(完全拷贝,见笑了)到了xv6下,SD卡识别模式出错,如下图:


根据提示应该是发送41命令之前发送55命令时出错。
代码git地址:(GitHub - ahczgy/xv6vf1: xv6 for visionfive v1),很丑陋,试了8G,32G,64G的卡都没成功,感谢路过大佬指导! :sunny:

应该是发完CMD0后,再发CMD8时,读DWMCI_STATUS寄存器一直busy,超时退出,无法完成sd模式识别。dwmmc.c文件dwmci_send_cmd函数里: