/* * Dom0 issues this hypercall in place of writing pm1a_cnt. Xen then * takes over the control and put the system into sleep state really. */ int acpi_enter_sleep(struct xenpf_enter_acpi_sleep *sleep) { if ( sleep->flags & XENPF_ACPI_SLEEP_EXTENDED ) { if ( !acpi_sinfo.sleep_control.address || !acpi_sinfo.sleep_status.address ) return -EPERM; if ( sleep->flags & ~XENPF_ACPI_SLEEP_EXTENDED ) return -EINVAL; if ( sleep->val_a > ACPI_SLEEP_TYPE_MAX || (sleep->val_b != ACPI_SLEEP_TYPE_INVALID && sleep->val_b > ACPI_SLEEP_TYPE_MAX) ) return -ERANGE; acpi_sinfo.sleep_type_a = sleep->val_a; acpi_sinfo.sleep_type_b = sleep->val_b; acpi_sinfo.sleep_extended = 1; } else if ( !acpi_sinfo.pm1a_cnt_blk.address ) return -EPERM; /* Sanity check */ else if ( sleep->val_b && ((sleep->val_a ^ sleep->val_b) & ACPI_BITMASK_SLEEP_ENABLE) ) { gdprintk(XENLOG_ERR, "Mismatched pm1a/pm1b setting."); return -EINVAL; } else if ( sleep->flags ) return -EINVAL; else { acpi_sinfo.pm1a_cnt_val = sleep->val_a; acpi_sinfo.pm1b_cnt_val = sleep->val_b; acpi_sinfo.sleep_extended = 0; } acpi_sinfo.sleep_state = sleep->sleep_state; return continue_hypercall_on_cpu(0, enter_state_helper, &acpi_sinfo); }
static long do_microcode_update(void *_info) { struct microcode_info *info = _info; int error; BUG_ON(info->cpu != smp_processor_id()); error = microcode_update_cpu(info->buffer, info->buffer_size); if ( error ) info->error = error; info->cpu = cpumask_next(info->cpu, &cpu_online_map); if ( info->cpu < nr_cpu_ids ) return continue_hypercall_on_cpu(info->cpu, do_microcode_update, info); error = info->error; xfree(info); return error; }
/* * Dom0 issues this hypercall in place of writing pm1a_cnt. Xen then * takes over the control and put the system into sleep state really. */ int acpi_enter_sleep(struct xenpf_enter_acpi_sleep *sleep) { if ( !IS_PRIV(current->domain) || !acpi_sinfo.pm1a_cnt_blk.address ) return -EPERM; /* Sanity check */ if ( acpi_sinfo.pm1b_cnt_val && ((sleep->pm1a_cnt_val ^ sleep->pm1b_cnt_val) & ACPI_BITMASK_SLEEP_ENABLE) ) { gdprintk(XENLOG_ERR, "Mismatched pm1a/pm1b setting."); return -EINVAL; } if ( sleep->flags ) return -EINVAL; acpi_sinfo.pm1a_cnt_val = sleep->pm1a_cnt_val; acpi_sinfo.pm1b_cnt_val = sleep->pm1b_cnt_val; acpi_sinfo.sleep_state = sleep->sleep_state; return continue_hypercall_on_cpu(0, enter_state_helper, &acpi_sinfo); }