void get_state_info_on(void *data) { struct smp_call_args_t *arg = data; int flags; spin_lock_irqsave(&sal_record_lock, flags); memset(sal_record, 0, ia64_sal_get_state_info_size(arg->type)); arg->ret = ia64_sal_get_state_info(arg->type, (u64 *)sal_record); IA64_SAL_DEBUG("SAL_GET_STATE_INFO(%s) on CPU#%d returns %ld.\n", rec_name[arg->type], smp_processor_id(), arg->ret); if (arg->corrected) { sal_record->severity = sal_log_severity_corrected; IA64_SAL_DEBUG("%s: IA64_SAL_CLEAR_STATE_INFO(SAL_INFO_TYPE_MCA)" " force\n", __FUNCTION__); } if (arg->ret > 0) { /* * Save current->domain and set to local(caller) domain for * xencomm_paddr_to_maddr() which calculates maddr from * paddr using mpa value of current->domain. */ struct domain *save; save = current->domain; current->domain = arg->domain; if (xencomm_copy_to_guest((void*)arg->target, sal_record, arg->ret, 0)) { printk("SAL_GET_STATE_INFO can't copy to user!!!!\n"); arg->status = IA64_SAL_NO_INFORMATION_AVAILABLE; arg->ret = 0; } /* Restore current->domain to saved value. */ current->domain = save; } spin_unlock_irqrestore(&sal_record_lock, flags); }
static void salinfo_log_read_cpu(void *context) { struct salinfo_data *data = context; sal_log_record_header_t *rh; data->log_size = ia64_sal_get_state_info(data->type, (u64 *) data->log_buffer); rh = (sal_log_record_header_t *)(data->log_buffer); /* Clear corrected errors as they are read from SAL */ if (rh->severity == sal_log_severity_corrected) ia64_sal_clear_state_info(data->type); }
static void salinfo_log_read_cpu(void *context) { struct salinfo_data *data = context; data->log_size = ia64_sal_get_state_info(data->type, (u64 *) data->log_buffer); if (data->log_size > 0) { if (data->type == SAL_INFO_TYPE_CPE || data->type == SAL_INFO_TYPE_CMC) ia64_sal_clear_state_info(data->type); } }