ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Пятница
29 ноября
956814
klen (02.11.2019 23:23 - 03.11.2019 00:02, просмотров: 1401)
gd32vf103: обнаруженные странности здравуйте! в связи с подготовкой собственного sdk для сабжа, перепахиваю все что к нему относится. смотрю RISC-V ISA документацию, GD`шный даташит и GD32VF103_Firmware_Library_V1.0.1. попадаются странности а может даже глюки. их буду сюда выкладывать. грабли они такие - лучше их флажками пометить. заодно выясним что есть грабли, а что есть 'Шарик ты балбес!' 1. GD32VF103_Firmware_Library_V1.0.1/Firmware/RISCV/env_Eclipse/entry.S
#Save caller registers .macro SAVE_CONTEXT #ifdef __riscv_flen #if (__riscv_flen==64 ) addi sp, sp, -20*REGBYTES - 20*FPREGBYTES #else addi sp, sp, -20*REGBYTES #endif #else addi sp, sp, -20*REGBYTES #endif STORE x1, 0*REGBYTES(sp) STORE x4, 1*REGBYTES(sp) STORE x5, 2*REGBYTES(sp) STORE x6, 3*REGBYTES(sp) STORE x7, 4*REGBYTES(sp) STORE x10, 5*REGBYTES(sp) STORE x11, 6*REGBYTES(sp) STORE x12, 7*REGBYTES(sp) STORE x13, 8*REGBYTES(sp) STORE x14, 9*REGBYTES(sp) STORE x15, 10*REGBYTES(sp) #ifndef __riscv_32e STORE x16, 11*REGBYTES(sp) STORE x17, 12*REGBYTES(sp) STORE x28, 13*REGBYTES(sp) STORE x29, 14*REGBYTES(sp) STORE x30, 15*REGBYTES(sp) STORE x31, 16*REGBYTES(sp) #endif #ifdef __riscv_flen #if (__riscv_flen == 64) FPSTORE f0, (20*REGBYTES + 0*FPREGBYTES)(sp) FPSTORE f1, (20*REGBYTES + 1*FPREGBYTES)(sp) FPSTORE f2, (20*REGBYTES + 2*FPREGBYTES)(sp) FPSTORE f3, (20*REGBYTES + 3*FPREGBYTES)(sp) FPSTORE f4, (20*REGBYTES + 4*FPREGBYTES)(sp) FPSTORE f5, (20*REGBYTES + 5*FPREGBYTES)(sp) FPSTORE f6, (20*REGBYTES + 6*FPREGBYTES)(sp) FPSTORE f7, (20*REGBYTES + 7*FPREGBYTES)(sp) FPSTORE f10, (20*REGBYTES + 8*FPREGBYTES)(sp) FPSTORE f11, (20*REGBYTES + 9*FPREGBYTES)(sp) FPSTORE f12, (20*REGBYTES + 10*FPREGBYTES)(sp) FPSTORE f13, (20*REGBYTES + 11*FPREGBYTES)(sp) FPSTORE f14, (20*REGBYTES + 12*FPREGBYTES)(sp) FPSTORE f15, (20*REGBYTES + 13*FPREGBYTES)(sp) FPSTORE f16, (20*REGBYTES + 14*FPREGBYTES)(sp) FPSTORE f17, (20*REGBYTES + 15*FPREGBYTES)(sp) FPSTORE f28, (20*REGBYTES + 16*FPREGBYTES)(sp) FPSTORE f29, (20*REGBYTES + 17*FPREGBYTES)(sp) FPSTORE f30, (20*REGBYTES + 18*FPREGBYTES)(sp) FPSTORE f31, (20*REGBYTES + 19*FPREGBYTES)(sp) #endif #endif .endm
далее
.macro SAVE_EPC_STATUS csrr x5, CSR_MEPC STORE x5, 16*REGBYTES(sp) csrr x5, CSR_MSTATUS STORE x5, 17*REGBYTES(sp) csrr x5, CSR_MSUBM STORE x5, 18*REGBYTES(sp) .endm
и тут же рядом оно одно за другим в оработчике входа в trap
// Trap entry point // .section .text.trap .align 6// In CLIC mode, the trap entry must be 64bytes aligned .global trap_entry .weak trap_entry trap_entry: // Allocate the stack space // addi sp, sp, -19*REGBYTES // Save the caller saving registers (context) SAVE_CONTEXT // Save the MEPC/Mstatus/Msubm reg SAVE_EPC_STATUS
итог - при сохранении состояния в ячейку стек 16*REGBYTES(sp) пишется x31 и сразуже по верху внахлест CSR_MEPC, в связи с эти при выходе из trap соответсвенно x31 идет лесом. наверно нужно постаратся в реальном коде на это налететь, но можно - например при эмуляции собственных команд через trap