[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
- [RFC PATCH 00/34] The rest of the x86_64-gnu port, Sergey Bugaev, 2023/03/19
- [RFC PATCH gnumach 01/34] Add i386_fsgs_base_state, Sergey Bugaev, 2023/03/19
- [RFC PATCH gnumach 02/34] Remove bootstrap.defs, Sergey Bugaev, 2023/03/19
- [RFC PATCH gnumach 03/34] Make exception subcode a long,
Sergey Bugaev <=
- [RFC PATCH glibc 04/34] hurd: Make exception subcode a long, Sergey Bugaev, 2023/03/19
- [RFC PATCH glibc 05/34] hurd: Remove __hurd_threadvar_stack_{offset, mask}, Sergey Bugaev, 2023/03/19
- [RFC PATCH glibc 09/34] hurd: Fix _hurd_setup_sighandler () signature, Sergey Bugaev, 2023/03/19
- [RFC PATCH glibc 06/34] hurd: Swap around two function calls, Sergey Bugaev, 2023/03/19
- [RFC PATCH glibc 07/34] hurd: Fix file name in #error, Sergey Bugaev, 2023/03/19
- [RFC PATCH glibc 12/34] hurd: More 64-bit integer casting fixes, Sergey Bugaev, 2023/03/19
- [RFC PATCH glibc 13/34] x86-64: Disable prefer_map_32bit_exec tunable on non-Linux, Sergey Bugaev, 2023/03/19
- [RFC PATCH glibc 14/34] hurd: Move rtld-strncpy-c.c out of mach/hurd/, Sergey Bugaev, 2023/03/19
- [RFC PATCH glibc 15/34] hurd: Use uintptr_t for register values in trampoline.c, Sergey Bugaev, 2023/03/19
- [RFC PATCH glibc 10/34] stdio-common: Fix building when !IS_IN (libc), Sergey Bugaev, 2023/03/19