aboutsummaryrefslogtreecommitdiffstats
path: root/tools/libxc/xc_dom_elfloader.c
diff options
context:
space:
mode:
authorJan Beulich <jbeulich@novell.com>2011-07-08 08:34:29 +0100
committerJan Beulich <jbeulich@novell.com>2011-07-08 08:34:29 +0100
commitfe15cd0fb6d1622dbd04c2c227a368593c23b9af (patch)
tree49240004680441cc49865594022306d110933ea4 /tools/libxc/xc_dom_elfloader.c
parent4776f8ddd2f2ce957f4965d94709285621933dcc (diff)
downloadxen-fe15cd0fb6d1622dbd04c2c227a368593c23b9af.tar.gz
xen-fe15cd0fb6d1622dbd04c2c227a368593c23b9af.tar.bz2
xen-fe15cd0fb6d1622dbd04c2c227a368593c23b9af.zip
add privileged/unprivileged kernel feature indication
With our switching away from supporting 32-bit Dom0 operation, users complained that attempts (perhaps due to lack of knowledge of that change) to boot the no longer privileged kernel in Dom0 resulted in apparently silent failure. To make the mismatch explicit and visible, add feature flags that the kernel can set to indicate operation in what modes it supports. For backward compatibility, absence of both feature flags is taken to indicate a kernel that may be capable of operating in both modes. Signed-off-by: Jan Beulich <jbeulich@novell.com>
Diffstat (limited to 'tools/libxc/xc_dom_elfloader.c')
-rw-r--r--tools/libxc/xc_dom_elfloader.c9
1 files changed, 9 insertions, 0 deletions
diff --git a/tools/libxc/xc_dom_elfloader.c b/tools/libxc/xc_dom_elfloader.c
index 9114bfb333..3ddb1dfa28 100644
--- a/tools/libxc/xc_dom_elfloader.c
+++ b/tools/libxc/xc_dom_elfloader.c
@@ -286,6 +286,15 @@ static int xc_dom_parse_elf_kernel(struct xc_dom_image *dom)
if ( (rc = elf_xen_parse(elf, &dom->parms)) != 0 )
return rc;
+ if ( elf_xen_feature_get(XENFEAT_privileged, dom->parms.f_required) ||
+ (elf_xen_feature_get(XENFEAT_privileged, dom->parms.f_supported) &&
+ !elf_xen_feature_get(XENFEAT_unprivileged, dom->parms.f_supported)) )
+ {
+ xc_dom_panic(dom->xch, XC_INVALID_KERNEL, "%s: Kernel does not"
+ " support unprivileged (DomU) operation", __FUNCTION__);
+ return -EINVAL;
+ }
+
/* find kernel segment */
dom->kernel_seg.vstart = dom->parms.virt_kstart;
dom->kernel_seg.vend = dom->parms.virt_kend;