copyback = 1;
break;
+ case XEN_SYSCTL_set_parameter:
+ {
+#define XEN_SET_PARAMETER_MAX_SIZE 1023
+ char *params;
+
+ if ( op->u.set_parameter.pad[0] || op->u.set_parameter.pad[1] ||
+ op->u.set_parameter.pad[2] )
+ {
+ ret = -EINVAL;
+ break;
+ }
+ if ( op->u.set_parameter.size > XEN_SET_PARAMETER_MAX_SIZE )
+ {
+ ret = -E2BIG;
+ break;
+ }
+ params = xmalloc_bytes(op->u.set_parameter.size + 1);
+ if ( !params )
+ {
+ ret = -ENOMEM;
+ break;
+ }
+ if ( copy_from_guest(params, op->u.set_parameter.params,
+ op->u.set_parameter.size) )
+ ret = -EFAULT;
+ else
+ {
+ params[op->u.set_parameter.size] = 0;
+ ret = runtime_parse(params);
+ }
+
+ xfree(params);
+
+ break;
+ }
+
default:
ret = arch_do_sysctl(op, u_sysctl);
copyback = 0;
typedef struct xen_sysctl_livepatch_op xen_sysctl_livepatch_op_t;
DEFINE_XEN_GUEST_HANDLE(xen_sysctl_livepatch_op_t);
+/*
+ * XEN_SYSCTL_set_parameter
+ *
+ * Change hypervisor parameters at runtime.
+ * The input string is parsed similar to the boot parameters.
+ * Parameters are a single string terminated by a NUL byte of max. size
+ * characters. Multiple settings can be specified by separating them
+ * with blanks.
+ */
+
+struct xen_sysctl_set_parameter {
+ XEN_GUEST_HANDLE_64(char) params; /* IN: pointer to parameters. */
+ uint16_t size; /* IN: size of parameters. */
+ uint16_t pad[3]; /* IN: MUST be zero. */
+};
+typedef struct xen_sysctl_set_parameter xen_sysctl_set_parameter_t;
+DEFINE_XEN_GUEST_HANDLE(xen_sysctl_set_parameter_t);
+
struct xen_sysctl {
uint32_t cmd;
#define XEN_SYSCTL_readconsole 1
#define XEN_SYSCTL_get_cpu_levelling_caps 25
#define XEN_SYSCTL_get_cpu_featureset 26
#define XEN_SYSCTL_livepatch_op 27
+#define XEN_SYSCTL_set_parameter 28
uint32_t interface_version; /* XEN_SYSCTL_INTERFACE_VERSION */
union {
struct xen_sysctl_readconsole readconsole;
struct xen_sysctl_cpu_levelling_caps cpu_levelling_caps;
struct xen_sysctl_cpu_featureset cpu_featureset;
struct xen_sysctl_livepatch_op livepatch;
+ struct xen_sysctl_set_parameter set_parameter;
uint8_t pad[128];
} u;
};
case XEN_SYSCTL_gcov_op:
return avc_current_has_perm(SECINITSID_XEN, SECCLASS_XEN2,
XEN2__GCOV_OP, NULL);
+ case XEN_SYSCTL_set_parameter:
+ return avc_current_has_perm(SECINITSID_XEN, SECCLASS_XEN2,
+ XEN2__SET_PARAMETER, NULL);
default:
return avc_unknown_permission("sysctl", cmd);