add: TRACE(("smp_send_broadcast_ici: done\n"));
context: smp_send_broadcast_ici(int message, uint32 data, uint32 data2, uint32 data3, void *data_ptr, int flags){	struct smp_msg *msg;//	dprintf("smp_send_broadcast_ici: cpu %d mess 0x%x, data 0x%x, data2 0x%x, data3 0x%x, ptr 0x%x, flags 0x%x\n",//		smp_get_current_cpu(), message, data, data2, data3, data_ptr, flags);	if (ici_enabled) {		int state;		int curr_cpu;		// find_free_message leaves interrupts disabled		state = find_free_message(&msg);		curr_cpu = smp_get_current_cpu();		msg->message = message;		msg->data = data;		msg->data2 = data2;		msg->data3 = data3;		msg->data_ptr = data_ptr;		msg->ref_count = smp_num_cpus - 1;		msg->flags = flags;		msg->proc_bitmap = SET_BIT(0, curr_cpu);		msg->done = false;//		dprintf("smp_send_broadcast_ici%d: inserting msg 0x%x into broadcast mbox\n", smp_get_current_cpu(), msg);		// stick it in the appropriate cpu's mailbox		acquire_spinlock_nocheck(&broadcast_msg_spinlock);		msg->next = smp_broadcast_msgs;		smp_broadcast_msgs = msg;		release_spinlock(&broadcast_msg_spinlock);		arch_smp_send_broadcast_ici();//		dprintf("smp_send_broadcast_ici: sent interrupt\n");		if (flags == SMP_MSG_FLAG_SYNC) {			// wait for the other cpus to finish processing it			// the interrupt handler will ref count it to <0			// if the message is sync after it has removed it from the mailbox//			dprintf("smp_send_broadcast_ici: waiting for ack\n");			while (msg->done == false) {				smp_process_pending_ici(curr_cpu);				PAUSE();			}//			dprintf("smp_send_broadcast_ici: returning message to free list\n");			// for SYNC messages, it's our responsibility to put it			// back into the free list			return_free_message(msg);		}		restore_interrupts(state);	}//	dprintf("smp_send_broadcast_ici: done\n");}