qemu: fatal: Lockup: can't escalate 3 to HardFault (current priority -1)

66 views Asked by At

I have encountered this error while working with QEMU, specifically a Hardfault error when emulating the MPS2AN505 with a Cortex-M33 core. The error I am facing is as follows: qemu: fatal: Lockup: can't escalate 3 to HardFault (current priority -1) This occurs when I attempt to run my kernel.elf file using the following command :

qemu-system-arm -machine mps2-an505 -cpu cortex-m33 \
                -m 16M \
                -nographic -serial mon:stdio \
                -device loader,file=kernel.elf

I have been grappling with this issue for some time and am unsure of the next steps to take. I am particularly curious if the issue lies with the vector table placement or the configuration in my linker script.

For your reference, here are the relevant details of my setup:

Startup File (Boot.s):

.thumb
.section .isr_vector
    .long    __StackTop         /* Initial Top of Stack */
    .long    Reset_Handler      /* Reset Handler */

.text
.global Reset_Handler
Reset_Handler:  
    ldr     R0, = main
    bx      R0`

Linker Script (Kernel.ld):

MEMORY
{
   NS_CODE (rx)     : ORIGIN = 0x00000000, LENGTH = 512K
   S_CODE_BOOT (rx) : ORIGIN = 0x10000000, LENGTH = 512k
   RAM   (rwx) : ORIGIN = 0x20000000, LENGTH = 512k
}

/* Entry Point */
ENTRY(Reset_Handler)

SECTIONS
{
    .text : 
    {
        KEEP(*(.isr_vector))
        *(.text)
        *(.data)
        *(.bss) 
    } > S_CODE_BOOT
    /* Set stack top to end of S_CODE_BOOT. */
    __StackTop = ORIGIN(S_CODE_BOOT) + LENGTH(S_CODE_BOOT);
}


Toolchain Used: arm-gnu-toolchain-13.2.Rel1-x86_64-arm-none-eabi

Compilation Commands for generating the elf:


arm-none-eabi-gcc -mcpu=cortex-m33 -g -c boot.s -o boot.o
arm-none-eabi-ld boot.o main.o -T kernel.ld -o kernel.elf
arm-none-eabi-objdump -d kernel.elf > kernel.list
arm-none-eabi-objdump -t kernel.elf | sed '1,/SYMBOL TABLE/d; s/ .* / /; /^$/d' > kernel.sym
arm-none-eabi-readelf -A kernel.elf

Main Function (main.c):

void main(void)
{
    while (1);
}

Output of readelf -wl Command:


Elf file type is EXEC (Executable file)
Entry point 0x10000008
There is 1 program header, starting at offset 52

Program Headers:
  Type           Offset   VirtAddr   PhysAddr   FileSiz MemSiz  Flg Align
  LOAD           0x001000 0x10000000 0x10000000 0x00016 0x00016 R E 0x1000

 Section to Segment mapping:
  Segment Sections...
   00     .text

Guest Errors Observed:

Invalid read at addr 0x10000000, size 4, region '(null)', reason: rejected
Invalid read at addr 0x10000004, size 4, region '(null)', reason: rejected
0

There are 0 answers