ret_t ret = 0;
struct xen_platform_op curop, *op = &curop;
- if ( !IS_PRIV(current->domain) )
- return -EPERM;
-
if ( copy_from_guest(op, u_xenpf_op, 1) )
return -EFAULT;
if ( op->interface_version != XENPF_INTERFACE_VERSION )
return -EACCES;
+ ret = xsm_platform_op(op->cmd);
+ if ( ret )
+ return ret;
+
/*
* Trylock here avoids deadlock with an existing platform critical section
* which might (for some current or future reason) want to synchronise
{
struct xenpf_pcpu_version *ver = &op->u.pcpu_version;
+ ret = xsm_getcpuinfo();
+ if ( ret )
+ break;
+
if ( !get_cpu_maps() )
{
ret = -EBUSY;
int (*microcode) (void);
int (*physinfo) (void);
int (*platform_quirk) (uint32_t);
+ int (*platform_op) (uint32_t cmd);
int (*firmware_info) (void);
int (*efi_call) (void);
int (*acpi_sleep) (void);
return xsm_ops->platform_quirk(quirk);
}
+static inline int xsm_platform_op (uint32_t op)
+{
+ return xsm_ops->platform_op(op);
+}
+
static inline int xsm_firmware_info (void)
{
return xsm_ops->firmware_info();
set_to_dummy_if_null(ops, microcode);
set_to_dummy_if_null(ops, physinfo);
set_to_dummy_if_null(ops, platform_quirk);
+ set_to_dummy_if_null(ops, platform_op);
set_to_dummy_if_null(ops, firmware_info);
set_to_dummy_if_null(ops, efi_call);
set_to_dummy_if_null(ops, acpi_sleep);
XEN__QUIRK, NULL);
}
+static int flask_platform_op(uint32_t op)
+{
+ switch ( op )
+ {
+ case XENPF_settime:
+ case XENPF_add_memtype:
+ case XENPF_del_memtype:
+ case XENPF_read_memtype:
+ case XENPF_microcode_update:
+ case XENPF_platform_quirk:
+ case XENPF_firmware_info:
+ case XENPF_efi_runtime_call:
+ case XENPF_enter_acpi_sleep:
+ case XENPF_change_freq:
+ case XENPF_getidletime:
+ case XENPF_set_processor_pminfo:
+ case XENPF_get_cpuinfo:
+ case XENPF_get_cpu_version:
+ case XENPF_cpu_online:
+ case XENPF_cpu_offline:
+ case XENPF_cpu_hotadd:
+ case XENPF_mem_hotadd:
+ /* These operations have their own XSM hooks */
+ return 0;
+ case XENPF_core_parking:
+ return domain_has_xen(current->domain, XEN__PM_OP);
+ default:
+ printk("flask_platform_op: Unknown op %d\n", op);
+ return -EPERM;
+ }
+}
+
static int flask_firmware_info(void)
{
return domain_has_xen(current->domain, XEN__FIRMWARE);
.microcode = flask_microcode,
.physinfo = flask_physinfo,
.platform_quirk = flask_platform_quirk,
+ .platform_op = flask_platform_op,
.firmware_info = flask_firmware_info,
.efi_call = flask_efi_call,
.acpi_sleep = flask_acpi_sleep,