plctlab / plct-qemu

PLCT实验室维护的QEMU仓库。代码放在 plct- 前缀的分支里。
http://www.qemu.org
Other
26 stars 13 forks source link

LWGP指令在qemu-user模式下运行报错Segmentation fault #12

Closed Xinlong-Wu closed 2 years ago

Xinlong-Wu commented 2 years ago

issue使用的qemu版本为plct-zce-dev分支的最新代码 在用指令qemu-riscv32 -cpu rv32,x-zce=true,d=false a.out 运行含有lwgp指令的程序时报错 Segmentation fault。 局部objdump结果如下

000111ce <main>:
   111ce: 01 11         c.addi  sp, -32
   111d0: 06 ce         c.swsp  ra, 28(sp)
   111d2: 22 cc         c.swsp  s0, 24(sp)
   111d4: 00 10         c.addi4spn  s0, sp, 32
   111d6: 01 45         c.li    a0, 0
   111d8: 23 26 a4 fe   sw  a0, -20(s0)
   111dc: 23 2a a4 fe   sw  a0, -12(s0)
   111e0: 23 28 a4 fe   sw  a0, -16(s0)
   111e4: 07 b5 4f 00   lwgp    a0, -2044(gp)
   111e8: 23 24 a4 fe   sw  a0, -24(s0)
   111ec: c1 37         c.jal   0x111ac <test_global>
   111ee: 83 25 84 fe   lw  a1, -24(s0)
   111f2: 2a 86         c.mv    a2, a0
   111f4: 03 25 c4 fe   lw  a0, -20(s0)
   111f8: b2 95         c.add   a1, a2
   111fa: 23 28 b4 fe   sw  a1, -16(s0)
   111fe: 62 44         c.lwsp  s0, 24(sp)
   11200: f2 40         c.lwsp  ra, 28(sp)
   11202: 05 61         c.addi16sp  sp, 32
   11204: 82 80         c.jr    ra

但是仅仅将lwgp的代码转换为lw代码就可正常运行, 以下是可正常运行文件的objdump部分结果

000111ce <main>:
   111ce: 01 11         c.addi  sp, -32
   111d0: 06 ce         c.swsp  ra, 28(sp)
   111d2: 22 cc         c.swsp  s0, 24(sp)
   111d4: 00 10         c.addi4spn  s0, sp, 32
   111d6: 01 45         c.li    a0, 0
   111d8: 23 26 a4 fe   sw  a0, -20(s0)
   111dc: 23 2a a4 fe   sw  a0, -12(s0)
   111e0: 23 28 a4 fe   sw  a0, -16(s0)
   111e4: 03 a5 41 80   lw  a0, -2044(gp)
   111e8: 23 24 a4 fe   sw  a0, -24(s0)
   111ec: c1 37         c.jal   0x111ac <test_global>
   111ee: 83 25 84 fe   lw  a1, -24(s0)
   111f2: 2a 86         c.mv    a2, a0
   111f4: 03 25 c4 fe   lw  a0, -20(s0)
   111f8: b2 95         c.add   a1, a2
   111fa: 23 28 b4 fe   sw  a1, -16(s0)
   111fe: 62 44         c.lwsp  s0, 24(sp)
   11200: f2 40         c.lwsp  ra, 28(sp)
   11202: 05 61         c.addi16sp  sp, 32
   11204: 82 80         c.jr    ra

为确保控制变量,我将两个文件全部的反汇编指令使用diff比较,比较发现,仅lw被替换成lwgp(且offset没有改变)。 为了节省篇幅,我将相关文件添加到链接 https://www.wulongxin.com/Project/PLCT/Zce/

我将又将两个可执行文件以16进制全部dump出来然后对比,发现确实是除了lw和lwgp其它都相同。 其中,.ollvm-*是可执行文件,其余为文本文件