Illegal instruction exceptions

Warning on non-supported exception in task_set_exception_ports
Implementation of task_get_exception_ports
This commit is contained in:
manu 2003-11-17 13:20:06 +00:00
parent e428736842
commit d4b49d8b97
4 changed files with 66 additions and 10 deletions

View File

@ -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 */

View File

@ -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",

View File

@ -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 */

View File

@ -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);
@ -396,7 +420,7 @@ mach_task_set_exception_ports(args)
med->med_exc[MACH_EXC_BAD_ACCESS] = mp;
if (req->req_mask & MACH_EXC_MASK_BAD_INSTRUCTION)
med->med_exc[MACH_EXC_BAD_INSTRUCTION] = mp;
if (req->req_mask & MACH_EXC_MASK_ARITHMETIC)
if (req->req_mask & MACH_EXC_MASK_ARITHMETIC)
med->med_exc[MACH_EXC_ARITHMETIC] = mp;
if (req->req_mask & MACH_EXC_MASK_EMULATION)
med->med_exc[MACH_EXC_EMULATION] = mp;
@ -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);