Illegal instruction exceptions
Warning on non-supported exception in task_set_exception_ports Implementation of task_get_exception_ports
This commit is contained in:
parent
e428736842
commit
d4b49d8b97
|
@ -1,4 +1,4 @@
|
|||
/* $NetBSD: mach_exec.h,v 1.19 2003/06/29 22:29:34 fvdl Exp $ */
|
||||
/* $NetBSD: mach_exec.h,v 1.20 2003/11/17 13:20:06 manu Exp $ */
|
||||
|
||||
/*-
|
||||
* Copyright (c) 2001 The NetBSD Foundation, Inc.
|
||||
|
@ -56,7 +56,7 @@ struct mach_emuldata {
|
|||
struct mach_port *med_bootstrap;/* task bootstrap port */
|
||||
struct mach_port *med_kernel; /* task kernel port */
|
||||
struct mach_port *med_host; /* task host port */
|
||||
struct mach_port *med_exc[MACH_EXC_MAX]; /* Exception ports */
|
||||
struct mach_port *med_exc[MACH_EXC_MAX + 1]; /* Exception ports */
|
||||
|
||||
int med_dirty_thid; /* Thread id not yet initialized */
|
||||
int med_suspend; /* Suspend semaphore */
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* $NetBSD: mach_notify.c,v 1.3 2003/11/17 01:52:14 manu Exp $ */
|
||||
/* $NetBSD: mach_notify.c,v 1.4 2003/11/17 13:20:06 manu Exp $ */
|
||||
|
||||
/*-
|
||||
* Copyright (c) 2003 The NetBSD Foundation, Inc.
|
||||
|
@ -37,7 +37,7 @@
|
|||
*/
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
__KERNEL_RCSID(0, "$NetBSD: mach_notify.c,v 1.3 2003/11/17 01:52:14 manu Exp $");
|
||||
__KERNEL_RCSID(0, "$NetBSD: mach_notify.c,v 1.4 2003/11/17 13:20:06 manu Exp $");
|
||||
|
||||
#include "opt_ktrace.h"
|
||||
#include "opt_compat_mach.h" /* For COMPAT_MACH in <sys/ktrace.h> */
|
||||
|
@ -420,6 +420,28 @@ mach_siginfo_to_exception(ksi, code)
|
|||
ksi->ksi_signo, ksi->ksi_code);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
case SIGILL:
|
||||
switch (ksi->ksi_code) {
|
||||
case ILL_ILLOPC:
|
||||
case ILL_ILLOPN:
|
||||
case ILL_ILLADR:
|
||||
case ILL_ILLTRP:
|
||||
code[0] = MACH_ILL_ILLOPC;
|
||||
code[1] = (long)ksi->ksi_addr;
|
||||
break;
|
||||
case ILL_PRVOPC:
|
||||
case ILL_PRVREG:
|
||||
code[0] = MACH_ILL_PRVOPC;
|
||||
code[1] = (long)ksi->ksi_addr;
|
||||
break;
|
||||
default:
|
||||
printf("untranslated siginfo signo %d, code %d\n",
|
||||
ksi->ksi_signo, ksi->ksi_code);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
printf("untranslated siginfo signo %d, code %d\n",
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* $NetBSD: mach_notify.h,v 1.3 2003/11/17 01:52:14 manu Exp $ */
|
||||
/* $NetBSD: mach_notify.h,v 1.4 2003/11/17 13:20:06 manu Exp $ */
|
||||
|
||||
/*-
|
||||
* Copyright (c) 2003 The NetBSD Foundation, Inc.
|
||||
|
@ -111,6 +111,8 @@ void mach_notify_port_dead_name(struct lwp *, struct mach_right *);
|
|||
#define MACH_BUS_ADRALN 1
|
||||
#define MACH_SEGV_MAPERR 2
|
||||
#define MACH_TRAP_BRKPT 1
|
||||
#define MACH_ILL_ILLOPC 2
|
||||
#define MACH_ILL_PRVOPC 3
|
||||
|
||||
/* Exception behaviors and associated messages Id */
|
||||
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* $NetBSD: mach_task.c,v 1.34 2003/11/17 01:52:14 manu Exp $ */
|
||||
/* $NetBSD: mach_task.c,v 1.35 2003/11/17 13:20:06 manu Exp $ */
|
||||
|
||||
/*-
|
||||
* Copyright (c) 2002-2003 The NetBSD Foundation, Inc.
|
||||
|
@ -39,7 +39,7 @@
|
|||
#include "opt_compat_darwin.h"
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
__KERNEL_RCSID(0, "$NetBSD: mach_task.c,v 1.34 2003/11/17 01:52:14 manu Exp $");
|
||||
__KERNEL_RCSID(0, "$NetBSD: mach_task.c,v 1.35 2003/11/17 13:20:06 manu Exp $");
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <sys/param.h>
|
||||
|
@ -348,16 +348,40 @@ mach_task_get_exception_ports(args)
|
|||
struct lwp *l = args->l;
|
||||
size_t *msglen = args->rsize;
|
||||
struct mach_emuldata *med;
|
||||
struct mach_right *mr;
|
||||
int i, j, count;
|
||||
|
||||
med = l->l_proc->p_emuldata;
|
||||
|
||||
uprintf("Unimplemented mach_task_get_exception_ports\n");
|
||||
/* It always return an array of 32 ports even if only 9 can be used */
|
||||
count = sizeof(rep->rep_old_handler) / sizeof(rep->rep_old_handler[0]);
|
||||
|
||||
rep->rep_msgh.msgh_bits =
|
||||
MACH_MSGH_REPLY_LOCAL_BITS(MACH_MSG_TYPE_MOVE_SEND_ONCE);
|
||||
MACH_MSGH_REPLY_LOCAL_BITS(MACH_MSG_TYPE_MOVE_SEND_ONCE) |
|
||||
MACH_MSGH_BITS_COMPLEX;
|
||||
rep->rep_msgh.msgh_size = sizeof(*rep) - sizeof(rep->rep_trailer);
|
||||
rep->rep_msgh.msgh_local_port = req->req_msgh.msgh_local_port;
|
||||
rep->rep_msgh.msgh_id = req->req_msgh.msgh_id + 100;
|
||||
rep->rep_body.msgh_descriptor_count = count;
|
||||
rep->rep_masks_count = count;
|
||||
|
||||
j = 0;
|
||||
for (i = 0; i <= MACH_EXC_MAX; i++) {
|
||||
if (med->med_exc[i] == NULL)
|
||||
continue;
|
||||
|
||||
mr = mach_right_get(med->med_exc[i], l, MACH_PORT_TYPE_SEND, 0);
|
||||
|
||||
rep->rep_old_handler[j].name = mr->mr_name;
|
||||
rep->rep_old_handler[j].disposition = 0x11;
|
||||
rep->rep_old_handler[j].type = 0;
|
||||
rep->rep_masks[j] = 1 << i;
|
||||
rep->rep_old_behaviors[j] = (int)mr->mr_port->mp_data >> 16;
|
||||
rep->rep_old_flavors[j] = (int)mr->mr_port->mp_data & 0xff;
|
||||
|
||||
j++;
|
||||
}
|
||||
|
||||
rep->rep_trailer.msgh_trailer_size = 8;
|
||||
|
||||
*msglen = sizeof(*rep);
|
||||
|
@ -411,6 +435,14 @@ mach_task_set_exception_ports(args)
|
|||
if (req->req_mask & MACH_EXC_MASK_RPC_ALERT)
|
||||
med->med_exc[MACH_EXC_RPC_ALERT] = mp;
|
||||
|
||||
#ifdef DEBUG_MACH
|
||||
if (req->req_mask & (MACH_EXC_ARITHMETIC | MACH_EXC_EMULATION |
|
||||
MACH_EXC_MASK_SOFTWARE | MACH_EXC_MASK_SYSCALL |
|
||||
MACH_EXC_MASK_MACH_SYSCALL | MACH_EXC_RPC_ALERT))
|
||||
printf("mach_set_exception_ports: some exceptions are "
|
||||
"not supported (mask %x)\n", req->req_mask);
|
||||
#endif
|
||||
|
||||
rep->rep_msgh.msgh_bits =
|
||||
MACH_MSGH_REPLY_LOCAL_BITS(MACH_MSG_TYPE_MOVE_SEND_ONCE);
|
||||
rep->rep_msgh.msgh_size = sizeof(*rep) - sizeof(rep->rep_trailer);
|
||||
|
|
Loading…
Reference in New Issue