aboutsummaryrefslogtreecommitdiff
path: root/demo_functionality.c
diff options
context:
space:
mode:
authorWojtek Kosior <kwojtus@protonmail.com>2019-12-10 16:46:56 +0100
committerWojtek Kosior <kwojtus@protonmail.com>2019-12-10 16:46:56 +0100
commit3f1cd2050271dbf548e053f0a67e365b277cfcb3 (patch)
treecef57f71beddb9bb97d35390deb29a09b2d7d98b /demo_functionality.c
parentc76b34db77f06450ba1c957e87a0b1df3c6c29b4 (diff)
downloadrpi-MMU-example-3f1cd2050271dbf548e053f0a67e365b277cfcb3.tar.gz
rpi-MMU-example-3f1cd2050271dbf548e053f0a67e365b277cfcb3.zip
re-enter system mode on invalid data access from PL0 code
Diffstat (limited to 'demo_functionality.c')
-rw-r--r--demo_functionality.c22
1 files changed, 22 insertions, 0 deletions
diff --git a/demo_functionality.c b/demo_functionality.c
index fbf5eb4..60b0bfa 100644
--- a/demo_functionality.c
+++ b/demo_functionality.c
@@ -165,3 +165,25 @@ void demo_go_unprivileged(void)
"r" (VIRTUAL_PL0_MEMORY_START)
: "memory", "r4", "r5", "r0");
}
+
+extern char
+ __interrupt_vectors_start,
+ __interrupt_vectors_end,
+ __interrupt_vectors_size;
+
+extern void (*volatile system_reentry_point)(void);
+
+void system_reentry(void)
+{
+ uart_puts("re-entered system");
+ while(1);
+}
+
+void demo_setup_interrupts(void)
+{
+ system_reentry_point = system_reentry;
+
+ for (size_t i = 0; i < (size_t) &__interrupt_vectors_size; i++)
+ ((volatile char*) 0)[i] =
+ (&__interrupt_vectors_start)[i];
+}