Skip to content

Commit 8eb312c

Browse files
committed
baremetal: move aarch64 el.c into dump_regs.c
Also start disassembling registers nicely dump_regs so we can have a single executable to handle all register queries.
1 parent 3527c8d commit 8eb312c

File tree

5 files changed

+47
-60
lines changed

5 files changed

+47
-60
lines changed

README.adoc

Lines changed: 35 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -13376,14 +13376,14 @@ ARM exception levels are analogous to x86 <<ring0,rings>>.
1337613376
Print the EL at the beginning of a baremetal simulation:
1337713377

1337813378
....
13379-
./run --arch arm --baremetal baremetal/arch/arm/el.c
13380-
./run --arch aarch64 --baremetal baremetal/arch/aarch64/el.c
13379+
./run --arch arm --baremetal baremetal/arch/arm/dump_regs.c
13380+
./run --arch aarch64 --baremetal baremetal/arch/aarch64/dump_regs.c
1338113381
....
1338213382

1338313383
Sources:
1338413384

13385-
* link:baremetal/arch/arm/el.c[]
13386-
* link:baremetal/arch/aarch64/el.c[]
13385+
* link:baremetal/arch/arm/dump_regs.c[]
13386+
* link:baremetal/arch/aarch64/dump_regs.c[]
1338713387

1338813388
The instructions that find the ARM EL are explained at: https://stackoverflow.com/questions/31787617/what-is-the-current-execution-mode-exception-level-etc
1338913389

@@ -13392,53 +13392,53 @@ The lower ELs are not mandated by the architecture, and can be controlled throug
1339213392
In QEMU, you can configure the lowest EL as explained at https://stackoverflow.com/questions/42824706/qemu-system-aarch64-entering-el1-when-emulating-a53-power-up
1339313393

1339413394
....
13395-
./run --arch arm --baremetal baremetal/arch/arm/el.c
13396-
./run --arch arm --baremetal baremetal/arch/arm/el.c -- -machine virtualization=on
13397-
./run --arch arm --baremetal baremetal/arch/arm/el.c -- -machine secure=on
13398-
./run --arch aarch64 --baremetal baremetal/arch/aarch64/el.c
13399-
./run --arch aarch64 --baremetal baremetal/arch/aarch64/el.c -- -machine virtualization=on
13400-
./run --arch aarch64 --baremetal baremetal/arch/aarch64/el.c -- -machine secure=on
13395+
./run --arch arm --baremetal baremetal/arch/arm/dump_regs.c | grep CPSR.M
13396+
./run --arch arm --baremetal baremetal/arch/arm/dump_regs.c -- -machine virtualization=on | grep CPSR.M
13397+
./run --arch arm --baremetal baremetal/arch/arm/dump_regs.c -- -machine secure=on | grep CPSR.M
13398+
./run --arch aarch64 --baremetal baremetal/arch/aarch64/dump_regs.c | grep CurrentEL.EL
13399+
./run --arch aarch64 --baremetal baremetal/arch/aarch64/dump_regs.c -- -machine virtualization=on | grep CurrentEL.EL
13400+
./run --arch aarch64 --baremetal baremetal/arch/aarch64/dump_regs.c -- -machine secure=on | grep CurrentEL.EL
1340113401
....
1340213402

1340313403
outputs respectively:
1340413404

1340513405
....
13406-
19
13407-
19
13408-
19
13409-
1
13410-
2
13411-
3
13406+
CPSR.M 0x3
13407+
CPSR.M 0x3
13408+
CPSR.M 0x3
13409+
CurrentEL.EL 0x1
13410+
CurrentEL.EL 0x2
13411+
CurrentEL.EL 0x3
1341213412
....
1341313413

13414-
TODO: why is `arm` stuck at `19` which equals Supervisor mode?
13414+
TODO: why is arm `CPSR.M` stuck at `0x3` which equals Supervisor mode?
1341513415

1341613416
In gem5, you can configure the lowest EL with:
1341713417

1341813418
....
13419-
./run --arch arm --baremetal baremeta/arch/arm/el.c --emulator gem5
13420-
cat "$(./getvar --arch arm --emulator gem5 gem5_guest_terminal_file)"
13421-
./run --arch arm --baremetal baremetal/arch/arm/el.c --emulator gem5 -- --param 'system.have_virtualization = True'
13422-
cat "$(./getvar --arch arm --emulator gem5 gem5_guest_terminal_file)"
13423-
./run --arch arm --baremetal baremetal/arch/arm/el.c --emulator gem5 -- --param 'system.have_security = True'
13424-
cat "$(./getvar --arch arm --emulator gem5 gem5_guest_terminal_file)"
13425-
./run --arch aarch64 --baremetal baremetal/arch/aarch64/el.c --emulator gem5
13426-
cat "$(./getvar --arch aarch64 --emulator gem5 gem5_guest_terminal_file)"
13427-
./run --arch aarch64 --baremetal baremetal/arch/aarch64/el.c --emulator gem5 -- --param 'system.have_virtualization = True'
13428-
cat "$(./getvar --arch aarch64 --emulator gem5 gem5_guest_terminal_file)"
13429-
./run --arch aarch64 --baremetal baremetal/arch/aarch64/el.c --emulator gem5 -- --param 'system.have_security = True'
13430-
cat "$(./getvar --arch aarch64 --emulator gem5 gem5_guest_terminal_file)"
13419+
./run --arch arm --baremetal baremetal/arch/arm/dump_regs.c --emulator gem5
13420+
grep CPSR.M "$(./getvar --arch arm --emulator gem5 gem5_guest_terminal_file)"
13421+
./run --arch arm --baremetal baremetal/arch/arm/dump_regs.c --emulator gem5 -- --param 'system.have_virtualization = True'
13422+
grep CPSR.M "$(./getvar --arch arm --emulator gem5 gem5_guest_terminal_file)"
13423+
./run --arch arm --baremetal baremetal/arch/arm/dump_regs.c --emulator gem5 -- --param 'system.have_security = True'
13424+
grep CPSR.M "$(./getvar --arch arm --emulator gem5 gem5_guest_terminal_file)"
13425+
./run --arch aarch64 --baremetal baremetal/arch/aarch64/dump_regs.c --emulator gem5
13426+
grep CurrentEL.EL "$(./getvar --arch aarch64 --emulator gem5 gem5_guest_terminal_file)"
13427+
./run --arch aarch64 --baremetal baremetal/arch/aarch64/dump_regs.c --emulator gem5 -- --param 'system.have_virtualization = True'
13428+
grep CurrentEL.EL "$(./getvar --arch aarch64 --emulator gem5 gem5_guest_terminal_file)"
13429+
./run --arch aarch64 --baremetal baremetal/arch/aarch64/dump_regs.c --emulator gem5 -- --param 'system.have_security = True'
13430+
grep CurrentEL.EL "$(./getvar --arch aarch64 --emulator gem5 gem5_guest_terminal_file)"
1343113431
....
1343213432

1343313433
output:
1343413434

1343513435
....
13436-
19
13437-
26
13438-
19
13439-
1
13440-
2
13441-
3
13436+
CPSR.M 0x3
13437+
CPSR.M 0x3
13438+
CPSR.M 0x3
13439+
CurrentEL.EL 0x1
13440+
CurrentEL.EL 0x2
13441+
CurrentEL.EL 0x3
1344213442
....
1344313443

1344413444
==== svc

baremetal/arch/aarch64/dump_regs.c

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,13 @@
66
int main(void) {
77
uint32_t sctlr_el1;
88
__asm__ ("mrs %0, sctlr_el1" : "=r" (sctlr_el1) : :);
9-
printf("sctlr_el1 0x%" PRIx32 "\n", sctlr_el1);
9+
printf("SCTLR_EL1 0x%" PRIX32 "\n", sctlr_el1);
10+
printf("SCTLR_EL1.A 0x%" PRIX32 "\n", (sctlr_el1 >> 1) & 1);
11+
12+
uint64_t CurrentEL;
13+
__asm__ ("mrs %0, CurrentEL;" : "=r" (CurrentEL) : :);
14+
printf("CurrentEL 0x%" PRIX64 "\n", CurrentEL);
15+
/* https://github.com/cirosantilli/linux-kernel-module-cheat#arm-exception-levels */
16+
printf("CurrentEL.EL 0x%" PRIX64 "\n", CurrentEL >> 2);
1017
return 0;
1118
}

baremetal/arch/aarch64/el.c

Lines changed: 0 additions & 11 deletions
This file was deleted.

baremetal/arch/arm/dump_regs.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,14 @@
44
int main(void) {
55
uint32_t cpsr;
66
__asm__ ("mrs %0, cpsr" : "=r" (cpsr) : :);
7-
printf("cpsr %" PRIx32 "\n", cpsr);
7+
printf("CPSR 0x%" PRIX32 "\n", cpsr);
8+
/* https://github.com/cirosantilli/linux-kernel-module-cheat#arm-exception-levels */
9+
printf("CPSR.M 0x%" PRIX32 "\n", cpsr & 0xF);
810

911
/* TODO this is blowing up an exception, how to I read from it? */
1012
/*uint32_t mvfr1;*/
1113
/*__asm__ ("vmrs %0, mvfr1" : "=r" (mvfr1) : :);*/
12-
/*printf("mvfr1 %" PRIx32 "\n", mvfr1);*/
14+
/*printf("MVFR1 0x%" PRIX32 "\n", mvfr1);*/
1315

1416
return 0;
1517
}

baremetal/arch/arm/el.c

Lines changed: 0 additions & 11 deletions
This file was deleted.

0 commit comments

Comments
 (0)