Xilinx / qemu

Xilinx's fork of Quick EMUlator (QEMU) with improved support and modelling for the Xilinx platforms.
https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/821395464/QEMU+User+Documentation
Other
245 stars 154 forks source link

arm: cp15 support #75

Open yroeht opened 2 years ago

yroeht commented 2 years ago

Initially reported at https://gitlab.com/qemu-project/qemu/-/issues/1245 but closed there as fork-dependent. Also reported to GDB at https://sourceware.org/bugzilla/show_bug.cgi?id=29675

Environment

I am running qemu-system-xilinx-aarch64 on Debian, as part of the Zephyr SDK version 0.15.

$ qemu-system-xilinx-aarch64 --version
QEMU emulator version 5.1.0 (v2.6.0-35778-ge40b634b24-dirty)
Copyright (c) 2003-2020 Fabrice Bellard and the QEMU Project developers

The command line I start qemu with is:

$ qemu-system-xilinx-aarch64 -nographic -machine arm-generic-fdt-7series -dtb /home/.../zephyr/boards/arm/qemu_cortex_a9/fdt-zynq7000s.dtb -pidfile qemu.pid -chardev stdio,id=con,mux=on -serial chardev:con -mon chardev=con,mode=readline -icount shift=3,align=off,sleep=on -rtc clock=vm -device loader,file=/home/.../build/zephyr/zephyr.elf,cpu-num=0 -s -S

What I want to do

Using low vector base address (not hivecs), I want to set the vector base address VBAR to point to the memory location of the exception vector, in my case 0x100000.

Here is the disassembly of the code that should be setting VBAR to 0x100000 (access through coprocessor cp15):

(gdb) disas
Dump of assembler code for function z_arm_prep_c:
=> 0x001060ec <+0>:     ldr     r3, [pc, #24]   ; 0x10610c <z_arm_prep_c+32>
   0x001060f0 <+4>:     push    {r4, lr}
   0x001060f4 <+8>:     bic     r3, r3, #31
   0x001060f8 <+12>:    mcr     15, 0, r3, cr12, cr0, {0}
   0x001060fc <+16>:    isb     sy
   0x00106100 <+20>:    bl      0x1083e4 <z_bss_zero>
   0x00106104 <+24>:    bl      0x1070dc <z_arm_interrupt_init>

The issue

After executing the code above, VBAR seems to remain clear:

(gdb) info register VBAR
VBAR           0x0                 0

From what I have gathered reading Peter Maydell's reply to this email from 2013, VBAR is not implemented because qemu is a non-TrustZone model. Is this correct?

After some tests, I get the impression that VBAR does work, it's just a gdb issue. Any confirmation?

Thanks in advance,