xen/xsm: Add support for device tree

This patch adds a new module "xen,xsm-policy" to allow the user to load the XSM
policy when Xen is booting.

Signed-off-by: Julien Grall <julien.grall@linaro.org>
Acked-by: Daniel De Graaf <dgdegra@tycho.nsa.gov>
Acked-by: Ian Campbell <ian.campbell@citrix.com>
This commit is contained in:
Julien Grall authored and Ian Campbell committed 2014-03-27 14:56:38 +00:00
1 parent 804ad45c55
commit a8f2fb51c1
6 files changed
+80 -1

No files matched your search

+1
View File
@@ -16,6 +16,7 @@ Each node contains the following properties:
- "linux-zimage" -- the dom0 kernel
- "linux-initrd" -- the dom0 ramdisk
- "xsm-policy" -- XSM policy blob
- reg
+2
View File
@@ -354,6 +354,8 @@ static void __init process_multiboot_node(const void *fdt, int node,
nr = MOD_KERNEL;
else if ( fdt_node_check_compatible(fdt, node, "xen,linux-initrd") == 0)
nr = MOD_INITRD;
else if ( fdt_node_check_compatible(fdt, node, "xen,xsm-policy") == 0 )
nr = MOD_XSM;
else
early_panic("%s not a known xen multiboot type\n", name);
+2 -1
View File
@@ -24,7 +24,8 @@
#define MOD_FDT 1
#define MOD_KERNEL 2
#define MOD_INITRD 3
#define NR_MODULES 4
#define MOD_XSM 4
#define NR_MODULES 5
#define MOD_DISCARD_FIRST MOD_FDT
+12
View File
@@ -652,6 +652,11 @@ extern int xsm_multiboot_policy_init(unsigned long *module_map,
void *(*bootstrap_map)(const module_t *));
#endif
#ifdef HAS_DEVICE_TREE
extern int xsm_dt_init(void);
extern int xsm_dt_policy_init(void);
#endif
extern int register_xsm(struct xsm_operations *ops);
extern int unregister_xsm(struct xsm_operations *ops);
@@ -671,6 +676,13 @@ static inline int xsm_multiboot_init (unsigned long *module_map,
}
#endif
#ifdef HAS_DEVICE_TREE
static inline int xsm_dt_init(void)
{
return 0;
}
#endif
#endif /* XSM_ENABLE */
#endif /* __XSM_H */
+26
View File
@@ -85,6 +85,32 @@ int __init xsm_multiboot_init(unsigned long *module_map,
}
#endif
#ifdef HAS_DEVICE_TREE
int __init xsm_dt_init(void)
{
int ret = 0;
printk("XSM Framework v" XSM_FRAMEWORK_VERSION " initialized\n");
if ( XSM_MAGIC )
{
ret = xsm_dt_policy_init();
if ( ret )
{
printk("%s: Error initializing policy (rc = %d).\n",
__FUNCTION__, ret);
return -EINVAL;
}
}
ret = xsm_core_init();
xfree(policy_buffer);
return ret;
}
#endif
int register_xsm(struct xsm_operations *ops)
{
if ( verify(ops) )
+37
View File
@@ -23,6 +23,10 @@
#include <xen/multiboot.h>
#endif
#include <xen/bitops.h>
#ifdef HAS_DEVICE_TREE
# include <asm/setup.h>
# include <xen/device_tree.h>
#endif
char *__initdata policy_buffer = NULL;
u32 __initdata policy_size = 0;
@@ -69,3 +73,36 @@ int __init xsm_multiboot_policy_init(unsigned long *module_map,
return rc;
}
#endif
#ifdef HAS_DEVICE_TREE
int __init xsm_dt_policy_init(void)
{
paddr_t paddr = early_info.modules.module[MOD_XSM].start;
paddr_t len = early_info.modules.module[MOD_XSM].size;
xsm_magic_t magic;
if ( !len )
return 0;
copy_from_paddr(&magic, paddr, sizeof(magic));
if ( magic != XSM_MAGIC )
{
printk(XENLOG_ERR "xsm: Invalid magic for XSM blob got 0x%x "
"expected 0x%x\n", magic, XSM_MAGIC);
return -EINVAL;
}
printk("xsm: Policy len = 0x%"PRIpaddr" start at 0x%"PRIpaddr"\n",
len, paddr);
policy_buffer = xmalloc_bytes(len);
if ( !policy_buffer )
return -ENOMEM;
copy_from_paddr(policy_buffer, paddr, len);
policy_size = len;
return 0;
}
#endif
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.