You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
26 lines
1.0 KiB
Markdown
26 lines
1.0 KiB
Markdown
7 years ago
|
Tutorial 0F - Execution levels
|
||
|
==============================
|
||
|
|
||
|
Before we can go on to virtual memory, we have to talk about execution levels. Each level has it's own
|
||
|
memory translation tables, therefore it's cruital to know which one we are using. So in this tutorial we're
|
||
|
make sure of it, we are at supervisor level, EL1. Qemu may start machine at EL1, but real Raspberry Pi hardware
|
||
|
always boots at hypervisor level, EL2. Under qemu use "-d int" to debug the level change.
|
||
|
|
||
|
```sh
|
||
|
$ qemu-system-aarch64 -M raspi3 -kernel kernel8.img -serial stdio -d int
|
||
|
Exception return from AArch64 EL2 to AArch64 EL1 PC 0x8004c
|
||
|
Current EL is: 00000001
|
||
|
```
|
||
|
|
||
|
Start
|
||
|
-----
|
||
|
|
||
|
I've added a little bit more Assembly code for changing the execution level if we're not at supervisor level.
|
||
|
But before we can do that, we have to grant access for the counter registers (used by wait_msec()).
|
||
|
Finally, we fake an exception return to change the level for real.
|
||
|
|
||
|
Main
|
||
|
----
|
||
|
|
||
|
We query the current execution level and then we display it on the serial console.
|