aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Bugaev <bugaevc@gmail.com>2023-03-19 18:09:46 +0300
committerSamuel Thibault <samuel.thibault@ens-lyon.org>2023-04-03 00:44:04 +0200
commit4096bd9d9cbdbac9b1bfce99a393295f63a88cc5 (patch)
tree14310d54975eada411a5e494f1ad944d58376234
parentf9b1676d4526ce89e6c6d41d8caf5759007d8c75 (diff)
downloadgnumach-4096bd9d9cbdbac9b1bfce99a393295f63a88cc5.tar.gz
gnumach-4096bd9d9cbdbac9b1bfce99a393295f63a88cc5.tar.bz2
gnumach-4096bd9d9cbdbac9b1bfce99a393295f63a88cc5.zip
Make exception subcode a long
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. Message-Id: <20230319151017.531737-4-bugaevc@gmail.com>
-rw-r--r--doc/mach.texi4
-rw-r--r--i386/i386/trap.c2
-rw-r--r--i386/i386/trap.h2
-rw-r--r--include/mach/exc.defs2
-rw-r--r--kern/exception.c40
-rw-r--r--kern/exception.h6
-rw-r--r--kern/thread.h2
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;