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); } }
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; } }
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; }
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; }