bug-hurd
[Top][All Lists]
Advanced

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

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


From: Samuel Thibault
Subject: Re: [RFC PATCH gnumach 03/34] Make exception subcode a long
Date: Mon, 3 Apr 2023 00:45:57 +0200
User-agent: NeoMutt/20170609 (1.8.3)

Applied, thanks!

Sergey Bugaev, le dim. 19 mars 2023 18:09:46 +0300, a ecrit:
> 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.

But the change doesn't affect 32bit glibc and hurd since
rpc_long_integer_t is really like integer_t there, right?

> ---
> 
> 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
> 

-- 
Samuel
---
Pour une évaluation indépendante, transparente et rigoureuse !
Je soutiens la Commission d'Évaluation de l'Inria.



reply via email to

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