|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH 06/12] xen: add domain specific parameter support
Add the framework for being able to define domain specific parameters.
This includes the needed macros for defining a parameter and the
minimal set of functions for doing parameter parsing.
Signed-off-by: Juergen Gross <jgross@xxxxxxxx>
---
xen/arch/arm/domain.c | 5 +++++
xen/arch/x86/domain.c | 4 ++++
xen/common/domain.c | 10 ++++++++++
xen/common/domctl.c | 46 ++++++++++++++++++++++++++++++++++++++++++++++
xen/common/kernel.c | 12 ++++++++++++
xen/include/xen/domain.h | 3 +++
xen/include/xen/init.h | 34 +++++++++++++++++++++++++++++-----
xen/include/xen/lib.h | 1 +
8 files changed, 110 insertions(+), 5 deletions(-)
diff --git a/xen/arch/arm/domain.c b/xen/arch/arm/domain.c
index feebbf5a92..3f8bd6bdcc 100644
--- a/xen/arch/arm/domain.c
+++ b/xen/arch/arm/domain.c
@@ -1011,6 +1011,11 @@ void vcpu_kick(struct vcpu *vcpu)
}
}
+int arch_domain_check_parflags(struct domain *d, unsigned int flags)
+{
+ return 0;
+}
+
/*
* Local variables:
* mode: C
diff --git a/xen/arch/x86/domain.c b/xen/arch/x86/domain.c
index d67a0478f6..8e57e7a181 100644
--- a/xen/arch/x86/domain.c
+++ b/xen/arch/x86/domain.c
@@ -2106,6 +2106,10 @@ static int __init init_vcpu_kick_softirq(void)
}
__initcall(init_vcpu_kick_softirq);
+int arch_domain_check_parflags(struct domain *d, unsigned int flags)
+{
+ return 0;
+}
/*
* Local variables:
diff --git a/xen/common/domain.c b/xen/common/domain.c
index 65151e2ac4..ac0ad97638 100644
--- a/xen/common/domain.c
+++ b/xen/common/domain.c
@@ -1647,6 +1647,16 @@ int continue_hypercall_on_cpu(
return 0;
}
+int domain_check_parflags(void *instance, unsigned int flags)
+{
+ struct domain *d = instance;
+
+ if ( !(flags & PARAM_FLAG_RUNTIME) && d->creation_finished )
+ return -EBUSY;
+
+ return arch_domain_check_parflags(d, flags);
+}
+
/*
* Local variables:
* mode: C
diff --git a/xen/common/domctl.c b/xen/common/domctl.c
index b2948814aa..149f0ed9d8 100644
--- a/xen/common/domctl.c
+++ b/xen/common/domctl.c
@@ -1075,6 +1075,52 @@ long do_domctl(XEN_GUEST_HANDLE_PARAM(xen_domctl_t)
u_domctl)
copyback = 1;
break;
+ case XEN_DOMCTL_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 ( d == current->domain )
+ {
+ printk("domain %u can't set parameter for itself!\n",
+ d->domain_id);
+ ret = -EBUSY;
+ break;
+ }
+ if ( op->u.set_parameter.size > XEN_SET_PARAMETER_MAX_SIZE )
+ {
+ printk("parameter size too big!\n");
+ 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
+ {
+ domain_pause(d);
+ params[op->u.set_parameter.size] = 0;
+ ret = domain_param_parse(d, params);
+ domain_unpause(d);
+ }
+
+ xfree(params);
+
+ break;
+ }
+
default:
ret = arch_do_domctl(op, d, u_domctl);
break;
diff --git a/xen/common/kernel.c b/xen/common/kernel.c
index 0d3d7f6135..d0b3af1453 100644
--- a/xen/common/kernel.c
+++ b/xen/common/kernel.c
@@ -222,6 +222,13 @@ static const struct parse_data runtime_parse_data = {
.end = __param_end,
};
+static const struct parse_data domain_parse_data = {
+ .scope = SCOPE_DOMAIN,
+ .start = __param_start,
+ .end = __param_end,
+ .check = domain_check_parflags,
+};
+
static void __init _cmdline_parse(const char *cmdline)
{
parse_params(cmdline, &boot_parse_data, NULL);
@@ -232,6 +239,11 @@ int runtime_parse(const char *line)
return parse_params(line, &runtime_parse_data, NULL);
}
+int domain_param_parse(struct domain *d, const char *line)
+{
+ return parse_params(line, &domain_parse_data, d);
+}
+
/**
* cmdline_parse -- parses the xen command line.
* If CONFIG_CMDLINE is set, it would be parsed prior to @cmdline.
diff --git a/xen/include/xen/domain.h b/xen/include/xen/domain.h
index 5e393fd7f2..944ed5beeb 100644
--- a/xen/include/xen/domain.h
+++ b/xen/include/xen/domain.h
@@ -72,6 +72,9 @@ int arch_domain_soft_reset(struct domain *d);
void arch_p2m_set_access_required(struct domain *d, bool access_required);
+int domain_check_parflags(void *instance, unsigned int flags);
+int arch_domain_check_parflags(struct domain *d, unsigned int flags);
+
int arch_set_info_guest(struct vcpu *, vcpu_guest_context_u);
void arch_get_info_guest(struct vcpu *, vcpu_guest_context_u);
diff --git a/xen/include/xen/init.h b/xen/include/xen/init.h
index 3975964ee8..13cf5214b3 100644
--- a/xen/include/xen/init.h
+++ b/xen/include/xen/init.h
@@ -54,6 +54,8 @@
#ifndef __ASSEMBLY__
+struct domain;
+
/*
* Used for initialization calls..
*/
@@ -74,7 +76,8 @@ void do_initcalls(void);
* Used for kernel command line parameter setup
*/
enum param_scope {
- SCOPE_GLOBAL
+ SCOPE_GLOBAL,
+ SCOPE_DOMAIN
};
struct kernel_param {
@@ -93,6 +96,7 @@ struct kernel_param {
union {
void *var;
int (*func)(const char *);
+ int (*func_domain)(const char *, struct domain *);
int (*call)(const char *, void *);
} par;
};
@@ -109,12 +113,12 @@ extern const struct kernel_param __param_start[],
__param_end[];
__attribute__((__aligned__(1))) char
#define __kparam __param(__initsetup)
-#define def_custom_param(_name, _scope, _flags, _func) \
+#define def_custom_param(_name, _scope, _flags, _ptr, _func) \
{ .name = _name, \
.type = OPT_CUSTOM, \
.scope = _scope, \
.flags = _flags, \
- .par.func = _func }
+ .par._ptr = _func }
#define def_var_param(_name, _type, _scope, _flags, _var) \
{ .name = _name, \
.type = _type, \
@@ -126,7 +130,7 @@ extern const struct kernel_param __param_start[],
__param_end[];
#define custom_param(_name, _var) \
__setup_str __setup_str_##_var[] = _name; \
__kparam __setup_##_var = \
- def_custom_param(__setup_str_##_var, SCOPE_GLOBAL, 0, _var)
+ def_custom_param(__setup_str_##_var, SCOPE_GLOBAL, 0, func, _var)
#define boolean_param(_name, _var) \
__setup_str __setup_str_##_var[] = _name; \
__kparam __setup_##_var = \
@@ -148,7 +152,7 @@ extern const struct kernel_param __param_start[],
__param_end[];
#define custom_runtime_only_param(_name, _var) \
__rtparam __rtpar_##_var = \
- def_custom_param(_name, SCOPE_GLOBAL, 0, _var)
+ def_custom_param(_name, SCOPE_GLOBAL, 0, func, _var)
#define boolean_runtime_only_param(_name, _var) \
__rtparam __rtpar_##_var = \
def_var_param(_name, OPT_BOOL, SCOPE_GLOBAL, 0, _var)
@@ -178,6 +182,26 @@ extern const struct kernel_param __param_start[],
__param_end[];
string_param(_name, _var); \
string_runtime_only_param(_name, _var)
+#define custom_domain_param(_name, _flags, _var) \
+ __rtparam __domain_par_##_var = \
+ def_custom_param(_name, SCOPE_DOMAIN, _flags, func_domain, _var)
+#define boolean_domain_param(_name, _flags, _var) \
+ __rtparam __domain_par_##_var = \
+ def_var_param(_name, OPT_BOOL, SCOPE_DOMAIN, _flags, \
+ (struct domain *)NULL->_var)
+#define integer_domain_param(_name, _flags, _var) \
+ __rtparam __domain_par_##_var = \
+ def_var_param(_name, OPT_UINT, SCOPE_DOMAIN, _flags, \
+ (struct domain *)NULL->_var)
+#define size_domain_param(_name, _flags, _var) \
+ __rtparam __domain_par_##_var = \
+ def_var_param(_name, OPT_SIZE, SCOPE_DOMAIN, _flags, \
+ (struct domain *)NULL->_var)
+#define string_domain_param(_name, _flags, _var) \
+ __rtparam __domain_par_##_var = \
+ def_var_param(_name, OPT_STR, SCOPE_DOMAIN, _flags, \
+ (struct domain *)NULL->_var)
+
#endif /* __ASSEMBLY__ */
#ifdef CONFIG_LATE_HWDOM
diff --git a/xen/include/xen/lib.h b/xen/include/xen/lib.h
index 972fc843fa..7ba5929ed5 100644
--- a/xen/include/xen/lib.h
+++ b/xen/include/xen/lib.h
@@ -70,6 +70,7 @@ struct domain;
void cmdline_parse(const char *cmdline);
int runtime_parse(const char *line);
+int domain_param_parse(struct domain *d, const char *line);
int parse_bool(const char *s, const char *e);
/**
--
2.16.4
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |