Beispiel #1
0
void am29000_cpu_device::external_irq_check()
{
	int mask = (m_cps >> CPS_IM_SHIFT) & CPS_IM_MASK;
	int irq_en = !(m_cps & CPS_DI) && !(m_cps & CPS_DA);
	int i;

	/* Clear interrupt pending bit to begin with */
	m_cps &= ~CPS_IP;

	for (i = 0; i < 4; ++i)
	{
		if (!(m_irq_active & (1 << i)) && (m_irq_lines & (1 << i)))
		{
			if (irq_en)
			{
				if (i <= mask)
				{
					m_irq_active |= (1 << i);
					signal_exception(EXCEPTION_INTR0 + i);
					m_pl_flags |= PFLAG_IRQ;
					return;
				}
			}
			/* Set interrupt pending bit if interrupt was disabled */
			m_cps |= CPS_IP;
		}
		else
			m_irq_active &= ~(1 << i);
	}
}
Beispiel #2
0
void printSignalInfo(int sig, bool noaction)
{
    // Lots of memory allocations here. Not neat, but more helpful.

    if (enable_signal_print)
        TaskInfo("Got %s(%d) '%s'\n%s",
             SignalName::name (sig), sig, SignalName::desc (sig),
             Backtrace::make_string ().c_str());
    fflush(stdout);

    switch(sig)
    {
#ifndef _MSC_VER
    case SIGCHLD:
        return;

    case SIGWINCH:
        TaskInfo("Got SIGWINCH");
        fflush(stdout);
        return;
#endif
    case SIGABRT:
        TaskInfo("Got SIGABRT");
        fflush(stdout);
        if (!noaction)
            exit(1);
        return;

    case SIGILL:
    case SIGSEGV:
        if (enable_signal_print)
            TaskInfo("Throwing segfault_sigill_exception");
        fflush(stdout);

        if (!noaction)
            BOOST_THROW_EXCEPTION(segfault_sigill_exception()
                              << signal_exception::signal(sig)
                              << signal_exception::signalname(SignalName::name (sig))
                              << signal_exception::signaldesc(SignalName::desc (sig))
                              << Backtrace::make (2));
        return;

    default:
        if (enable_signal_print)
            TaskInfo("Throwing signal_exception");
        fflush(stdout);

        if (!noaction)
            BOOST_THROW_EXCEPTION(signal_exception()
                              << signal_exception::signal(sig)
                              << signal_exception::signalname(SignalName::name (sig))
                              << signal_exception::signaldesc(SignalName::desc (sig))
                              << Backtrace::make (2));
        return;
    }
}
Beispiel #3
0
int vm_enter_vm_native(void *target, void *stack_ptr)
{
	if (vm_native_stack_is_full()) {
		struct vm_object *e = vm_alloc_stack_overflow_error();
		if (!e)
			error("failed to allocate exception");

		signal_exception(e);
		return -1;
	}

	struct vm_native_stack_entry *tr = new_vm_native_stack_entry();

	tr->stack_ptr = stack_ptr;
	tr->target = target;
	return 0;
}
Beispiel #4
0
int vm_enter_jni(void *caller_frame, struct vm_method *method,
		 unsigned long return_address)
{
	if (jni_stack_is_full()) {
		struct vm_object *e = vm_alloc_stack_overflow_error();
		if (!e)
			error("failed to allocate exception");

		signal_exception(e);
		return -1;
	}

	struct jni_stack_entry *tr = new_jni_stack_entry();

	tr->caller_frame = caller_frame;
	tr->return_address = return_address;
	tr->method = method;
	return 0;
}