rem: msg->data = data2; msg->data = data3;
add: msg->data2 = data2; msg->data3 = data3;
context: smp_send_ici(int target_cpu, int message, uint32 data, uint32 data2, uint32 data3, void *data_ptr, int flags){	struct smp_msg *msg;//	dprintf("smp_send_ici: target 0x%x, mess 0x%x, data 0x%x, data2 0x%x, data3 0x%x, ptr 0x%x, flags 0x%x\n",//		target_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();		if (target_cpu == curr_cpu) {			return_free_message(msg);			restore_interrupts(state);			return; // nope, cant do that		}		// set up the message		msg->message = message;		msg->data = data;		msg->data = data2;		msg->data = data3;		msg->data_ptr = data_ptr;		msg->ref_count = 1;		msg->flags = flags;		msg->done = false;		// stick it in the appropriate cpu's mailbox		acquire_spinlock_nocheck(&cpu_msg_spinlock[target_cpu]);		msg->next = smp_msgs[target_cpu];		smp_msgs[target_cpu] = msg;		release_spinlock(&cpu_msg_spinlock[target_cpu]);		arch_smp_send_ici(target_cpu);		if (flags == SMP_MSG_FLAG_SYNC) {			// wait for the other cpu 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			while (msg->done == false) {				smp_process_pending_ici(curr_cpu);				PAUSE();			}			// for SYNC messages, it's our responsibility to put it			// back into the free list			return_free_message(msg);		}		restore_interrupts(state);	}}