|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [XEN RFC] xen/bug: introduce bug_fn_nonconst_t to validate run_in_exception_handle()
Introduce function type bug_fn_nonconst_t (as opposed to bug_fn_t)
to validate the argument passed to run_in_exception_handle().
Place the definition of bug_fn_nonconst_t before of asm/bug.h inclusion
so that arch-specific implementations of run_in_exception_handler() can
use it (and move bug_fn_t into the same place for the same reason).
Furthermore, use bug_fn_nonconst_t to address violations of
MISRA C:2012 Rule 8.2 ("Function types shall be in prototype form with
named parameters").
Signed-off-by: Federico Serafini <federico.serafini@xxxxxxxxxxx>
---
At the moment, bug_fn_t can not be used within run_in_exception_handler()
because of the const qualifier on the formal parameter.
I tried to adjust the constness of the functions passed to
run_in_exception_handler but at a certain point I stopped:
a lot of code churn is required and I am not sure about the correctenss of the
result.
So, I came up with this solution, taking inspiration from the exising functions
show_execution_state() and show_execution_state_nonconst().
I would like to ask if:
1) I correctly applied Julien's suggestion about the visibility [1];
2) this RFC can become a patch.
[1]
https://lists.xenproject.org/archives/html/xen-devel/2023-11/msg01361.html
---
xen/common/bug.c | 2 +-
xen/include/xen/bug.h | 21 +++++++++++++++------
2 files changed, 16 insertions(+), 7 deletions(-)
diff --git a/xen/common/bug.c b/xen/common/bug.c
index ca166e102b..9170821ab8 100644
--- a/xen/common/bug.c
+++ b/xen/common/bug.c
@@ -63,7 +63,7 @@ int do_bug_frame(struct cpu_user_regs *regs, unsigned long pc)
if ( id == BUGFRAME_run_fn )
{
- void (*fn)(struct cpu_user_regs *) = bug_ptr(bug);
+ bug_fn_nonconst_t *fn = bug_ptr(bug);
fn(regs);
diff --git a/xen/include/xen/bug.h b/xen/include/xen/bug.h
index cb5138410e..c6f5594af5 100644
--- a/xen/include/xen/bug.h
+++ b/xen/include/xen/bug.h
@@ -12,6 +12,18 @@
#define BUG_LINE_LO_WIDTH (31 - BUG_DISP_WIDTH)
#define BUG_LINE_HI_WIDTH (31 - BUG_DISP_WIDTH)
+#ifndef __ASSEMBLY__
+
+/*
+ * Make bug_fn_t and bug_fn_nonconst_t visible for arch-specific implementation
+ * of run_in_exception_handler.
+ */
+struct cpu_user_regs;
+typedef void bug_fn_t(const struct cpu_user_regs *regs);
+typedef void bug_fn_nonconst_t(struct cpu_user_regs *regs);
+
+#endif
+
#include <asm/bug.h>
#ifndef __ASSEMBLY__
@@ -99,18 +111,15 @@ struct bug_frame {
#endif
-struct cpu_user_regs;
-typedef void bug_fn_t(const struct cpu_user_regs *regs);
-
#ifndef run_in_exception_handler
/*
* TODO: untangle header dependences, break BUILD_BUG_ON() out of xen/lib.h,
* and use a real static inline here to get proper type checking of fn().
*/
-#define run_in_exception_handler(fn) do { \
- (void)((fn) == (void (*)(struct cpu_user_regs *))NULL); \
- BUG_FRAME(BUGFRAME_run_fn, 0, fn, 0, NULL); \
+#define run_in_exception_handler(fn) do { \
+ (void)((fn) == (bug_fn_nonconst_t *)NULL); \
+ BUG_FRAME(BUGFRAME_run_fn, 0, fn, 0, NULL); \
} while ( false )
#endif /* run_in_exception_handler */
--
2.34.1
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |