release_output_lock(); 
int xmon_core(struct pt_regs *regs, int fromipi){	int cmd = 0;	unsigned long msr;	struct bpt *bp;	long recurse_jmp[JMP_BUF_LEN];	unsigned long offset;#ifdef CONFIG_SMP	int cpu;	int secondary;	unsigned long timeout;#endif	msr = get_msr();	set_msrd(msr & ~MSR_EE);	/* disable interrupts */	bp = in_breakpoint_table(regs->nip, &offset);	if (bp != NULL) {		regs->nip = bp->address + offset;		atomic_dec(&bp->ref_count);	}	remove_cpu_bpts();#ifdef CONFIG_SMP	cpu = smp_processor_id();	if (cpu_isset(cpu, cpus_in_xmon)) {		get_output_lock();		excprint(regs);		printf("cpu 0x%x: Exception %lx %s in xmon, "		       "returning to main loop\n",		       cpu, regs->trap, getvecname(TRAP(regs)));		longjmp(xmon_fault_jmp[cpu], 1);	}	if (setjmp(recurse_jmp) != 0) {		if (!in_xmon || !xmon_gate) {			printf("xmon: WARNING: bad recursive fault "			       "on cpu 0x%x\n", cpu);			goto waiting;		}		secondary = !(xmon_taken && cpu == xmon_owner);		goto cmdloop;	}	xmon_fault_jmp[cpu] = recurse_jmp;	cpu_set(cpu, cpus_in_xmon);	bp = NULL;	if ((regs->msr & (MSR_IR|MSR_PR|MSR_SF)) == (MSR_IR|MSR_SF))		bp = at_breakpoint(regs->nip);	if (bp || (regs->msr & MSR_RI) == 0)		fromipi = 0;	if (!fromipi) {		get_output_lock();		excprint(regs);		if (bp) {			printf("cpu 0x%x stopped at breakpoint 0x%x (",			       cpu, BP_NUM(bp));			xmon_print_symbol(regs->nip, " ", ")\n");		}		if ((regs->msr & MSR_RI) == 0)			printf("WARNING: exception is not recoverable, "			       "can't continue\n");		release_output_lock();	} waiting:	secondary = 1;	while (secondary && !xmon_gate) {		if (in_xmon == 0) {			if (fromipi)				goto leave;			secondary = test_and_set_bit(0, &in_xmon);		}		barrier();	}	if (!secondary && !xmon_gate) {		/* we are the first cpu to come in */		/* interrupt other cpu(s) */		int ncpus = num_online_cpus();		xmon_owner = cpu;		mb();		if (ncpus > 1) {			smp_send_debugger_break(MSG_ALL_BUT_SELF);			/* wait for other cpus to come in */			for (timeout = 100000000; timeout != 0; --timeout) {				if (cpus_weight(cpus_in_xmon) >= ncpus)					break;				barrier();			}		}		remove_bpts();		disable_surveillance();		/* for breakpoint or single step, print the current instr. */		if (bp || TRAP(regs) == 0xd00)			ppc_inst_dump(regs->nip, 1, 0);		printf("enter ? for help\n");		mb();		xmon_gate = 1;		barrier();	} cmdloop:	while (in_xmon) {		if (secondary) {			if (cpu == xmon_owner) {				if (!test_and_set_bit(0, &xmon_taken)) {					secondary = 0;					continue;				}				/* missed it */				while (cpu == xmon_owner)					barrier();			}			barrier();		} else {			cmd = cmds(regs);			if (cmd != 0) {				/* exiting xmon */				insert_bpts();				xmon_gate = 0;				wmb();				in_xmon = 0;				break;			}			/* have switched to some other cpu */			secondary = 1;		}	} leave:	cpu_clear(cpu, cpus_in_xmon);	xmon_fault_jmp[cpu] = NULL;#else	/* UP is simple... */	if (in_xmon) {		printf("Exception %lx %s in xmon, returning to main loop\n",		       regs->trap, getvecname(TRAP(regs)));		longjmp(xmon_fault_jmp[0], 1);	}	if (setjmp(recurse_jmp) == 0) {		xmon_fault_jmp[0] = recurse_jmp;		in_xmon = 1;		excprint(regs);		bp = at_breakpoint(regs->nip);		if (bp) {			printf("Stopped at breakpoint %x (", BP_NUM(bp));			xmon_print_symbol(regs->nip, " ", ")\n");		}		if ((regs->msr & MSR_RI) == 0)			printf("WARNING: exception is not recoverable, "			       "can't continue\n");		remove_bpts();		disable_surveillance();		/* for breakpoint or single step, print the current instr. */		if (bp || TRAP(regs) == 0xd00)			ppc_inst_dump(regs->nip, 1, 0);		printf("enter ? for help\n");	}	cmd = cmds(regs);	insert_bpts();	in_xmon = 0;#endif	if ((regs->msr & (MSR_IR|MSR_PR|MSR_SF)) == (MSR_IR|MSR_SF)) {		bp = at_breakpoint(regs->nip);		if (bp != NULL) {			int stepped = emulate_step(regs, bp->instr[0]);			if (stepped == 0) {				regs->nip = (unsigned long) &bp->instr[0];				atomic_inc(&bp->ref_count);			} else if (stepped < 0) {				printf("Couldn't single-step %s instruction\n",				    (IS_RFID(bp->instr[0])? "rfid": "mtmsrd"));			}		}	}	insert_cpu_bpts();	set_msrd(msr);		/* restore interrupt enable */	return cmd != 'X';}
10457	/local/tlutelli/issta_data/temp/c/2005_temp/2005/10457/5cb4cc0d8211c490537c8568001958fc76741312/xmon.c/clean/arch/ppc64/xmon/xmon.c