Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[BUG] [ARC SEM] Memory Read Protection Violation from Secure MPU on exit from interrupt #331

Open
jzbydniewski opened this issue May 20, 2021 · 1 comment
Labels
bug Something isn't working help wanted Extra attention is needed

Comments

@jzbydniewski
Copy link

What I observe is that in some circumstances (it started appearing after enabling few more interrupts and threads) CPU ends up catching Memory Read Protection Violation from Secure MPU exception on exit from interrupt in arc_support.s

portable/ThirdParty/GCC/ARC_EM_HS/arc_support.s
519: rtie

Contents of some debug registers once in the exception handler:

EFA: 0x00000000
ECR: 0x00060124

MPU_ECR (0x420) = 0x605FF, meaning below:

- bits 31:16 -> EC_CODE = 0x6  -> vector number of the EV_ProtV exception
- bits 15:12 reserved
- bits 11:10 -> SEC = 0x01 -> Secure violation has occurred; secure resources are being accessed in the normal mode
- bits 9:8   -> VT     = 0x01 -> Data Read Violation
- bits 7:0   -> MR    = 0xFF -> Access missed all regions

Debugging with gdb reveals that SEC_STAT.IRM bit is being reset to 0 after call to dispatcher from interrupt context

portable/ThirdParty/GCC/ARC_EM_HS/arc_support.s
207: bl dispatcher /* r0->pxCurrentTCB */

After IRM is set to 0, the exit from interrupt (RTIE instruction) results in mode switch from secure kernel to normal kernel mode. In my case all memory is marked in MPU as “secure” so this results in CPU exception.

I can see that a similar sounding bug was raised for Zephyr and fixed:
zephyrproject-rtos/zephyr#18725

I tried applying a similar fix for FreeRTOS and the following changes in interrupt entry/exit macros resolve my issue:

arc_asm_common.h from https://github.com/foss-for-synopsys-dwc-arc-processors/embarc_bsp/blob/topic-freertos-demo/include/arc/v2/arc_asm_common.h

--- arc_asm_common.h
+++ arc_asm_common.h
@@ -516,6 +516,9 @@ PUSH gp
 PUSH fp
 PUSH ilink
 PUSH r30
+lr r3, [0x09] /* store SEC_STAT.IRM */
+and r3, r3, 0x8
+PUSH r3

[…]

.macro INTERRUPT_EPILOGUE
 add sp, sp, 4             /* skip bta */

+POP r3 /* restore SEC_STAT.IRM */
+sflag r3
 POP r30
 POP ilink
 POP fp

Please note this is simplified fix as the IRM is stored/restored on interrupt entry/exit. I suspect that proper fix would do that on task context store/restore.

Compiler: Synopsys ARC GCC 2020.03, but it seems irrelevant
Platform: Synopsys ARC SEM

@jzbydniewski jzbydniewski added the bug Something isn't working label May 20, 2021
@aggarw13
Copy link

Hi @jzbydniewski, thank you for notifying to us about your issue of the CPU exception. We will add it to our queue and look into incorporating a fix.

@aggarg aggarg added the help wanted Extra attention is needed label Feb 26, 2024
laroche pushed a commit to laroche/FreeRTOS-Kernel that referenced this issue Apr 18, 2024
This moves the MQTT Mutual Auth Demo under FreeRTOS-Plus/Demo/coreMQTT_Windows_Simulator/MQTT_Mutual_Auth

The project files such as WIN32.vcxproj and WIN32.vcxproj.filters are updated to point to the sources and includes from the coreMQTT submodule.

No changes are made to the actual code. Only paths are updated.

Co-authored-by: Muneeb Ahmed <54290492+muneebahmed10@users.noreply.github.com>
Co-authored-by: SarenaAWS <6563840+sarenameas@users.noreply.github.com>
Co-authored-by: leegeth <51681119+leegeth@users.noreply.github.com>
vishwamartur added a commit to vishwamartur/FreeRTOS-Kernel that referenced this issue Nov 1, 2024
Related to FreeRTOS#331

Fix the Memory Read Protection Violation from Secure MPU exception on exit from interrupt.

* Add code to store SEC_STAT.IRM bit in INTERRUPT_PROLOGUE macro.
* Add code to restore SEC_STAT.IRM bit in INTERRUPT_EPILOGUE macro.
* Modify `portable/ThirdParty/GCC/ARC_EM_HS/arc_support.s` to include the changes in the interrupt entry/exit macros.

---

For more details, open the [Copilot Workspace session](https://copilot-workspace.githubnext.com/FreeRTOS/FreeRTOS-Kernel/issues/331?shareId=XXXX-XXXX-XXXX-XXXX).
vishwamartur added a commit to vishwamartur/FreeRTOS-Kernel that referenced this issue Nov 2, 2024
Related to FreeRTOS#331

Fix the Memory Read Protection Violation from Secure MPU exception on exit from interrupt.

* Add `lr r3, [0x09] /* store SEC_STAT.IRM */` and `and r3, r3, 0x8` before `PUSH r3` in `EXCEPTION_PROLOGUE` and `INTERRUPT_PROLOGUE`.
* Add `POP r3 /* restore SEC_STAT.IRM */` and `sflag r3` before `POP r30` in `EXCEPTION_EPILOGUE` and `INTERRUPT_EPILOGUE`.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working help wanted Extra attention is needed
Projects
None yet
Development

No branches or pull requests

3 participants