As @Siguza said it is not possible to debug the EL3
registers from EL2
. But I found a solution for my problem. It is possible to tell gdb which registers to fetch by creating a XML file like this:
<?xml version="1.0"?>
<!DOCTYPE target SYSTEM "gdb-target.dtd">
<target>
<architecture>aarch64</architecture>
<feature name="org.gnu.gdb.aarch64.core">
<reg name="x0" bitsize="64"/>
<reg name="x1" bitsize="64"/>
<reg name="x2" bitsize="64"/>
<reg name="x3" bitsize="64"/>
<reg name="x4" bitsize="64"/>
<reg name="x5" bitsize="64"/>
<reg name="x6" bitsize="64"/>
<reg name="x7" bitsize="64"/>
<reg name="x8" bitsize="64"/>
<reg name="x9" bitsize="64"/>
<reg name="x10" bitsize="64"/>
<reg name="x11" bitsize="64"/>
<reg name="x12" bitsize="64"/>
<reg name="x13" bitsize="64"/>
<reg name="x14" bitsize="64"/>
<reg name="x15" bitsize="64"/>
<reg name="x16" bitsize="64"/>
<reg name="x17" bitsize="64"/>
<reg name="x18" bitsize="64"/>
<reg name="x19" bitsize="64"/>
<reg name="x20" bitsize="64"/>
<reg name="x21" bitsize="64"/>
<reg name="x22" bitsize="64"/>
<reg name="x23" bitsize="64"/>
<reg name="x24" bitsize="64"/>
<reg name="x25" bitsize="64"/>
<reg name="x26" bitsize="64"/>
<reg name="x27" bitsize="64"/>
<reg name="x28" bitsize="64"/>
<reg name="x29" bitsize="64"/>
<reg name="x30" bitsize="64"/>
<reg name="sp" bitsize="64"/>
<reg name="pc" bitsize="64"/>
</feature>
</target>
And tell gdb to use the target description using the set tdesc filename <target>.xml
command.
After adding this command to my launch.json file VSCode was able to fetch the specified registers in EL3
and EL2
mode.
launch.json
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "(gdb) Attach",
"type": "cppdbg",
"cwd": "${workspaceFolder}",
"request": "launch",
"program": "${workspaceFolder}/kernel8.elf",
"MIMode": "gdb",
"miDebuggerPath": "C:\\Tools\\arm-gnu-toolchain\\bin\\aarch64-none-elf-gdb.exe",
"miDebuggerArgs": "kernel8.elf",
"targetArchitecture": "arm64",
"setupCommands": [
{ "text": "target remote :3333" },
{ "text": "monitor init" },
{ "text": "monitor reset halt" },
//{ "text": "monitor arm semihosting enable" },
{ "text": "load C:/Dev/baremetal/kernel8.elf" },
{ "text": "set tdesc filename C:/Dev/baremetal/target.xml" },
{ "text": "break *0x80000" },
//{ "text": "monitor reg x0 0x1" },
],
"logging": {
"trace": true,
"engineLogging": true,
"programOutput": true,
"traceResponse": true
},
"externalConsole": false
}
]
}