diff --git a/0F_executionlevel/OLVASSEL.md b/0F_executionlevel/OLVASSEL.md index 7c52162e..d0bbf1cc 100644 --- a/0F_executionlevel/OLVASSEL.md +++ b/0F_executionlevel/OLVASSEL.md @@ -13,6 +13,8 @@ Exception return from AArch64 EL2 to AArch64 EL1 PC 0x8004c Current EL is: 00000001 ``` +FIGYELEM: a teljesség kedvéért hozzáadtam az EL3-at is az Issue #6 miatt, bár semmilyen módon nem tudtam kipróbálni. + Start ----- diff --git a/0F_executionlevel/README.md b/0F_executionlevel/README.md index 076bef23..48a1fbf8 100644 --- a/0F_executionlevel/README.md +++ b/0F_executionlevel/README.md @@ -12,6 +12,8 @@ Exception return from AArch64 EL2 to AArch64 EL1 PC 0x8004c Current EL is: 00000001 ``` +NOTE: For completeness, I've added code for EL3 too because of Issue #6, although I had no means to test it. + Start ----- diff --git a/0F_executionlevel/kernel8.img b/0F_executionlevel/kernel8.img index 95168bc2..6f694389 100755 Binary files a/0F_executionlevel/kernel8.img and b/0F_executionlevel/kernel8.img differ diff --git a/0F_executionlevel/main.c b/0F_executionlevel/main.c index 2e2bad07..935c0694 100644 --- a/0F_executionlevel/main.c +++ b/0F_executionlevel/main.c @@ -36,7 +36,7 @@ void main() asm volatile ("mrs %0, CurrentEL" : "=r" (el)); uart_puts("Current EL is: "); - uart_hex(el>>2); + uart_hex((el>>2)&3); uart_puts("\n"); // echo everything back diff --git a/0F_executionlevel/start.S b/0F_executionlevel/start.S index 34cf99c8..33b5f4f9 100644 --- a/0F_executionlevel/start.S +++ b/0F_executionlevel/start.S @@ -42,7 +42,22 @@ _start: // set up EL1 mrs x0, CurrentEL - cmp x0, #4 + and x0, x0, #12 // clear reserved bits + + // running at EL3? + cmp x0, #12 + bne 5f + // should never be executed, just for completeness + mov x2, #0x5b1 + msr scr_el3, x2 + mov x2, #0x3c9 + msr spsr_el3, x2 + adr x2, 5f + msr elr_el3, x2 + eret + + // running at EL2? +5: cmp x0, #4 beq 5f msr sp_el1, x1 // enable CNTP for EL1 diff --git a/10_virtualmemory/kernel8.img b/10_virtualmemory/kernel8.img index c5438321..ba673531 100755 Binary files a/10_virtualmemory/kernel8.img and b/10_virtualmemory/kernel8.img differ diff --git a/10_virtualmemory/start.S b/10_virtualmemory/start.S index 142f2285..6e757440 100644 --- a/10_virtualmemory/start.S +++ b/10_virtualmemory/start.S @@ -42,7 +42,22 @@ _start: // set up EL1 mrs x0, CurrentEL - cmp x0, #4 + and x0, x0, #12 // clear reserved bits + + // running at EL3? + cmp x0, #12 + bne 5f + // should never be executed, just for completeness + mov x2, #0x5b1 + msr scr_el3, x2 + mov x2, #0x3c9 + msr spsr_el3, x2 + adr x2, 5f + msr elr_el3, x2 + eret + + // running at EL2? +5: cmp x0, #4 beq 5f msr sp_el1, x1 // enable CNTP for EL1 diff --git a/11_exceptions/kernel8.img b/11_exceptions/kernel8.img index 4357c4bd..fcd9f4a2 100755 Binary files a/11_exceptions/kernel8.img and b/11_exceptions/kernel8.img differ diff --git a/11_exceptions/start.S b/11_exceptions/start.S index aa21910b..f940f0c8 100644 --- a/11_exceptions/start.S +++ b/11_exceptions/start.S @@ -42,7 +42,22 @@ _start: // set up EL1 mrs x0, CurrentEL - cmp x0, #4 + and x0, x0, #12 // clear reserved bits + + // running at EL3? + cmp x0, #12 + bne 5f + // should never be executed, just for completeness + mov x2, #0x5b1 + msr scr_el3, x2 + mov x2, #0x3c9 + msr spsr_el3, x2 + adr x2, 5f + msr elr_el3, x2 + eret + + // running at EL2? +5: cmp x0, #4 beq 5f msr sp_el1, x1 // enable CNTP for EL1