debug: add helper functions for cap type checking This reduces the usage of magic values to one file only. Signed-off-by: Axel Heider <axelheider@gmx.de>
diff --git a/CMakeLists.txt b/CMakeLists.txt index cd6f8b5..9a27dac 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt
@@ -12,6 +12,7 @@ cmake_minimum_required(VERSION 3.7.2) +add_subdirectory(libsel4debug) add_subdirectory(libsel4allocman) add_subdirectory(libsel4vka) add_subdirectory(libsel4utils) @@ -20,7 +21,6 @@ add_subdirectory(libsel4serialserver) add_subdirectory(libsel4simple) add_subdirectory(libsel4simple-default) -add_subdirectory(libsel4debug) add_subdirectory(libsel4test) add_subdirectory(libsel4sync) add_subdirectory(libsel4muslcsys)
diff --git a/libsel4debug/include/sel4debug/debug.h b/libsel4debug/include/sel4debug/debug.h index a128ae5..7b2b04d 100644 --- a/libsel4debug/include/sel4debug/debug.h +++ b/libsel4debug/include/sel4debug/debug.h
@@ -27,5 +27,25 @@ void debug_cap_identify(seL4_CPtr cap); +static inline int debug_cap_is_valid(seL4_CPtr cap) +{ + return (0 != seL4_DebugCapIdentify(cap)); +} + +static inline int debug_cap_is_endpoint(seL4_CPtr cap) +{ + // there is kernel/generated/arch/object/structures_gen.h that defines + // cap_endpoint_cap = 4, but we can't include it here + return (4 == seL4_DebugCapIdentify(cap)); +} + +static inline int debug_cap_is_notification(seL4_CPtr cap) +{ + // there is kernel/generated/arch/object/structures_gen.h that defines + // cap_notification_cap = 6, but we can't include it here + return (6 == seL4_DebugCapIdentify(cap)); +} + + void debug_print_bootinfo(seL4_BootInfo *info);
diff --git a/libsel4sync/CMakeLists.txt b/libsel4sync/CMakeLists.txt index 611e0f4..44d3e77 100644 --- a/libsel4sync/CMakeLists.txt +++ b/libsel4sync/CMakeLists.txt
@@ -20,11 +20,7 @@ add_library(sel4sync STATIC EXCLUDE_FROM_ALL ${deps}) -target_include_directories( - sel4sync - PUBLIC - include -) +target_include_directories(sel4sync PUBLIC include) target_link_libraries( sel4sync @@ -37,3 +33,7 @@ sel4_ autoconf ) + +if(KernelDebugBuild) + target_link_libraries(sel4sync PUBLIC sel4debug) +endif()
diff --git a/libsel4sync/include/sync/bin_sem.h b/libsel4sync/include/sync/bin_sem.h index e24ff06..caaaa2f 100644 --- a/libsel4sync/include/sync/bin_sem.h +++ b/libsel4sync/include/sync/bin_sem.h
@@ -15,6 +15,9 @@ #include <autoconf.h> #include <assert.h> #include <sel4/sel4.h> +#ifdef CONFIG_DEBUG_BUILD +#include <sel4debug/debug.h> +#endif #include <vka/vka.h> #include <vka/object.h> #include <stddef.h> @@ -44,7 +47,7 @@ #ifdef CONFIG_DEBUG_BUILD /* Check the cap actually is a notification. */ - assert(seL4_DebugCapIdentify(notification) == 6); + assert(debug_cap_is_notification(notification)); #endif sem->notification.cptr = notification;
diff --git a/libsel4sync/include/sync/condition_var.h b/libsel4sync/include/sync/condition_var.h index 1af9de7..160fff2 100644 --- a/libsel4sync/include/sync/condition_var.h +++ b/libsel4sync/include/sync/condition_var.h
@@ -14,6 +14,9 @@ #include <autoconf.h> #include <sel4/sel4.h> +#ifdef CONFIG_DEBUG_BUILD +#include <sel4debug/debug.h> +#endif #include <vka/vka.h> #include <vka/object.h> #include <platsupport/sync/atomic.h> @@ -38,7 +41,7 @@ #ifdef CONFIG_DEBUG_BUILD /* Check the cap actually is a notification. */ - assert(seL4_DebugCapIdentify(notification) == 6); + assert(debug_cap_is_notification(notification)); #endif cv->notification.cptr = notification;
diff --git a/libsel4sync/include/sync/sem-bare.h b/libsel4sync/include/sync/sem-bare.h index 3218e42..203a8a3 100644 --- a/libsel4sync/include/sync/sem-bare.h +++ b/libsel4sync/include/sync/sem-bare.h
@@ -22,6 +22,9 @@ #include <assert.h> #include <limits.h> #include <sel4/sel4.h> +#ifdef CONFIG_DEBUG_BUILD +#include <sel4debug/debug.h> +#endif #include <stddef.h> #include <platsupport/sync/atomic.h> @@ -29,7 +32,7 @@ { #ifdef CONFIG_DEBUG_BUILD /* Check the cap actually is an EP. */ - assert(seL4_DebugCapIdentify(ep) == 4); + assert(debug_cap_is_endpoint(ep)); #endif assert(value != NULL); int oldval; @@ -80,7 +83,7 @@ { #ifdef CONFIG_DEBUG_BUILD /* Check the cap actually is an EP. */ - assert(seL4_DebugCapIdentify(ep) == 4); + assert(debug_cap_is_endpoint(ep)); #endif assert(value != NULL); /* We can do an "unsafe" increment here because we know the lock cannot be
diff --git a/libsel4sync/include/sync/sem.h b/libsel4sync/include/sync/sem.h index f96c3b2..1b98435 100644 --- a/libsel4sync/include/sync/sem.h +++ b/libsel4sync/include/sync/sem.h
@@ -15,6 +15,9 @@ #include <autoconf.h> #include <assert.h> #include <sel4/sel4.h> +#ifdef CONFIG_DEBUG_BUILD +#include <sel4debug/debug.h> +#endif #include <vka/vka.h> #include <vka/object.h> #include <stddef.h> @@ -38,7 +41,7 @@ } #ifdef CONFIG_DEBUG_BUILD /* Check the cap actually is an EP. */ - assert(seL4_DebugCapIdentify(ep) == 4); + assert(debug_cap_is_endpoint(ep)); #endif sem->ep.cptr = ep;
diff --git a/libsel4sync/src/recursive_mutex.c b/libsel4sync/src/recursive_mutex.c index f82838f..9862354 100644 --- a/libsel4sync/src/recursive_mutex.c +++ b/libsel4sync/src/recursive_mutex.c
@@ -17,6 +17,9 @@ #include <limits.h> #include <sel4/sel4.h> +#ifdef CONFIG_DEBUG_BUILD +#include <sel4debug/debug.h> +#endif static void *thread_id(void) { @@ -31,7 +34,7 @@ } #ifdef CONFIG_DEBUG_BUILD /* Check the cap actually is a notification. */ - assert(seL4_DebugCapIdentify(notification) == 6); + assert(debug_cap_is_notification(notification)); #endif mutex->notification.cptr = notification;
diff --git a/libsel4vka/CMakeLists.txt b/libsel4vka/CMakeLists.txt index b1e5fe8..9f472a4 100644 --- a/libsel4vka/CMakeLists.txt +++ b/libsel4vka/CMakeLists.txt
@@ -69,3 +69,6 @@ sel4vka_Config sel4_autoconf ) +if(KernelDebugBuild) + target_link_libraries(sel4vka PUBLIC sel4debug) +endif()
diff --git a/libsel4vka/include/vka/vka.h b/libsel4vka/include/vka/vka.h index 542c7cd..7542489 100644 --- a/libsel4vka/include/vka/vka.h +++ b/libsel4vka/include/vka/vka.h
@@ -17,6 +17,9 @@ #include <sel4/sel4.h> #include <sel4/types.h> +#ifdef CONFIG_DEBUG_BUILD +#include <sel4debug/debug.h> +#endif #include <assert.h> #include <stdint.h> #include <utils/util.h> @@ -192,7 +195,7 @@ static inline void vka_cspace_free(vka_t *vka, seL4_CPtr slot) { #ifdef CONFIG_DEBUG_BUILD - if (seL4_DebugCapIdentify(slot) != 0) { + if (debug_cap_is_valid(slot)) { ZF_LOGF("slot is not free: call vka_cnode_delete first"); /* this terminates the system */ }