Hello Folks,I have a question about not being able to change the GIC memory map in the baremetal development environment.
■ QuestionsI am implementing interrupt processing in a bare metal development environment. If the GIC is placed in the default memory map of the sample project stored in the DS-5 installation directory, interrupts work normally, but if the memory map is changed, the program hangs. Could you please tell me how to fix it?The bare metal development environment uses startup_Cortex-A55_Cortex-A75 which is stored in the installation directory of DS-5 v5.29.3.*Since VirtualPrototyping is used for the target device, it is easy to change the memory map of the circuit.
■Details: What I researchedSince it was necessary to change the physical address size to 1TB (40bits), it was necessary to change the MMU setting, but startup_Cortex-A55_Cortex-A75 (DS-5 v5.29.3.) contains the MMU setting code. I had to code it myself because I didn't have it. When stepping in instruction step mode, the operation becomes strange immediately after writing the set value to the TCR_EL1 register, so I think there is a high possibility that the MMU setting is incorrect. However, I know that the MMU/MPU view of DS-5 or Arm DS cannot be used with the debugger connection method I am currently using.
MMU/MPU view/Commands view cannot be used with DS-5. - Arm Development Studio forum - Support forums - Arm Community
Immediately after writing the set value to the TCR_EL1 register, it seems that the connection with the debugger has been cut off. I don't see any disassembled code, and the general register values say "Error: Target not available". Therefore, it is not known whether an exception interrupt has occurred.
■ Details: How to change the memory mapThe memory map of the GIC has only changed from the default 0x2f000000 in startup_Cortex-A55_Cortex-A75 (DS-5 v5.29.3.) to 0x52800000, which is the target device specification. Specifically, in the scatter file (scatter.scat), the loading destinations of the GICv3 distributor and GICv3 redistributors are changed as follows. I understand that it is possible to change the memory map of GIC only with this change.
; ; GICv3 distributor ; ;GICD 0x2f000000 UNINIT 0x8000 GICD 0x52800000 UNINIT 0x8000 { GICv3_gicd.o (.bss.distributor) } ; ; GICv3 redistributors ; 128KB for each redistributor in the system ; ;GICR 0x2f100000 UNINIT 0x80000 GICR 0x52900000 UNINIT 0x80000 { GICv3_gicr.o (.bss.redistributor) }
■ Details: MMU settingsThe boot code uses startup_Cortex-A55_Cortex-A75 (DS-5 v5.29.3.) as it is. In addition, the sources that I changed the setting by myself are as follows.
#include "mmu.h" #pragma asm extern uint64_t Image$$TTB0_L2_PERIPH$$ZI$$Base; void mmu_init(void) { uint64_t r; uint64_t i; unsigned long* BaseAddress = &Image$$TTB0_L2_PERIPH$$ZI$$Base; printf("MMU table setting\n"); for(i=0;i<508;i++){ mem_write((unsigned long)BaseAddress + 0x00 + 0x20*i ,0x00000F25 + 0x100000000*i); mem_write((unsigned long)BaseAddress + 0x08 + 0x20*i ,0x40000F25 + 0x100000000*i); mem_write((unsigned long)BaseAddress + 0x10 + 0x20*i ,0x80000F25 + 0x100000000*i); mem_write((unsigned long)BaseAddress + 0x18 + 0x20*i ,0xC0000F25 + 0x100000000*i); } asm volatile ("isb"); printf("TCR_EL setting\n"); r = (0b00LL << 37) | (0b010LL << 32) | (0b00LL << 30) | (0b00LL << 28) | (0b00LL << 26) | (0b00LL << 24) | (0b1LL << 23) | (00LL << 16) | (0b00LL << 14) | (0b10LL << 12) | (0b01LL << 10) | (0b01LL << 8) | (0b0LL << 7) | (24LL << 0); asm volatile ("msr TCR_EL1, %0" : : "r" (r)); asm volatile ("isb") ; }
Thank you for coming back to share the solution you found.