【发布时间】:2015-07-01 13:56:22
【问题描述】:
我正在为基于ORPSoC 的处理器架构开发引导加载程序。为了执行程序,引导加载程序将其加载到内存中,然后跳转到该程序的开头。
现在我需要在跳转的延迟槽中插入自定义指令l.cust1。该指令由处理器实现并激活以下指令的解密。这就是它必须被放置在延迟槽中的原因。再晚一点,程序就无法执行,因为它的指令是加密的。同样,如果过早激活解密,引导加载程序会因为未加密而崩溃。
我现在想知道是否可以告诉 GCC 在哪里放置 l.cust1 指令。目前我必须相应地手动修改引导加载程序二进制文件。
在引导加载程序的 C 源代码中插入内联汇编 __asm__("l.cust1\n\t"); 会导致在相关跳转之前的某处添加指令:
1fc2e10: 9c 21 01 b4 l.addi r1,r1,436
1fc2e14: 70 00 00 00 l.cust1 # switching on decryption
1fc2e18: 18 40 01 ff l.movhi r2,0x1ff
1fc2e1c: 9c 72 ff ff l.addi r3,r18,-1
1fc2e20: a8 42 7c 94 l.ori r2,r2,0x7c94
1fc2e24: 9c 90 00 04 l.addi r4,r16,4
1fc2e28: 85 62 00 60 l.lwz r11,96(r2)
1fc2e2c: 48 00 58 00 l.jalr r11
1fc2e30: 9d c0 00 00 l.addi r14,r0,0
但是,我需要它位于跳转的延迟槽中:
1fc2e10: 9c 21 01 b4 l.addi r1,r1,436
1fc2e14: 9d c0 00 00 l.addi r14,r0,0
1fc2e18: 18 40 01 ff l.movhi r2,0x1ff
1fc2e1c: 9c 72 ff ff l.addi r3,r18,-1
1fc2e20: a8 42 7c 94 l.ori r2,r2,0x7c94
1fc2e24: 9c 90 00 04 l.addi r4,r16,4
1fc2e28: 85 62 00 60 l.lwz r11,96(r2)
1fc2e2c: 48 00 58 00 l.jalr r11
1fc2e30: 70 00 00 00 l.cust1 # switching on decryption
【问题讨论】:
标签: gcc inline-assembly bootloader