bug-hurd
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[RFC PATCH gnumach 03/34] Make exception subcode a long


From: Sergey Bugaev
Subject: [RFC PATCH gnumach 03/34] Make exception subcode a long
Date: Sun, 19 Mar 2023 18:09:46 +0300

On EXC_BAD_ACCESS, exception subcode is used to pass the faulting memory
address, so it needs to be (at least) pointer-sized. Thus, make it into
a long.

This requires matching changes in glibc and the Hurd.
---

NOTE: Most of this was a pretty mechanical change, but I'm not very sure
I got the exc_subcode_proto right; please do check.

 doc/mach.texi         |  4 ++--
 i386/i386/trap.c      |  2 +-
 i386/i386/trap.h      |  2 +-
 include/mach/exc.defs |  2 +-
 kern/exception.c      | 40 ++++++++++++++++++++++++++++------------
 kern/exception.h      |  6 +++---
 kern/thread.h         |  2 +-
 7 files changed, 37 insertions(+), 21 deletions(-)

diff --git a/doc/mach.texi b/doc/mach.texi
index 2c22fa38..fdc36d45 100644
--- a/doc/mach.texi
+++ b/doc/mach.texi
@@ -4830,11 +4830,11 @@ argument set to @code{THREAD_EXCEPTION_PORT}.
 @node Exceptions
 @subsection Exceptions
 
-@deftypefun kern_return_t catch_exception_raise (@w{mach_port_t 
@var{exception_port}}, @w{thread_t @var{thread}}, @w{task_t @var{task}}, @w{int 
@var{exception}}, @w{int @var{code}}, @w{int @var{subcode}})
+@deftypefun kern_return_t catch_exception_raise (@w{mach_port_t 
@var{exception_port}}, @w{thread_t @var{thread}}, @w{task_t @var{task}}, @w{int 
@var{exception}}, @w{int @var{code}}, @w{long @var{subcode}})
 XXX Fixme
 @end deftypefun
 
-@deftypefun kern_return_t exception_raise (@w{mach_port_t 
@var{exception_port}}, @w{mach_port_t @var{thread}}, @w{mach_port_t 
@var{task}}, @w{integer_t @var{exception}}, @w{integer_t @var{code}}, 
@w{integer_t @var{subcode}})
+@deftypefun kern_return_t exception_raise (@w{mach_port_t 
@var{exception_port}}, @w{mach_port_t @var{thread}}, @w{mach_port_t 
@var{task}}, @w{integer_t @var{exception}}, @w{integer_t @var{code}}, 
@w{long_integer_t @var{subcode}})
 XXX Fixme
 @end deftypefun
 
diff --git a/i386/i386/trap.c b/i386/i386/trap.c
index 34ccb6a5..f7bd8e38 100644
--- a/i386/i386/trap.c
+++ b/i386/i386/trap.c
@@ -628,7 +628,7 @@ void
 i386_exception(
        int     exc,
        int     code,
-       int     subcode)
+       long    subcode)
 {
        spl_t   s;
 
diff --git a/i386/i386/trap.h b/i386/i386/trap.h
index d9df7afa..e82164d0 100644
--- a/i386/i386/trap.h
+++ b/i386/i386/trap.h
@@ -40,7 +40,7 @@ void
 i386_exception(
        int     exc,
        int     code,
-       int     subcode) __attribute__ ((noreturn));
+       long    subcode) __attribute__ ((noreturn));
 
 extern void
 thread_kdb_return(void);
diff --git a/include/mach/exc.defs b/include/mach/exc.defs
index 94af828c..28638e2f 100644
--- a/include/mach/exc.defs
+++ b/include/mach/exc.defs
@@ -44,4 +44,4 @@ routine               exception_raise(
                        task            : mach_port_t;
                        exception       : integer_t;
                        code            : integer_t;
-                       subcode         : integer_t);
+                       subcode         : rpc_long_integer_t);
diff --git a/kern/exception.c b/kern/exception.c
index 1014b3ed..10435b5c 100644
--- a/kern/exception.c
+++ b/kern/exception.c
@@ -85,9 +85,9 @@ boolean_t debug_user_with_kdb = FALSE;
 
 void
 exception(
-       integer_t _exception, 
-       integer_t code, 
-       integer_t subcode)
+       integer_t _exception,
+       integer_t code,
+       long_integer_t subcode)
 {
        ipc_thread_t self = current_thread();
        ipc_port_t exc_port;
@@ -157,9 +157,9 @@ exception(
 
 void
 exception_try_task(
-       integer_t _exception, 
-       integer_t code, 
-       integer_t subcode)
+       integer_t _exception,
+       integer_t code,
+       long_integer_t subcode)
 {
        ipc_thread_t self = current_thread();
        task_t task = self->task;
@@ -277,11 +277,17 @@ struct mach_exception {
        mach_msg_type_t         codeType;
        integer_t               code;
        mach_msg_type_t         subcodeType;
-       integer_t               subcode;
+       rpc_long_integer_t      subcode;
 };
 
 #define        INTEGER_T_SIZE_IN_BITS  (8 * sizeof(integer_t))
 #define        INTEGER_T_TYPE          MACH_MSG_TYPE_INTEGER_T
+#define RPC_LONG_INTEGER_T_SIZE_IN_BITS        (8 * sizeof(rpc_long_integer_t))
+#if defined(__x86_64__) && !defined(USER32)
+#define RPC_LONG_INTEGER_T_TYPE        MACH_MSG_TYPE_INTEGER_64
+#else
+#define RPC_LONG_INTEGER_T_TYPE        MACH_MSG_TYPE_INTEGER_32
+#endif
                                        /* in mach/machine/vm_types.h */
 
 mach_msg_type_t exc_port_proto = {
@@ -304,6 +310,16 @@ mach_msg_type_t exc_code_proto = {
        /* msgt_unused = */             0
 };
 
+mach_msg_type_t exc_subcode_proto = {
+       /* msgt_name = */               RPC_LONG_INTEGER_T_TYPE,
+       /* msgt_size = */               RPC_LONG_INTEGER_T_SIZE_IN_BITS,
+       /* msgt_number = */             1,
+       /* msgt_inline = */             TRUE,
+       /* msgt_longform = */           FALSE,
+       /* msgt_deallocate = */         FALSE,
+       /* msgt_unused = */             0
+};
+
 /*
  *     Routine:        exception_raise
  *     Purpose:
@@ -329,9 +345,9 @@ exception_raise(
        ipc_port_t      dest_port,
        ipc_port_t      thread_port,
        ipc_port_t      task_port,
-       integer_t       _exception, 
-       integer_t       code, 
-       integer_t       subcode)
+       integer_t       _exception,
+       integer_t       code,
+       long_integer_t  subcode)
 {
        ipc_thread_t self = current_thread();
        ipc_thread_t receiver;
@@ -521,7 +537,7 @@ exception_raise(
        exc->exception = _exception;
        exc->codeType = exc_code_proto;
        exc->code = code;
-       exc->subcodeType = exc_code_proto;
+       exc->subcodeType = exc_subcode_proto;
        exc->subcode = subcode;
 
        /*
@@ -725,7 +741,7 @@ exception_raise(
        exc->exception = _exception;
        exc->codeType = exc_code_proto;
        exc->code = code;
-       exc->subcodeType = exc_code_proto;
+       exc->subcodeType = exc_subcode_proto;
        exc->subcode = subcode;
 
        ipc_mqueue_send_always(kmsg);
diff --git a/kern/exception.h b/kern/exception.h
index 55902dd1..36138da8 100644
--- a/kern/exception.h
+++ b/kern/exception.h
@@ -26,13 +26,13 @@ extern void
 exception(
        integer_t       _exception,
        integer_t       code,
-       integer_t       subcode) __attribute__ ((noreturn));
+       long_integer_t  subcode) __attribute__ ((noreturn));
 
 extern void
 exception_try_task(
        integer_t       _exception,
        integer_t       code,
-       integer_t       subcode) __attribute__ ((noreturn));
+       long_integer_t  subcode) __attribute__ ((noreturn));
 
 extern void
 exception_no_server(void) __attribute__ ((noreturn));
@@ -44,7 +44,7 @@ exception_raise(
        ipc_port_t task_port,
        integer_t  _exception,
        integer_t  code,
-       integer_t  subcode) __attribute__ ((noreturn));
+       long_integer_t  subcode) __attribute__ ((noreturn));
 
 extern kern_return_t
 exception_parse_reply(ipc_kmsg_t kmsg);
diff --git a/kern/thread.h b/kern/thread.h
index f8989f45..3485f6af 100644
--- a/kern/thread.h
+++ b/kern/thread.h
@@ -190,7 +190,7 @@ struct thread {
                        struct ipc_port *port;
                        int exc;
                        int code;
-                       int subcode;
+                       long subcode;
                } exception;
                void *other;            /* catch-all for other state */
        } saved;
-- 
2.39.2




reply via email to

[Prev in Thread] Current Thread [Next in Thread]