mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 02:01:24 +01:00
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:
1 parent
804ad45c55
commit
a8f2fb51c1
6 files changed
+80
-1
No files matched your search
@@ -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
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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 */
|
||||
@@ -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) )
|
||||
|
||||
@@ -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
|
||||