void do_return (byte numWords) { StackFrame *stackFrame; STACKWORD *fromStackPtr; stackFrame = current_stackframe(); #if DEBUG_BYTECODE printf ("\n------ return ----- %d ------------------\n\n", stackFrame->methodRecord->signatureId); #endif #if DEBUG_METHODS printf ("do_return: method: %d # num. words: %d\n", stackFrame->methodRecord->signatureId, numWords); #endif #ifdef VERIFY assert (stackFrame != null, LANGUAGE3); #endif if (stackFrame->monitor != null) exit_monitor (currentThread, stackFrame->monitor); #if DEBUG_THREADS || DEBUG_METHODS printf ("do_return: stack frame array size: %d\n", currentThread->stackFrameArraySize); #endif if (currentThread->stackFrameArraySize == 1) { #if DEBUG_METHODS printf ("do_return: thread is done: %d\n", (int) currentThread); #endif currentThread->state = DEAD; schedule_request (REQUEST_SWITCH_THREAD); return; } // Place source ptr below data to be copied up the stack fromStackPtr = get_stack_ptr_at (numWords); // Pop stack frame currentThread->stackFrameArraySize--; stackFrame--; // Assign registers update_registers (stackFrame); #if DEBUG_METHODS printf ("do_return: stack reset to:\n"); printf ("-- stack ptr = %d\n", (int) get_stack_ptr()); #endif while (numWords--) { push_word (*(++fromStackPtr)); } }
/** * Perform a return from a method call. Clean up the stack, setup * the return of any results, release any monitor and finally set the * PC for the return address. */ void do_return (int numWords) { StackFrame *stackFrame; STACKWORD *fromStackPtr; stackFrame = current_stackframe(); #if DEBUG_BYTECODE printf ("\n------ return ----- %d ------------------\n\n", stackFrame->methodRecord->signatureId); #endif #if DEBUG_METHODS printf ("do_return: method: %d # num. words: %d\n", stackFrame->methodRecord->signatureId, numWords); #endif #ifdef VERIFY assert (stackFrame != null, LANGUAGE3); #endif if (stackFrame->monitor != null) { // if this was a class init then mark the class as now complete if (stackFrame->methodRecord->signatureId == _6clinit_7_4_5V) set_init_state((ClassRecord *)(stackFrame->monitor), C_INITIALIZED); exit_monitor (currentThread, stackFrame->monitor); } #if DEBUG_THREADS || DEBUG_METHODS printf ("do_return: stack frame array size: %d\n", currentThread->stackFrameIndex); #endif // Place source ptr below data to be copied up the stack fromStackPtr = get_stack_ptr_at_cur(numWords); // Pop stack frame currentThread->stackFrameIndex--; stackFrame--; // Assign registers update_registers (stackFrame); #if DEBUG_METHODS printf ("do_return: stack reset to:\n"); //printf ("-- stack ptr = %d\n", (int) get_stack_ptr()); #endif while (numWords--) { push_word_cur (*(++fromStackPtr)); } }
void pfpu_isr() { if(queue[consume]->update) update_registers(queue[consume]->registers); if(queue[consume]->invalidate) { asm volatile( /* Invalidate Level-1 data cache */ "wcsr DCC, r0\n" "nop\n" ); } queue[consume]->callback(queue[consume]); consume = (consume + 1) & PFPU_TASKQ_MASK; level--; irq_ack(IRQ_PFPU); if(level > 0) pfpu_start(queue[consume]); else cts = 1; }
static rtems_status_code pfpu_execute(struct pfpu_td *td) { rtems_status_code sc; load_program(td->program, td->progsize); load_registers(td->registers); MM_WRITE(MM_PFPU_MESHBASE, (unsigned int)td->output); MM_WRITE(MM_PFPU_HMESHLAST, td->hmeshlast); MM_WRITE(MM_PFPU_VMESHLAST, td->vmeshlast); MM_WRITE(MM_PFPU_CTL, PFPU_CTL_START); sc = rtems_semaphore_obtain(done_sem, RTEMS_WAIT, 10); if (sc != RTEMS_SUCCESSFUL) return sc; if (td->update) update_registers(td->registers); if (td->invalidate) { __asm__ volatile( /* Invalidate Level-1 data cache */ "wcsr DCC, r0\n" "nop\n" ); }
void update_debugger() // Update debugger state and display. // Should be called after each R4300 instruction. { if(run==2) { if( check_breakpoints(PC->addr)==-1 ) { previousPC = PC->addr; return; } else { run = 0; switch_button_to_run(); gdk_beep(); } } if(registers_opened) { gdk_threads_enter(); update_registers(); gdk_threads_leave(); } if(desasm_opened) { gdk_threads_enter(); update_desasm( PC->addr ); gdk_threads_leave(); } /*if(regTLB_opened) { gdk_threads_enter(); update_TLBwindow(); gdk_threads_leave(); }*/ previousPC = PC->addr; // Emulation thread is blocked until a button is clicked. pthread_cond_wait(&debugger_done_cond, &mutex); }
static void update(HWND hwnd) { update_disasm(hwnd); update_registers(hwnd); update_timing(hwnd); }