From: Ian.Campbell@xensource.com Date: Fri, 27 Jan 2006 11:31:12 +0000 (+0000) Subject: Add XENVER_get_features sub-operation to HYPERVISOR_xen_version. X-Git-Tag: archive/raspbian/4.8.0-1+rpi1~1^2~16523^2~2 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=bcec3ef0dd278112675f5cb178aa43f8a33e3a9b;p=xen.git Add XENVER_get_features sub-operation to HYPERVISOR_xen_version. This operation allows a guest OS to determine which features are supported by the running version of Xen. This changeset contains the base infrastructure but does not implement any features yet. Signed-off-by: Ian Campbell Index: xen-features/linux-2.6-xen-sparse/arch/xen/i386/kernel/setup.c =================================================================== --- xen-features.orig/linux-2.6-xen-sparse/arch/xen/i386/kernel/setup.c 2006-01-27 11:13:22.000000000 +0000 +++ xen-features/linux-2.6-xen-sparse/arch/xen/i386/kernel/setup.c 2006-01-27 11:27:14.000000000 +0000 @@ -56,6 +56,7 @@ #include #include #include +#include #include "setup_arch_pre.h" #include @@ -1591,6 +1592,9 @@ rd_prompt = ((RAMDISK_FLAGS & RAMDISK_PROMPT_FLAG) != 0); rd_doload = ((RAMDISK_FLAGS & RAMDISK_LOAD_FLAG) != 0); #endif + + setup_xen_features(); + ARCH_SETUP if (efi_enabled) efi_init(); Index: xen-features/linux-2.6-xen-sparse/arch/xen/x86_64/kernel/setup.c =================================================================== --- xen-features.orig/linux-2.6-xen-sparse/arch/xen/x86_64/kernel/setup.c 2006-01-27 11:13:22.000000000 +0000 +++ xen-features/linux-2.6-xen-sparse/arch/xen/x86_64/kernel/setup.c 2006-01-27 11:27:14.000000000 +0000 @@ -63,6 +63,7 @@ #include "setup_arch_pre.h" #include #include +#include #define PFN_UP(x) (((x) + PAGE_SIZE-1) >> PAGE_SHIFT) #define PFN_PHYS(x) ((x) << PAGE_SHIFT) #define end_pfn_map end_pfn @@ -587,6 +588,8 @@ #endif + setup_xen_features(); + HYPERVISOR_vm_assist(VMASST_CMD_enable, VMASST_TYPE_writable_pagetables); Index: xen-features/linux-2.6-xen-sparse/include/asm-xen/features.h =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 +++ xen-features/linux-2.6-xen-sparse/include/asm-xen/features.h 2006-01-27 11:27:14.000000000 +0000 @@ -0,0 +1,20 @@ +/****************************************************************************** + * features.h + * + * Query the features reported by Xen. + * + * Copyright (c) 2006, Ian Campbell + */ + +#ifndef __ASM_XEN_FEATURES_H__ +#define __ASM_XEN_FEATURES_H__ + +#include + +extern void setup_xen_features(void); + +extern unsigned long xen_features[XENFEAT_NR_SUBMAPS]; + +#define xen_feature(flag) (test_bit(_XENFEAT_ ## flag, xen_features)) + +#endif Index: xen-features/xen/common/kernel.c =================================================================== --- xen-features.orig/xen/common/kernel.c 2006-01-27 11:13:22.000000000 +0000 +++ xen-features/xen/common/kernel.c 2006-01-27 11:27:34.000000000 +0000 @@ -144,6 +144,28 @@ return -EFAULT; return 0; } + + case XENVER_get_features: + { + xen_feature_info_t fi; + + if ( copy_from_user(&fi, arg, sizeof(fi)) ) + return -EFAULT; + + switch ( fi.submap_idx ) + { + case 0: + fi.submap = 0; + break; + default: + return -EINVAL; + } + + if ( copy_to_user(arg, &fi, sizeof(fi)) ) + return -EFAULT; + return 0; + } + } return -ENOSYS; Index: xen-features/xen/include/public/version.h =================================================================== --- xen-features.orig/xen/include/public/version.h 2006-01-27 11:13:22.000000000 +0000 +++ xen-features/xen/include/public/version.h 2006-01-27 11:27:22.000000000 +0000 @@ -39,6 +39,14 @@ unsigned long virt_start; } xen_platform_parameters_t; +#define XENVER_get_features 6 +typedef struct xen_feature_info { + unsigned int submap_idx; /* IN: which 32-bit submap to return */ + uint32_t submap; /* OUT: 32-bit submap */ +} xen_feature_info_t; + +#define XENFEAT_NR_SUBMAPS 1 + #endif /* __XEN_PUBLIC_VERSION_H__ */ /* Index: xen-features/linux-2.6-xen-sparse/arch/xen/kernel/features.c =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 +++ xen-features/linux-2.6-xen-sparse/arch/xen/kernel/features.c 2006-01-27 11:27:14.000000000 +0000 @@ -0,0 +1,29 @@ +/****************************************************************************** + * features.c + * + * Xen feature flags. + * + * Copyright (c) 2006, Ian Campbell + */ +#include +#include +#include +#include + +/* When we rebase to a more recent version of Linux we can use __read_mostly here. */ +unsigned long xen_features[XENFEAT_NR_SUBMAPS] __cacheline_aligned; + +void setup_xen_features(void) +{ + uint32_t *flags = (uint32_t *)&xen_features[0]; + xen_feature_info_t fi; + int i; + + for (i=0; i #include #include +#include #include "setup_arch_pre.h" #include @@ -1591,6 +1592,9 @@ void __init setup_arch(char **cmdline_p) rd_prompt = ((RAMDISK_FLAGS & RAMDISK_PROMPT_FLAG) != 0); rd_doload = ((RAMDISK_FLAGS & RAMDISK_LOAD_FLAG) != 0); #endif + + setup_xen_features(); + ARCH_SETUP if (efi_enabled) efi_init(); diff --git a/linux-2.6-xen-sparse/arch/xen/kernel/features.c b/linux-2.6-xen-sparse/arch/xen/kernel/features.c new file mode 100644 index 0000000000..6a7315f928 --- /dev/null +++ b/linux-2.6-xen-sparse/arch/xen/kernel/features.c @@ -0,0 +1,29 @@ +/****************************************************************************** + * features.c + * + * Xen feature flags. + * + * Copyright (c) 2006, Ian Campbell + */ +#include +#include +#include +#include + +/* When we rebase to a more recent version of Linux we can use __read_mostly here. */ +unsigned long xen_features[XENFEAT_NR_SUBMAPS] __cacheline_aligned; + +void setup_xen_features(void) +{ + uint32_t *flags = (uint32_t *)&xen_features[0]; + xen_feature_info_t fi; + int i; + + for (i=0; i #include +#include #define PFN_UP(x) (((x) + PAGE_SIZE-1) >> PAGE_SHIFT) #define PFN_PHYS(x) ((x) << PAGE_SHIFT) #define end_pfn_map end_pfn @@ -587,6 +588,8 @@ void __init setup_arch(char **cmdline_p) #endif + setup_xen_features(); + HYPERVISOR_vm_assist(VMASST_CMD_enable, VMASST_TYPE_writable_pagetables); diff --git a/linux-2.6-xen-sparse/include/asm-xen/features.h b/linux-2.6-xen-sparse/include/asm-xen/features.h new file mode 100644 index 0000000000..ffe893f399 --- /dev/null +++ b/linux-2.6-xen-sparse/include/asm-xen/features.h @@ -0,0 +1,20 @@ +/****************************************************************************** + * features.h + * + * Query the features reported by Xen. + * + * Copyright (c) 2006, Ian Campbell + */ + +#ifndef __ASM_XEN_FEATURES_H__ +#define __ASM_XEN_FEATURES_H__ + +#include + +extern void setup_xen_features(void); + +extern unsigned long xen_features[XENFEAT_NR_SUBMAPS]; + +#define xen_feature(flag) (test_bit(_XENFEAT_ ## flag, xen_features)) + +#endif diff --git a/xen/common/kernel.c b/xen/common/kernel.c index f1d74c731a..3a4e420bc1 100644 --- a/xen/common/kernel.c +++ b/xen/common/kernel.c @@ -144,6 +144,28 @@ long do_xen_version(int cmd, void *arg) return -EFAULT; return 0; } + + case XENVER_get_features: + { + xen_feature_info_t fi; + + if ( copy_from_user(&fi, arg, sizeof(fi)) ) + return -EFAULT; + + switch ( fi.submap_idx ) + { + case 0: + fi.submap = 0; + break; + default: + return -EINVAL; + } + + if ( copy_to_user(arg, &fi, sizeof(fi)) ) + return -EFAULT; + return 0; + } + } return -ENOSYS; diff --git a/xen/include/public/version.h b/xen/include/public/version.h index d22566e381..8259f1856f 100644 --- a/xen/include/public/version.h +++ b/xen/include/public/version.h @@ -39,6 +39,14 @@ typedef struct xen_platform_parameters { unsigned long virt_start; } xen_platform_parameters_t; +#define XENVER_get_features 6 +typedef struct xen_feature_info { + unsigned int submap_idx; /* IN: which 32-bit submap to return */ + uint32_t submap; /* OUT: 32-bit submap */ +} xen_feature_info_t; + +#define XENFEAT_NR_SUBMAPS 1 + #endif /* __XEN_PUBLIC_VERSION_H__ */ /*