TobudOS icon indicating copy to clipboard operation
TobudOS copied to clipboard

fix the bug of loading difference between RISCV32 & RISCV64

Open charmerkai opened this issue 4 years ago • 4 comments

这个bug是我在将tencentos移植到RISCV模拟器spike的过程中发现的。已经成功在spike上将tencentos跑起来。 在RISCV64中,通用寄存器变为64bit, lw指令将数据load进通用寄存器并作符号位扩展,而lwu则是高位补零 若继续使用lw指令保存一些current_task之类的指针,通用寄存器的高位存在被污染为1的情况:例如,当./TencentOS-tiny/arch/risc-v/rv32i/gcc/port_s.S中的代码:lw t0, k_curr_task 当,k_curr_task实际的物理地址在偏移0x80000000之后,也就是DDR内的物理地址,这条命令执行完后通用寄存器t0的高32位会变成成0xffffffff,后续对k_curr_task的操作都会找不到这个地址,正确的地址应该高32位是全零。 因此需要在RISCV64架构下将lw指令修改为lwu指令,这一点可以定义宏来做区分,也就是我修改的port_config.h中的内容。

charmerkai avatar Jan 28 '21 06:01 charmerkai

您好,感谢您的贡献,因为我们之前的代码是在arch/risc-v/rv32i/gcc目录下,rv32i下是只支持32位,支持64位可以再在arch/risc-v目录下新增64位相关的汇编和调度代码,欢迎您将全部工程贡献上来

Supowang1989 avatar Jan 29 '21 06:01 Supowang1989

@Supowang1989 非常感谢您的回复,目前所有riscv32的代码移植到64下时我只碰到这一个问题,新加64单独的目录的话代码和32没有本质的不同。 我这边移植的代码的话,因为是将tencentos整体嵌入到riscv的bootloader工程中的,都是按照riscv那边的makefile环境修改的,整体目录都已经被打乱了,为了适配riscv那边的工程,可能不能直接提交上来 这样的话,不知道您那边考虑将riscv子目录变为一个32与64同时兼容的目录么,需要的工作应该就是通过 #if __riscv_xlen == 64 #else #endif 这样的分支来区分32与64的区别,目前只需要对 load 指令做区分 再次感谢回复

charmerkai avatar Jan 29 '21 08:01 charmerkai

没事,由于rv32i目录已经被多个板级使用了,我们暂时不好直接加64位的代码,我们先保留这个PR,后续我找个64位的场景,合适的时候整合进去,新增一个目录,再次感谢您的支持和建议

Supowang1989 avatar Jan 29 '21 08:01 Supowang1989

@Supowang1989 好的,再次感谢您的回复^_^

charmerkai avatar Jan 31 '21 08:01 charmerkai