[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-changelog] [xen-unstable] Cleanups after XSM checkin.



# HG changeset patch
# User kfraser@xxxxxxxxxxxxxxxxxxxxx
# Date 1188558307 -3600
# Node ID 7e7e0ea6a0bbc093461f199947d6c99eaae01eba
# Parent  fa4d44c9d9f668867f6cb578155433678f6c5a93
Cleanups after XSM checkin.
Signed-off-by: Keir Fraser <keir@xxxxxxxxxxxxx>
---
 xen/include/acm/acm_core.h                      |  196 -------------
 xen/include/acm/acm_endian.h                    |   69 ----
 xen/include/acm/acm_hooks.h                     |  349 ------------------------
 xen/include/public/acm.h                        |  229 ---------------
 xen/include/public/acm_ops.h                    |  159 ----------
 .hgignore                                       |    1 
 Config.mk                                       |   12 
 tools/Rules.mk                                  |    2 
 tools/libxc/xenctrl.h                           |    4 
 tools/python/xen/lowlevel/acm/acm.c             |    5 
 tools/security/secpol_tool.c                    |    4 
 tools/security/secpol_xml2bin.c                 |    3 
 xen/Rules.mk                                    |    8 
 xen/arch/ia64/xen/xensetup.c                    |    2 
 xen/arch/powerpc/setup.c                        |    2 
 xen/arch/x86/setup.c                            |    2 
 xen/include/public/xsm/acm.h                    |  229 +++++++++++++++
 xen/include/public/xsm/acm_ops.h                |  159 ++++++++++
 xen/include/xen/sched.h                         |    5 
 xen/include/xsm/acm/acm_core.h                  |  196 +++++++++++++
 xen/include/xsm/acm/acm_endian.h                |   69 ++++
 xen/include/xsm/acm/acm_hooks.h                 |  349 ++++++++++++++++++++++++
 xen/xsm/acm/acm_chinesewall_hooks.c             |    9 
 xen/xsm/acm/acm_core.c                          |   10 
 xen/xsm/acm/acm_null_hooks.c                    |    2 
 xen/xsm/acm/acm_ops.c                           |    6 
 xen/xsm/acm/acm_policy.c                        |    8 
 xen/xsm/acm/acm_simple_type_enforcement_hooks.c |    6 
 xen/xsm/acm/acm_xsm_hooks.c                     |   20 -
 29 files changed, 1056 insertions(+), 1059 deletions(-)

diff -r fa4d44c9d9f6 -r 7e7e0ea6a0bb .hgignore
--- a/.hgignore Fri Aug 31 11:41:49 2007 +0100
+++ b/.hgignore Fri Aug 31 12:05:07 2007 +0100
@@ -151,6 +151,7 @@
 ^tools/python/build/.*$
 ^tools/security/secpol_tool$
 ^tools/security/xen/.*$
+^tools/security/xensec_tool$
 ^tools/tests/blowfish\.bin$
 ^tools/tests/blowfish\.h$
 ^tools/tests/test_x86_emulator$
diff -r fa4d44c9d9f6 -r 7e7e0ea6a0bb Config.mk
--- a/Config.mk Fri Aug 31 11:41:49 2007 +0100
+++ b/Config.mk Fri Aug 31 12:05:07 2007 +0100
@@ -79,19 +79,9 @@ CFLAGS += $(foreach i, $(EXTRA_INCLUDES)
 CFLAGS += $(foreach i, $(EXTRA_INCLUDES), -I$(i))
 
 # Enable XSM security module.  Enabling XSM requires selection of an 
-# XSM security module.
+# XSM security module (FLASK_ENABLE or ACM_SECURITY).
 XSM_ENABLE ?= n
-ifeq ($(XSM_ENABLE),y)
 FLASK_ENABLE ?= n
-ifeq ($(FLASK_ENABLE),y)
-FLASK_DEVELOP ?= y
-FLASK_BOOTPARAM ?= y
-FLASK_AVC_STATS ?= y
-endif
-endif
-
-# If ACM_SECURITY = y, then the access control module is compiled
-# into Xen and the policy type can be set by the boot policy file
 ACM_SECURITY ?= n
 
 # Optional components
diff -r fa4d44c9d9f6 -r 7e7e0ea6a0bb tools/Rules.mk
--- a/tools/Rules.mk    Fri Aug 31 11:41:49 2007 +0100
+++ b/tools/Rules.mk    Fri Aug 31 12:05:07 2007 +0100
@@ -49,6 +49,8 @@ mk-symlinks:
        ( cd xen/hvm && ln -sf ../../$(XEN_ROOT)/xen/include/public/hvm/*.h . )
        mkdir -p xen/io
        ( cd xen/io && ln -sf ../../$(XEN_ROOT)/xen/include/public/io/*.h . )
+       mkdir -p xen/xsm
+       ( cd xen/xsm && ln -sf ../../$(XEN_ROOT)/xen/include/public/xsm/*.h . )
        mkdir -p xen/arch-x86
        ( cd xen/arch-x86 && ln -sf 
../../$(XEN_ROOT)/xen/include/public/arch-x86/*.h . )
        mkdir -p xen/foreign
diff -r fa4d44c9d9f6 -r 7e7e0ea6a0bb tools/libxc/xenctrl.h
--- a/tools/libxc/xenctrl.h     Fri Aug 31 11:41:49 2007 +0100
+++ b/tools/libxc/xenctrl.h     Fri Aug 31 12:05:07 2007 +0100
@@ -26,8 +26,8 @@
 #include <xen/event_channel.h>
 #include <xen/sched.h>
 #include <xen/memory.h>
-#include <xen/acm.h>
-#include <xen/acm_ops.h>
+#include <xen/xsm/acm.h>
+#include <xen/xsm/acm_ops.h>
 
 #ifdef __ia64__
 #define XC_PAGE_SHIFT           14
diff -r fa4d44c9d9f6 -r 7e7e0ea6a0bb tools/python/xen/lowlevel/acm/acm.c
--- a/tools/python/xen/lowlevel/acm/acm.c       Fri Aug 31 11:41:49 2007 +0100
+++ b/tools/python/xen/lowlevel/acm/acm.c       Fri Aug 31 12:05:07 2007 +0100
@@ -18,6 +18,7 @@
  *
  * indent -i4 -kr -nut
  */
+
 #include <Python.h>
 
 #include <stdio.h>
@@ -27,8 +28,8 @@
 #include <stdlib.h>
 #include <sys/ioctl.h>
 #include <netinet/in.h>
-#include <xen/acm.h>
-#include <xen/acm_ops.h>
+#include <xen/xsm/acm.h>
+#include <xen/xsm/acm_ops.h>
 
 #include <xenctrl.h>
 
diff -r fa4d44c9d9f6 -r 7e7e0ea6a0bb tools/security/secpol_tool.c
--- a/tools/security/secpol_tool.c      Fri Aug 31 11:41:49 2007 +0100
+++ b/tools/security/secpol_tool.c      Fri Aug 31 12:05:07 2007 +0100
@@ -34,8 +34,8 @@
 #include <string.h>
 #include <netinet/in.h>
 #include <stdint.h>
-#include <xen/acm.h>
-#include <xen/acm_ops.h>
+#include <xen/xsm/acm.h>
+#include <xen/xsm/acm_ops.h>
 
 #include <xenctrl.h>
 
diff -r fa4d44c9d9f6 -r 7e7e0ea6a0bb tools/security/secpol_xml2bin.c
--- a/tools/security/secpol_xml2bin.c   Fri Aug 31 11:41:49 2007 +0100
+++ b/tools/security/secpol_xml2bin.c   Fri Aug 31 12:05:07 2007 +0100
@@ -22,6 +22,7 @@
  *
  * indent -i4 -kr -nut
  */
+
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
@@ -38,7 +39,7 @@
 #include <libxml/tree.h>
 #include <libxml/xmlreader.h>
 #include <stdint.h>
-#include <xen/acm.h>
+#include <xen/xsm/acm.h>
 
 #include "secpol_xml2bin.h"
 
diff -r fa4d44c9d9f6 -r 7e7e0ea6a0bb xen/Rules.mk
--- a/xen/Rules.mk      Fri Aug 31 11:41:49 2007 +0100
+++ b/xen/Rules.mk      Fri Aug 31 12:05:07 2007 +0100
@@ -57,11 +57,9 @@ ALL_OBJS-y               += $(BASEDIR)/a
 
 CFLAGS-y                += -g -D__XEN__
 CFLAGS-$(XSM_ENABLE)    += -DXSM_ENABLE
-CFLAGS-$(FLASK_ENABLE)    += -DFLASK_ENABLE -DXSM_MAGIC=0xf97cff8c
-CFLAGS-$(FLASK_DEVELOP)   += -DFLASK_DEVELOP
-CFLAGS-$(FLASK_BOOTPARAM) += -DFLASK_BOOTPARAM
-CFLAGS-$(FLASK_AVC_STATS) += -DFLASK_AVC_STATS
-CFLAGS-$(ACM_SECURITY)    += -DACM_SECURITY -DXSM_MAGIC=0xbcde0100
+CFLAGS-$(FLASK_ENABLE)  += -DFLASK_ENABLE -DXSM_MAGIC=0xf97cff8c
+CFLAGS-$(FLASK_ENABLE)  += -DFLASK_DEVELOP -DFLASK_BOOTPARAM -DFLASK_AVC_STATS
+CFLAGS-$(ACM_SECURITY)  += -DACM_SECURITY -DXSM_MAGIC=0xbcde0100
 CFLAGS-$(verbose)       += -DVERBOSE
 CFLAGS-$(crash_debug)   += -DCRASH_DEBUG
 CFLAGS-$(perfc)         += -DPERF_COUNTERS
diff -r fa4d44c9d9f6 -r 7e7e0ea6a0bb xen/arch/ia64/xen/xensetup.c
--- a/xen/arch/ia64/xen/xensetup.c      Fri Aug 31 11:41:49 2007 +0100
+++ b/xen/arch/ia64/xen/xensetup.c      Fri Aug 31 12:05:07 2007 +0100
@@ -28,7 +28,7 @@
 #include <asm/iosapic.h>
 #include <xen/softirq.h>
 #include <xen/rcupdate.h>
-#include <acm/acm_hooks.h>
+#include <xsm/acm/acm_hooks.h>
 #include <asm/sn/simulator.h>
 
 unsigned long xenheap_phys_end, total_pages;
diff -r fa4d44c9d9f6 -r 7e7e0ea6a0bb xen/arch/powerpc/setup.c
--- a/xen/arch/powerpc/setup.c  Fri Aug 31 11:41:49 2007 +0100
+++ b/xen/arch/powerpc/setup.c  Fri Aug 31 12:05:07 2007 +0100
@@ -38,7 +38,7 @@
 #include <xen/numa.h>
 #include <xen/rcupdate.h>
 #include <xen/version.h>
-#include <acm/acm_hooks.h>
+#include <xsm/acm/acm_hooks.h>
 #include <public/version.h>
 #include <asm/mpic.h>
 #include <asm/processor.h>
diff -r fa4d44c9d9f6 -r 7e7e0ea6a0bb xen/arch/x86/setup.c
--- a/xen/arch/x86/setup.c      Fri Aug 31 11:41:49 2007 +0100
+++ b/xen/arch/x86/setup.c      Fri Aug 31 12:05:07 2007 +0100
@@ -32,7 +32,7 @@
 #include <asm/desc.h>
 #include <asm/paging.h>
 #include <asm/e820.h>
-#include <acm/acm_hooks.h>
+#include <xsm/acm/acm_hooks.h>
 #include <xen/kexec.h>
 #include <asm/edd.h>
 #include <xsm/xsm.h>
diff -r fa4d44c9d9f6 -r 7e7e0ea6a0bb xen/include/acm/acm_core.h
--- a/xen/include/acm/acm_core.h        Fri Aug 31 11:41:49 2007 +0100
+++ /dev/null   Thu Jan 01 00:00:00 1970 +0000
@@ -1,196 +0,0 @@
-/****************************************************************
- * acm_core.h 
- * 
- * Copyright (C) 2005 IBM Corporation
- *
- * Author:
- * Reiner Sailer <sailer@xxxxxxxxxxxxxx>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License as
- * published by the Free Software Foundation, version 2 of the
- * License.
- *
- * sHype header file describing core data types and constants
- *    for the access control module and relevant policies
- *
- */
-
-#ifndef _ACM_CORE_H
-#define _ACM_CORE_H
-
-#include <xen/spinlock.h>
-#include <xen/list.h>
-#include <public/acm.h>
-#include <public/acm_ops.h>
-#include <acm/acm_endian.h>
-
-#define ACM_DEFAULT_SECURITY_POLICY \
-        ACM_CHINESE_WALL_AND_SIMPLE_TYPE_ENFORCEMENT_POLICY
-
-/* Xen-internal representation of the binary policy */
-struct acm_binary_policy {
-    char *policy_reference_name;
-    u16 primary_policy_code;
-    u16 secondary_policy_code;
-    struct acm_policy_version xml_pol_version;
-};
-
-struct chwall_binary_policy {
-    u32 max_types;
-    u32 max_ssidrefs;
-    u32 max_conflictsets;
-    domaintype_t *ssidrefs;     /* [max_ssidrefs][max_types]  */
-    domaintype_t *conflict_aggregate_set;  /* [max_types]      */
-    domaintype_t *running_types;    /* [max_types]      */
-    domaintype_t *conflict_sets;   /* [max_conflictsets][max_types]*/
-};
-
-struct ste_binary_policy {
-    u32 max_types;
-    u32 max_ssidrefs;
-    domaintype_t *ssidrefs;     /* [max_ssidrefs][max_types]  */
-    atomic_t ec_eval_count, gt_eval_count;
-    atomic_t ec_denied_count, gt_denied_count;
-    atomic_t ec_cachehit_count, gt_cachehit_count;
-};
-
-/* global acm policy */
-extern u16 acm_active_security_policy;
-extern struct acm_binary_policy acm_bin_pol;
-extern struct chwall_binary_policy chwall_bin_pol;
-extern struct ste_binary_policy ste_bin_pol;
-/* use the lock when reading / changing binary policy ! */
-extern rwlock_t acm_bin_pol_rwlock;
-extern rwlock_t ssid_list_rwlock;
-
-/* subject and object type definitions */
-#define ACM_DATATYPE_domain 1
-
-/* defines number of access decisions to other domains can be cached
- * one entry per domain, TE does not distinguish evtchn or grant_table */
-#define ACM_TE_CACHE_SIZE 8
-#define ACM_STE_valid 0
-#define ACM_STE_free  1
-
-/* cache line:
- * if cache_line.valid==ACM_STE_valid, then
- *    STE decision is cached as "permitted" 
- *                 on domain cache_line.id
- */
-struct acm_ste_cache_line {
-    int valid; /* ACM_STE_* */
-    domid_t id;
-};
-
-/* general definition of a subject security id */
-struct acm_ssid_domain {
-    struct list_head node; /* all are chained together */
-    int datatype;          /* type of subject (e.g., partition): 
ACM_DATATYPE_* */
-    ssidref_t ssidref;     /* combined security reference */
-    ssidref_t old_ssidref; /* holds previous value of ssidref during 
relabeling */
-    void *primary_ssid;    /* primary policy ssid part (e.g. chinese wall) */
-    void *secondary_ssid;  /* secondary policy ssid part (e.g. type 
enforcement) */
-    struct domain *subject;/* backpointer to subject structure */
-    domid_t domainid;      /* replicate id */
-};
-
-/* chinese wall ssid type */
-struct chwall_ssid {
-    ssidref_t chwall_ssidref;
-};
-
-/* simple type enforcement ssid type */
-struct ste_ssid {
-    ssidref_t ste_ssidref;
-    struct acm_ste_cache_line ste_cache[ACM_TE_CACHE_SIZE]; /* decision cache 
*/
-};
-
-/* macros to access ssidref for primary / secondary policy 
- * primary ssidref   = lower 16 bit
- *  secondary ssidref = higher 16 bit
- */
-#define ACM_PRIMARY(ssidref) \
- ((ssidref) & 0xffff)
-
-#define ACM_SECONDARY(ssidref) \
- ((ssidref) >> 16)
-
-#define GET_SSIDREF(POLICY, ssidref) \
- ((POLICY) == acm_bin_pol.primary_policy_code) ? \
- ACM_PRIMARY(ssidref) : ACM_SECONDARY(ssidref)
-
-/* macros to access ssid pointer for primary / secondary policy */
-#define GET_SSIDP(POLICY, ssid) \
- ((POLICY) == acm_bin_pol.primary_policy_code) ? \
- ((ssid)->primary_ssid) : ((ssid)->secondary_ssid)
-
-#define ACM_INVALID_SSIDREF  (0xffffffff)
-
-struct acm_sized_buffer
-{
-    uint32_t *array;
-    uint num_items;
-    uint position;
-};
-
-static inline int acm_array_append_tuple(struct acm_sized_buffer *buf,
-                                         uint32_t a, uint32_t b)
-{
-    uint i;
-    if (buf == NULL)
-        return 0;
-
-    i = buf->position;
-
-    if ((i + 2) > buf->num_items)
-        return 0;
-
-    buf->array[i]   = cpu_to_be32(a);
-    buf->array[i+1] = cpu_to_be32(b);
-    buf->position += 2;
-    return 1;
-}
-
-/* protos */
-int acm_init_domain_ssid(struct domain *, ssidref_t ssidref);
-void acm_free_domain_ssid(struct acm_ssid_domain *ssid);
-int acm_init_binary_policy(u32 policy_code);
-int acm_set_policy(XEN_GUEST_HANDLE_64(void) buf, u32 buf_size);
-int do_acm_set_policy(void *buf, u32 buf_size, int is_bootpolicy,
-                      struct acm_sized_buffer *, struct acm_sized_buffer *,
-                      struct acm_sized_buffer *);
-int acm_get_policy(XEN_GUEST_HANDLE_64(void) buf, u32 buf_size);
-int acm_dump_statistics(XEN_GUEST_HANDLE_64(void) buf, u16 buf_size);
-int acm_get_ssid(ssidref_t ssidref, XEN_GUEST_HANDLE_64(void) buf, u16 
buf_size);
-int acm_get_decision(ssidref_t ssidref1, ssidref_t ssidref2, u32 hook);
-int acm_set_policy_reference(u8 * buf, u32 buf_size);
-int acm_dump_policy_reference(u8 *buf, u32 buf_size);
-int acm_change_policy(struct acm_change_policy *);
-int acm_relabel_domains(struct acm_relabel_doms *);
-int do_chwall_init_state_curr(struct acm_sized_buffer *);
-int do_ste_init_state_curr(struct acm_sized_buffer *);
-
-/* variables */
-extern ssidref_t dom0_chwall_ssidref;
-extern ssidref_t dom0_ste_ssidref;
-#define ACM_MAX_NUM_TYPES   (256)
-
-/* traversing the list of ssids */
-extern struct list_head ssid_list;
-#define for_each_acmssid( N )                               \
-   for ( N =  (struct acm_ssid_domain *)ssid_list.next;     \
-         N != (struct acm_ssid_domain *)&ssid_list;         \
-         N =  (struct acm_ssid_domain *)N->node.next     )
-
-#endif
-
-/*
- * Local variables:
- * mode: C
- * c-set-style: "BSD"
- * c-basic-offset: 4
- * tab-width: 4
- * indent-tabs-mode: nil
- * End:
- */
diff -r fa4d44c9d9f6 -r 7e7e0ea6a0bb xen/include/acm/acm_endian.h
--- a/xen/include/acm/acm_endian.h      Fri Aug 31 11:41:49 2007 +0100
+++ /dev/null   Thu Jan 01 00:00:00 1970 +0000
@@ -1,69 +0,0 @@
-/****************************************************************
- * acm_endian.h 
- * 
- * Copyright (C) 2005 IBM Corporation
- *
- * Author:
- * Stefan Berger <stefanb@xxxxxxxxxxxxxx>
- * 
- * Contributions:
- * Reiner Sailer <sailer@xxxxxxxxxxxxxx>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License as
- * published by the Free Software Foundation, version 2 of the
- * License.
- *
- * sHype header file defining endian-dependent functions for the
- * big-endian policy interface
- *
- */
-
-#ifndef _ACM_ENDIAN_H
-#define _ACM_ENDIAN_H
-
-#include <asm/byteorder.h>
-
-static inline void arrcpy16(u16 *dest, const u16 *src, size_t n)
-{
-    unsigned int i;
-    for ( i = 0; i < n; i++ )
-        dest[i] = cpu_to_be16(src[i]);
-}
-
-static inline void arrcpy32(u32 *dest, const u32 *src, size_t n)
-{
-    unsigned int i;
-    for ( i = 0; i < n; i++ )
-        dest[i] = cpu_to_be32(src[i]);
-}
-
-static inline void arrcpy(
-    void *dest, const void *src, unsigned int elsize, size_t n)
-{
-    switch ( elsize )
-    {
-    case sizeof(u16):
-        arrcpy16((u16 *)dest, (u16 *)src, n);
-        break;
-
-    case sizeof(u32):
-        arrcpy32((u32 *)dest, (u32 *)src, n);
-        break;
-
-    default:
-        memcpy(dest, src, elsize*n);
-    }
-}
-
-#endif
-
-/*
- * Local variables:
- * mode: C
- * c-set-style: "BSD"
- * c-basic-offset: 4
- * tab-width: 4
- * indent-tabs-mode: nil
- * End:
- */
diff -r fa4d44c9d9f6 -r 7e7e0ea6a0bb xen/include/acm/acm_hooks.h
--- a/xen/include/acm/acm_hooks.h       Fri Aug 31 11:41:49 2007 +0100
+++ /dev/null   Thu Jan 01 00:00:00 1970 +0000
@@ -1,349 +0,0 @@
-/****************************************************************
- * acm_hooks.h 
- * 
- * Copyright (C) 2005 IBM Corporation
- *
- * Author:
- * Reiner Sailer <sailer@xxxxxxxxxxxxxx>
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License as
- * published by the Free Software Foundation, version 2 of the
- * License.
- *
- * acm header file implementing the global (policy-independent)
- *      sHype hooks that are called throughout Xen.
- * 
- */
-
-#ifndef _ACM_HOOKS_H
-#define _ACM_HOOKS_H
-
-#include <xen/config.h>
-#include <xen/errno.h>
-#include <xen/types.h>
-#include <xen/lib.h>
-#include <xen/delay.h>
-#include <xen/sched.h>
-#include <xen/multiboot.h>
-#include <public/acm.h>
-#include <acm/acm_core.h>
-#include <public/domctl.h>
-#include <public/event_channel.h>
-#include <asm/current.h>
-
-/*
- * HOOK structure and meaning (justifies a few words about our model):
- * 
- * General idea: every policy-controlled system operation is reflected in a 
- *               transaction in the system's security state
- *
- *      Keeping the security state consistent requires "atomic" transactions.
- *      The name of the hooks to place around policy-controlled transactions
- *      reflects this. If authorizations do not involve security state changes,
- *      then and only then POST and FAIL hooks remain empty since we don't care
- *      about the eventual outcome of the operation from a security viewpoint.
- *
- *      PURPOSE of hook types:
- *      ======================
- *      PRE-Hooks
- *       a) general authorization to guard a controlled system operation
- *       b) prepare security state change
- *          (means: fail hook must be able to "undo" this)
- *
- *      POST-Hooks
- *       a) commit prepared state change
- *
- *      FAIL-Hooks
- *       a) roll-back prepared security state change from PRE-Hook
- *
- *
- *      PLACEMENT of hook types:
- *      ========================
- *      PRE-Hooks must be called before a guarded/controlled system operation
- *      is started. They return ACM_ACCESS_PERMITTED, ACM_ACCESS_DENIED or
- *      error. Operation must be aborted if return is not ACM_ACCESS_PERMITTED.
- *
- *      POST-Hooks must be called after a successful system operation.
- *      There is no return value: commit never fails.
- *
- *      FAIL-Hooks must be called:
- *       a) if system transaction (operation) fails after calling the PRE-hook
- *       b) if another (secondary) policy denies access in its PRE-Hook
- *          (policy layering is useful but requires additional handling)
- *
- * Hook model from a security transaction viewpoint:
- *   start-sys-ops--> prepare ----succeed-----> commit --> sys-ops success
- *                   (pre-hook)  \           (post-hook)
- *                                \
- *                               fail
- *                                   \
- *                                    \
- *                                  roll-back
- *                                 (fail-hook)
- *                                        \
- *                                       sys-ops error
- *
- */
-
-struct acm_operations {
-    /* policy management functions (must always be defined!) */
-    int  (*init_domain_ssid)           (void **ssid, ssidref_t ssidref);
-    void (*free_domain_ssid)           (void *ssid);
-    int  (*dump_binary_policy)         (u8 *buffer, u32 buf_size);
-    int  (*test_binary_policy)         (u8 *buffer, u32 buf_size,
-                                        int is_bootpolicy,
-                                        struct acm_sized_buffer *);
-    int  (*set_binary_policy)          (u8 *buffer, u32 buf_size);
-    int  (*dump_statistics)            (u8 *buffer, u16 buf_size);
-    int  (*dump_ssid_types)            (ssidref_t ssidref, u8 *buffer, u16 
buf_size);
-    /* domain management control hooks (can be NULL) */
-    int  (*domain_create)              (void *subject_ssid, ssidref_t ssidref,
-                                        domid_t domid);
-    void (*domain_destroy)             (void *object_ssid, struct domain *d);
-    /* event channel control hooks  (can be NULL) */
-    int  (*pre_eventchannel_unbound)      (domid_t id1, domid_t id2);
-    void (*fail_eventchannel_unbound)     (domid_t id1, domid_t id2);
-    int  (*pre_eventchannel_interdomain)  (domid_t id);
-    void (*fail_eventchannel_interdomain) (domid_t id);
-    /* grant table control hooks (can be NULL)  */
-    int  (*pre_grant_map_ref)          (domid_t id);
-    void (*fail_grant_map_ref)         (domid_t id);
-    int  (*pre_grant_setup)            (domid_t id);
-    void (*fail_grant_setup)           (domid_t id);
-    /* generic domain-requested decision hooks (can be NULL) */
-    int (*sharing)                     (ssidref_t ssidref1,
-                                        ssidref_t ssidref2);
-    int (*authorization)               (ssidref_t ssidref1,
-                                        ssidref_t ssidref2);
-    /* determine whether the default policy is installed */
-    int (*is_default_policy)           (void);
-};
-
-/* global variables */
-extern struct acm_operations *acm_primary_ops;
-extern struct acm_operations *acm_secondary_ops;
-
-/* if ACM_TRACE_MODE defined, all hooks should
- * print a short trace message */
-/* #define ACM_TRACE_MODE */
-
-#ifdef ACM_TRACE_MODE
-# define traceprintk(fmt, args...) printk(fmt,## args)
-#else
-# define traceprintk(fmt, args...)
-#endif
-
-
-#ifndef ACM_SECURITY
-
-static inline int acm_pre_eventchannel_unbound(domid_t id1, domid_t id2)
-{ return 0; }
-static inline int acm_pre_eventchannel_interdomain(domid_t id)
-{ return 0; }
-static inline int acm_pre_grant_map_ref(domid_t id) 
-{ return 0; }
-static inline int acm_pre_grant_setup(domid_t id) 
-{ return 0; }
-static inline int acm_is_policy(char *buf, unsigned long len)
-{ return 0; }
-static inline int acm_sharing(ssidref_t ssidref1, ssidref_t ssidref2)
-{ return 0; }
-static inline int acm_authorization(ssidref_t ssidref1, ssidref_t ssidref2)
-{ return 0; }
-static inline int acm_domain_create(struct domain *d, ssidref_t ssidref)
-{ return 0; }
-static inline void acm_domain_destroy(struct domain *d)
-{ return; }
-
-#define DOM0_SSIDREF 0x0
-
-#else
-
-static inline void acm_domain_ssid_onto_list(struct acm_ssid_domain *ssid)
-{
-    write_lock(&ssid_list_rwlock);
-    list_add(&ssid->node, &ssid_list);
-    write_unlock(&ssid_list_rwlock);
-}
-
-static inline void acm_domain_ssid_off_list(struct acm_ssid_domain *ssid)
-{
-    write_lock(&ssid_list_rwlock);
-    list_del(&ssid->node);
-    write_unlock(&ssid_list_rwlock);
-}
-
-static inline int acm_pre_eventchannel_unbound(domid_t id1, domid_t id2)
-{
-    if ((acm_primary_ops->pre_eventchannel_unbound != NULL) && 
-        acm_primary_ops->pre_eventchannel_unbound(id1, id2))
-        return ACM_ACCESS_DENIED;
-    else if ((acm_secondary_ops->pre_eventchannel_unbound != NULL) && 
-             acm_secondary_ops->pre_eventchannel_unbound(id1, id2)) {
-        /* roll-back primary */
-        if (acm_primary_ops->fail_eventchannel_unbound != NULL)
-            acm_primary_ops->fail_eventchannel_unbound(id1, id2);
-        return ACM_ACCESS_DENIED;
-    } else
-        return ACM_ACCESS_PERMITTED;
-}
-
-static inline int acm_pre_eventchannel_interdomain(domid_t id)
-{
-    if ((acm_primary_ops->pre_eventchannel_interdomain != NULL) &&
-        acm_primary_ops->pre_eventchannel_interdomain(id))
-        return ACM_ACCESS_DENIED;
-    else if ((acm_secondary_ops->pre_eventchannel_interdomain != NULL) &&
-             acm_secondary_ops->pre_eventchannel_interdomain(id)) {
-        /* roll-back primary */
-        if (acm_primary_ops->fail_eventchannel_interdomain != NULL)
-            acm_primary_ops->fail_eventchannel_interdomain(id);
-        return ACM_ACCESS_DENIED;
-    } else
-        return ACM_ACCESS_PERMITTED;
-}
-
-
-static inline int acm_pre_grant_map_ref(domid_t id)
-{
-    if ( (acm_primary_ops->pre_grant_map_ref != NULL) &&
-         acm_primary_ops->pre_grant_map_ref(id) )
-    {
-        return ACM_ACCESS_DENIED;
-    }
-    else if ( (acm_secondary_ops->pre_grant_map_ref != NULL) &&
-              acm_secondary_ops->pre_grant_map_ref(id) )
-    {
-        /* roll-back primary */
-        if ( acm_primary_ops->fail_grant_map_ref != NULL )
-            acm_primary_ops->fail_grant_map_ref(id);
-        return ACM_ACCESS_DENIED;
-    }
-    else
-    {
-        return ACM_ACCESS_PERMITTED;
-    }
-}
-
-static inline int acm_pre_grant_setup(domid_t id)
-{
-    if ( (acm_primary_ops->pre_grant_setup != NULL) &&
-         acm_primary_ops->pre_grant_setup(id) )
-    {
-        return ACM_ACCESS_DENIED;
-    }
-    else if ( (acm_secondary_ops->pre_grant_setup != NULL) &&
-              acm_secondary_ops->pre_grant_setup(id) )
-    {
-        /* roll-back primary */
-        if (acm_primary_ops->fail_grant_setup != NULL)
-            acm_primary_ops->fail_grant_setup(id);
-        return ACM_ACCESS_DENIED;
-    }
-    else
-    {
-        return ACM_ACCESS_PERMITTED;
-    }
-}
-
-
-static inline void acm_domain_destroy(struct domain *d)
-{
-    void *ssid = d->ssid;
-    if (ssid != NULL) {
-        if (acm_primary_ops->domain_destroy != NULL)
-            acm_primary_ops->domain_destroy(ssid, d);
-        if (acm_secondary_ops->domain_destroy != NULL)
-            acm_secondary_ops->domain_destroy(ssid, d);
-        /* free security ssid for the destroyed domain (also if null policy */
-        acm_domain_ssid_off_list(ssid);
-        acm_free_domain_ssid((struct acm_ssid_domain *)(ssid));
-    }
-}
-
-
-static inline int acm_domain_create(struct domain *d, ssidref_t ssidref)
-{
-    void *subject_ssid = current->domain->ssid;
-    domid_t domid = d->domain_id;
-    int rc;
-
-    read_lock(&acm_bin_pol_rwlock);
-    /*
-       To be called when a domain is created; returns '0' if the
-       domain is allowed to be created, != '0' if not.
-     */
-    rc = acm_init_domain_ssid(d, ssidref);
-    if (rc != ACM_OK)
-        goto error_out;
-
-    if ((acm_primary_ops->domain_create != NULL) &&
-        acm_primary_ops->domain_create(subject_ssid, ssidref, domid)) {
-        rc = ACM_ACCESS_DENIED;
-    } else if ((acm_secondary_ops->domain_create != NULL) &&
-                acm_secondary_ops->domain_create(subject_ssid, ssidref,
-                                                 domid)) {
-        /* roll-back primary */
-        if (acm_primary_ops->domain_destroy != NULL)
-            acm_primary_ops->domain_destroy(d->ssid, d);
-        rc = ACM_ACCESS_DENIED;
-    }
-
-    if ( rc == ACM_OK )
-    {
-        acm_domain_ssid_onto_list(d->ssid);
-    } else {
-        acm_free_domain_ssid(d->ssid);
-    }
-
-error_out:
-    read_unlock(&acm_bin_pol_rwlock);
-    return rc;
-}
-
-
-static inline int acm_sharing(ssidref_t ssidref1, ssidref_t ssidref2)
-{
-    if ((acm_primary_ops->sharing != NULL) &&
-        acm_primary_ops->sharing(ssidref1, ssidref2))
-        return ACM_ACCESS_DENIED;
-    else if ((acm_secondary_ops->sharing != NULL) &&
-             acm_secondary_ops->sharing(ssidref1, ssidref2)) {
-        return ACM_ACCESS_DENIED;
-    } else
-        return ACM_ACCESS_PERMITTED;
-}
-
-
-static inline int acm_authorization(ssidref_t ssidref1, ssidref_t ssidref2)
-{
-    if ((acm_primary_ops->authorization != NULL) &&
-        acm_primary_ops->authorization(ssidref1, ssidref2))
-        return ACM_ACCESS_DENIED;
-    else if ((acm_secondary_ops->authorization != NULL) &&
-             acm_secondary_ops->authorization(ssidref1, ssidref2)) {
-        return ACM_ACCESS_DENIED;
-    } else
-        return ACM_ACCESS_PERMITTED;
-}
-
-
-/* Return true iff buffer has an acm policy magic number.  */
-extern int acm_is_policy(char *buf, unsigned long len);
-
-#define DOM0_SSIDREF (dom0_ste_ssidref << 16 | dom0_chwall_ssidref)
-
-#endif
-
-#endif
-
-/*
- * Local variables:
- * mode: C
- * c-set-style: "BSD"
- * c-basic-offset: 4
- * tab-width: 4
- * indent-tabs-mode: nil
- * End:
- */
diff -r fa4d44c9d9f6 -r 7e7e0ea6a0bb xen/include/public/acm.h
--- a/xen/include/public/acm.h  Fri Aug 31 11:41:49 2007 +0100
+++ /dev/null   Thu Jan 01 00:00:00 1970 +0000
@@ -1,229 +0,0 @@
-/*
- * acm.h: Xen access control module interface defintions
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to
- * deal in the Software without restriction, including without limitation the
- * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
- * sell copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- *
- * Reiner Sailer <sailer@xxxxxxxxxxxxxx>
- * Copyright (c) 2005, International Business Machines Corporation.
- */
-
-#ifndef _XEN_PUBLIC_ACM_H
-#define _XEN_PUBLIC_ACM_H
-
-#include "xen.h"
-
-/* if ACM_DEBUG defined, all hooks should
- * print a short trace message (comment it out
- * when not in testing mode )
- */
-/* #define ACM_DEBUG */
-
-#ifdef ACM_DEBUG
-#  define printkd(fmt, args...) printk(fmt,## args)
-#else
-#  define printkd(fmt, args...)
-#endif
-
-/* default ssid reference value if not supplied */
-#define ACM_DEFAULT_SSID  0x0
-#define ACM_DEFAULT_LOCAL_SSID  0x0
-
-/* Internal ACM ERROR types */
-#define ACM_OK     0
-#define ACM_UNDEF   -1
-#define ACM_INIT_SSID_ERROR  -2
-#define ACM_INIT_SOID_ERROR  -3
-#define ACM_ERROR          -4
-
-/* External ACCESS DECISIONS */
-#define ACM_ACCESS_PERMITTED        0
-#define ACM_ACCESS_DENIED           -111
-#define ACM_NULL_POINTER_ERROR      -200
-
-/*
-   Error codes reported in when trying to test for a new policy
-   These error codes are reported in an array of tuples where
-   each error code is followed by a parameter describing the error
-   more closely, such as a domain id.
-*/
-#define ACM_EVTCHN_SHARING_VIOLATION       0x100
-#define ACM_GNTTAB_SHARING_VIOLATION       0x101
-#define ACM_DOMAIN_LOOKUP                  0x102
-#define ACM_CHWALL_CONFLICT                0x103
-#define ACM_SSIDREF_IN_USE                 0x104
-
-
-/* primary policy in lower 4 bits */
-#define ACM_NULL_POLICY 0
-#define ACM_CHINESE_WALL_POLICY 1
-#define ACM_SIMPLE_TYPE_ENFORCEMENT_POLICY 2
-#define ACM_POLICY_UNDEFINED 15
-
-/* combinations have secondary policy component in higher 4bit */
-#define ACM_CHINESE_WALL_AND_SIMPLE_TYPE_ENFORCEMENT_POLICY \
-    ((ACM_SIMPLE_TYPE_ENFORCEMENT_POLICY << 4) | ACM_CHINESE_WALL_POLICY)
-
-/* policy: */
-#define ACM_POLICY_NAME(X) \
- ((X) == (ACM_NULL_POLICY)) ? "NULL" :                        \
-    ((X) == (ACM_CHINESE_WALL_POLICY)) ? "CHINESE WALL" :        \
-    ((X) == (ACM_SIMPLE_TYPE_ENFORCEMENT_POLICY)) ? "SIMPLE TYPE ENFORCEMENT" 
: \
-    ((X) == (ACM_CHINESE_WALL_AND_SIMPLE_TYPE_ENFORCEMENT_POLICY)) ? "CHINESE 
WALL AND SIMPLE TYPE ENFORCEMENT" : \
-     "UNDEFINED"
-
-/* the following policy versions must be increased
- * whenever the interpretation of the related
- * policy's data structure changes
- */
-#define ACM_POLICY_VERSION 3
-#define ACM_CHWALL_VERSION 1
-#define ACM_STE_VERSION  1
-
-/* defines a ssid reference used by xen */
-typedef uint32_t ssidref_t;
-
-/* hooks that are known to domains */
-#define ACMHOOK_none          0
-#define ACMHOOK_sharing       1
-#define ACMHOOK_authorization 2
-
-/* -------security policy relevant type definitions-------- */
-
-/* type identifier; compares to "equal" or "not equal" */
-typedef uint16_t domaintype_t;
-
-/* CHINESE WALL POLICY DATA STRUCTURES
- *
- * current accumulated conflict type set:
- * When a domain is started and has a type that is in
- * a conflict set, the conflicting types are incremented in
- * the aggregate set. When a domain is destroyed, the 
- * conflicting types to its type are decremented.
- * If a domain has multiple types, this procedure works over
- * all those types.
- *
- * conflict_aggregate_set[i] holds the number of
- *   running domains that have a conflict with type i.
- *
- * running_types[i] holds the number of running domains
- *        that include type i in their ssidref-referenced type set
- *
- * conflict_sets[i][j] is "0" if type j has no conflict
- *    with type i and is "1" otherwise.
- */
-/* high-16 = version, low-16 = check magic */
-#define ACM_MAGIC  0x0001debc
-
-/* each offset in bytes from start of the struct they
- * are part of */
-
-/* V3 of the policy buffer aded a version structure */
-struct acm_policy_version
-{
-    uint32_t major;
-    uint32_t minor;
-};
-
-
-/* each buffer consists of all policy information for
- * the respective policy given in the policy code
- *
- * acm_policy_buffer, acm_chwall_policy_buffer,
- * and acm_ste_policy_buffer need to stay 32-bit aligned
- * because we create binary policies also with external
- * tools that assume packed representations (e.g. the java tool)
- */
-struct acm_policy_buffer {
-    uint32_t magic;
-    uint32_t policy_version; /* ACM_POLICY_VERSION */
-    uint32_t len;
-    uint32_t policy_reference_offset;
-    uint32_t primary_policy_code;
-    uint32_t primary_buffer_offset;
-    uint32_t secondary_policy_code;
-    uint32_t secondary_buffer_offset;
-    struct acm_policy_version xml_pol_version; /* add in V3 */
-};
-
-
-struct acm_policy_reference_buffer {
-    uint32_t len;
-};
-
-struct acm_chwall_policy_buffer {
-    uint32_t policy_version; /* ACM_CHWALL_VERSION */
-    uint32_t policy_code;
-    uint32_t chwall_max_types;
-    uint32_t chwall_max_ssidrefs;
-    uint32_t chwall_max_conflictsets;
-    uint32_t chwall_ssid_offset;
-    uint32_t chwall_conflict_sets_offset;
-    uint32_t chwall_running_types_offset;
-    uint32_t chwall_conflict_aggregate_offset;
-};
-
-struct acm_ste_policy_buffer {
-    uint32_t policy_version; /* ACM_STE_VERSION */
-    uint32_t policy_code;
-    uint32_t ste_max_types;
-    uint32_t ste_max_ssidrefs;
-    uint32_t ste_ssid_offset;
-};
-
-struct acm_stats_buffer {
-    uint32_t magic;
-    uint32_t len;
-    uint32_t primary_policy_code;
-    uint32_t primary_stats_offset;
-    uint32_t secondary_policy_code;
-    uint32_t secondary_stats_offset;
-};
-
-struct acm_ste_stats_buffer {
-    uint32_t ec_eval_count;
-    uint32_t gt_eval_count;
-    uint32_t ec_denied_count;
-    uint32_t gt_denied_count;
-    uint32_t ec_cachehit_count;
-    uint32_t gt_cachehit_count;
-};
-
-struct acm_ssid_buffer {
-    uint32_t len;
-    ssidref_t ssidref;
-    uint32_t policy_reference_offset;
-    uint32_t primary_policy_code;
-    uint32_t primary_max_types;
-    uint32_t primary_types_offset;
-    uint32_t secondary_policy_code;
-    uint32_t secondary_max_types;
-    uint32_t secondary_types_offset;
-};
-
-#endif
-
-/*
- * Local variables:
- * mode: C
- * c-set-style: "BSD"
- * c-basic-offset: 4
- * tab-width: 4
- * indent-tabs-mode: nil
- * End:
- */
diff -r fa4d44c9d9f6 -r 7e7e0ea6a0bb xen/include/public/acm_ops.h
--- a/xen/include/public/acm_ops.h      Fri Aug 31 11:41:49 2007 +0100
+++ /dev/null   Thu Jan 01 00:00:00 1970 +0000
@@ -1,159 +0,0 @@
-/*
- * acm_ops.h: Xen access control module hypervisor commands
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to
- * deal in the Software without restriction, including without limitation the
- * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
- * sell copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- *
- * Reiner Sailer <sailer@xxxxxxxxxxxxxx>
- * Copyright (c) 2005,2006 International Business Machines Corporation.
- */
-
-#ifndef __XEN_PUBLIC_ACM_OPS_H__
-#define __XEN_PUBLIC_ACM_OPS_H__
-
-#include "xen.h"
-#include "acm.h"
-
-/*
- * Make sure you increment the interface version whenever you modify this file!
- * This makes sure that old versions of acm tools will stop working in a
- * well-defined way (rather than crashing the machine, for instance).
- */
-#define ACM_INTERFACE_VERSION   0xAAAA000A
-
-/************************************************************************/
-
-/*
- * Prototype for this hypercall is:
- *  int acm_op(int cmd, void *args)
- * @cmd  == ACMOP_??? (access control module operation).
- * @args == Operation-specific extra arguments (NULL if none).
- */
-
-
-#define ACMOP_setpolicy         1
-struct acm_setpolicy {
-    /* IN */
-    XEN_GUEST_HANDLE_64(void) pushcache;
-    uint32_t pushcache_size;
-};
-
-
-#define ACMOP_getpolicy         2
-struct acm_getpolicy {
-    /* IN */
-    XEN_GUEST_HANDLE_64(void) pullcache;
-    uint32_t pullcache_size;
-};
-
-
-#define ACMOP_dumpstats         3
-struct acm_dumpstats {
-    /* IN */
-    XEN_GUEST_HANDLE_64(void) pullcache;
-    uint32_t pullcache_size;
-};
-
-
-#define ACMOP_getssid           4
-#define ACM_GETBY_ssidref  1
-#define ACM_GETBY_domainid 2
-struct acm_getssid {
-    /* IN */
-    uint32_t get_ssid_by; /* ACM_GETBY_* */
-    union {
-        domaintype_t domainid;
-        ssidref_t    ssidref;
-    } id;
-    XEN_GUEST_HANDLE_64(void) ssidbuf;
-    uint32_t ssidbuf_size;
-};
-
-#define ACMOP_getdecision      5
-struct acm_getdecision {
-    /* IN */
-    uint32_t get_decision_by1; /* ACM_GETBY_* */
-    uint32_t get_decision_by2; /* ACM_GETBY_* */
-    union {
-        domaintype_t domainid;
-        ssidref_t    ssidref;
-    } id1;
-    union {
-        domaintype_t domainid;
-        ssidref_t    ssidref;
-    } id2;
-    uint32_t hook;
-    /* OUT */
-    uint32_t acm_decision;
-};
-
-
-#define ACMOP_chgpolicy        6
-struct acm_change_policy {
-    /* IN */
-    XEN_GUEST_HANDLE_64(void) policy_pushcache;
-    uint32_t policy_pushcache_size;
-    XEN_GUEST_HANDLE_64(void) del_array;
-    uint32_t delarray_size;
-    XEN_GUEST_HANDLE_64(void) chg_array;
-    uint32_t chgarray_size;
-    /* OUT */
-    /* array with error code */
-    XEN_GUEST_HANDLE_64(void) err_array;
-    uint32_t errarray_size;
-};
-
-#define ACMOP_relabeldoms       7
-struct acm_relabel_doms {
-    /* IN */
-    XEN_GUEST_HANDLE_64(void) relabel_map;
-    uint32_t relabel_map_size;
-    /* OUT */
-    XEN_GUEST_HANDLE_64(void) err_array;
-    uint32_t errarray_size;
-};
-
-/* future interface to Xen */
-struct xen_acmctl {
-    uint32_t cmd;
-    uint32_t interface_version;
-    union {
-        struct acm_setpolicy     setpolicy;
-        struct acm_getpolicy     getpolicy;
-        struct acm_dumpstats     dumpstats;
-        struct acm_getssid       getssid;
-        struct acm_getdecision   getdecision;
-        struct acm_change_policy change_policy;
-        struct acm_relabel_doms  relabel_doms;
-    } u;
-};
-
-typedef struct xen_acmctl xen_acmctl_t;
-DEFINE_XEN_GUEST_HANDLE(xen_acmctl_t);
-
-#endif /* __XEN_PUBLIC_ACM_OPS_H__ */
-
-/*
- * Local variables:
- * mode: C
- * c-set-style: "BSD"
- * c-basic-offset: 4
- * tab-width: 4
- * indent-tabs-mode: nil
- * End:
- */
diff -r fa4d44c9d9f6 -r 7e7e0ea6a0bb xen/include/public/xsm/acm.h
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/xen/include/public/xsm/acm.h      Fri Aug 31 12:05:07 2007 +0100
@@ -0,0 +1,229 @@
+/*
+ * acm.h: Xen access control module interface defintions
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ *
+ * Reiner Sailer <sailer@xxxxxxxxxxxxxx>
+ * Copyright (c) 2005, International Business Machines Corporation.
+ */
+
+#ifndef _XEN_PUBLIC_ACM_H
+#define _XEN_PUBLIC_ACM_H
+
+#include "../xen.h"
+
+/* if ACM_DEBUG defined, all hooks should
+ * print a short trace message (comment it out
+ * when not in testing mode )
+ */
+/* #define ACM_DEBUG */
+
+#ifdef ACM_DEBUG
+#  define printkd(fmt, args...) printk(fmt,## args)
+#else
+#  define printkd(fmt, args...)
+#endif
+
+/* default ssid reference value if not supplied */
+#define ACM_DEFAULT_SSID  0x0
+#define ACM_DEFAULT_LOCAL_SSID  0x0
+
+/* Internal ACM ERROR types */
+#define ACM_OK     0
+#define ACM_UNDEF   -1
+#define ACM_INIT_SSID_ERROR  -2
+#define ACM_INIT_SOID_ERROR  -3
+#define ACM_ERROR          -4
+
+/* External ACCESS DECISIONS */
+#define ACM_ACCESS_PERMITTED        0
+#define ACM_ACCESS_DENIED           -111
+#define ACM_NULL_POINTER_ERROR      -200
+
+/*
+   Error codes reported in when trying to test for a new policy
+   These error codes are reported in an array of tuples where
+   each error code is followed by a parameter describing the error
+   more closely, such as a domain id.
+*/
+#define ACM_EVTCHN_SHARING_VIOLATION       0x100
+#define ACM_GNTTAB_SHARING_VIOLATION       0x101
+#define ACM_DOMAIN_LOOKUP                  0x102
+#define ACM_CHWALL_CONFLICT                0x103
+#define ACM_SSIDREF_IN_USE                 0x104
+
+
+/* primary policy in lower 4 bits */
+#define ACM_NULL_POLICY 0
+#define ACM_CHINESE_WALL_POLICY 1
+#define ACM_SIMPLE_TYPE_ENFORCEMENT_POLICY 2
+#define ACM_POLICY_UNDEFINED 15
+
+/* combinations have secondary policy component in higher 4bit */
+#define ACM_CHINESE_WALL_AND_SIMPLE_TYPE_ENFORCEMENT_POLICY \
+    ((ACM_SIMPLE_TYPE_ENFORCEMENT_POLICY << 4) | ACM_CHINESE_WALL_POLICY)
+
+/* policy: */
+#define ACM_POLICY_NAME(X) \
+ ((X) == (ACM_NULL_POLICY)) ? "NULL" :                        \
+    ((X) == (ACM_CHINESE_WALL_POLICY)) ? "CHINESE WALL" :        \
+    ((X) == (ACM_SIMPLE_TYPE_ENFORCEMENT_POLICY)) ? "SIMPLE TYPE ENFORCEMENT" 
: \
+    ((X) == (ACM_CHINESE_WALL_AND_SIMPLE_TYPE_ENFORCEMENT_POLICY)) ? "CHINESE 
WALL AND SIMPLE TYPE ENFORCEMENT" : \
+     "UNDEFINED"
+
+/* the following policy versions must be increased
+ * whenever the interpretation of the related
+ * policy's data structure changes
+ */
+#define ACM_POLICY_VERSION 3
+#define ACM_CHWALL_VERSION 1
+#define ACM_STE_VERSION  1
+
+/* defines a ssid reference used by xen */
+typedef uint32_t ssidref_t;
+
+/* hooks that are known to domains */
+#define ACMHOOK_none          0
+#define ACMHOOK_sharing       1
+#define ACMHOOK_authorization 2
+
+/* -------security policy relevant type definitions-------- */
+
+/* type identifier; compares to "equal" or "not equal" */
+typedef uint16_t domaintype_t;
+
+/* CHINESE WALL POLICY DATA STRUCTURES
+ *
+ * current accumulated conflict type set:
+ * When a domain is started and has a type that is in
+ * a conflict set, the conflicting types are incremented in
+ * the aggregate set. When a domain is destroyed, the 
+ * conflicting types to its type are decremented.
+ * If a domain has multiple types, this procedure works over
+ * all those types.
+ *
+ * conflict_aggregate_set[i] holds the number of
+ *   running domains that have a conflict with type i.
+ *
+ * running_types[i] holds the number of running domains
+ *        that include type i in their ssidref-referenced type set
+ *
+ * conflict_sets[i][j] is "0" if type j has no conflict
+ *    with type i and is "1" otherwise.
+ */
+/* high-16 = version, low-16 = check magic */
+#define ACM_MAGIC  0x0001debc
+
+/* each offset in bytes from start of the struct they
+ * are part of */
+
+/* V3 of the policy buffer aded a version structure */
+struct acm_policy_version
+{
+    uint32_t major;
+    uint32_t minor;
+};
+
+
+/* each buffer consists of all policy information for
+ * the respective policy given in the policy code
+ *
+ * acm_policy_buffer, acm_chwall_policy_buffer,
+ * and acm_ste_policy_buffer need to stay 32-bit aligned
+ * because we create binary policies also with external
+ * tools that assume packed representations (e.g. the java tool)
+ */
+struct acm_policy_buffer {
+    uint32_t magic;
+    uint32_t policy_version; /* ACM_POLICY_VERSION */
+    uint32_t len;
+    uint32_t policy_reference_offset;
+    uint32_t primary_policy_code;
+    uint32_t primary_buffer_offset;
+    uint32_t secondary_policy_code;
+    uint32_t secondary_buffer_offset;
+    struct acm_policy_version xml_pol_version; /* add in V3 */
+};
+
+
+struct acm_policy_reference_buffer {
+    uint32_t len;
+};
+
+struct acm_chwall_policy_buffer {
+    uint32_t policy_version; /* ACM_CHWALL_VERSION */
+    uint32_t policy_code;
+    uint32_t chwall_max_types;
+    uint32_t chwall_max_ssidrefs;
+    uint32_t chwall_max_conflictsets;
+    uint32_t chwall_ssid_offset;
+    uint32_t chwall_conflict_sets_offset;
+    uint32_t chwall_running_types_offset;
+    uint32_t chwall_conflict_aggregate_offset;
+};
+
+struct acm_ste_policy_buffer {
+    uint32_t policy_version; /* ACM_STE_VERSION */
+    uint32_t policy_code;
+    uint32_t ste_max_types;
+    uint32_t ste_max_ssidrefs;
+    uint32_t ste_ssid_offset;
+};
+
+struct acm_stats_buffer {
+    uint32_t magic;
+    uint32_t len;
+    uint32_t primary_policy_code;
+    uint32_t primary_stats_offset;
+    uint32_t secondary_policy_code;
+    uint32_t secondary_stats_offset;
+};
+
+struct acm_ste_stats_buffer {
+    uint32_t ec_eval_count;
+    uint32_t gt_eval_count;
+    uint32_t ec_denied_count;
+    uint32_t gt_denied_count;
+    uint32_t ec_cachehit_count;
+    uint32_t gt_cachehit_count;
+};
+
+struct acm_ssid_buffer {
+    uint32_t len;
+    ssidref_t ssidref;
+    uint32_t policy_reference_offset;
+    uint32_t primary_policy_code;
+    uint32_t primary_max_types;
+    uint32_t primary_types_offset;
+    uint32_t secondary_policy_code;
+    uint32_t secondary_max_types;
+    uint32_t secondary_types_offset;
+};
+
+#endif
+
+/*
+ * Local variables:
+ * mode: C
+ * c-set-style: "BSD"
+ * c-basic-offset: 4
+ * tab-width: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff -r fa4d44c9d9f6 -r 7e7e0ea6a0bb xen/include/public/xsm/acm_ops.h
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/xen/include/public/xsm/acm_ops.h  Fri Aug 31 12:05:07 2007 +0100
@@ -0,0 +1,159 @@
+/*
+ * acm_ops.h: Xen access control module hypervisor commands
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ *
+ * Reiner Sailer <sailer@xxxxxxxxxxxxxx>
+ * Copyright (c) 2005,2006 International Business Machines Corporation.
+ */
+
+#ifndef __XEN_PUBLIC_ACM_OPS_H__
+#define __XEN_PUBLIC_ACM_OPS_H__
+
+#include "../xen.h"
+#include "acm.h"
+
+/*
+ * Make sure you increment the interface version whenever you modify this file!
+ * This makes sure that old versions of acm tools will stop working in a
+ * well-defined way (rather than crashing the machine, for instance).
+ */
+#define ACM_INTERFACE_VERSION   0xAAAA000A
+
+/************************************************************************/
+
+/*
+ * Prototype for this hypercall is:
+ *  int acm_op(int cmd, void *args)
+ * @cmd  == ACMOP_??? (access control module operation).
+ * @args == Operation-specific extra arguments (NULL if none).
+ */
+
+
+#define ACMOP_setpolicy         1
+struct acm_setpolicy {
+    /* IN */
+    XEN_GUEST_HANDLE_64(void) pushcache;
+    uint32_t pushcache_size;
+};
+
+
+#define ACMOP_getpolicy         2
+struct acm_getpolicy {
+    /* IN */
+    XEN_GUEST_HANDLE_64(void) pullcache;
+    uint32_t pullcache_size;
+};
+
+
+#define ACMOP_dumpstats         3
+struct acm_dumpstats {
+    /* IN */
+    XEN_GUEST_HANDLE_64(void) pullcache;
+    uint32_t pullcache_size;
+};
+
+
+#define ACMOP_getssid           4
+#define ACM_GETBY_ssidref  1
+#define ACM_GETBY_domainid 2
+struct acm_getssid {
+    /* IN */
+    uint32_t get_ssid_by; /* ACM_GETBY_* */
+    union {
+        domaintype_t domainid;
+        ssidref_t    ssidref;
+    } id;
+    XEN_GUEST_HANDLE_64(void) ssidbuf;
+    uint32_t ssidbuf_size;
+};
+
+#define ACMOP_getdecision      5
+struct acm_getdecision {
+    /* IN */
+    uint32_t get_decision_by1; /* ACM_GETBY_* */
+    uint32_t get_decision_by2; /* ACM_GETBY_* */
+    union {
+        domaintype_t domainid;
+        ssidref_t    ssidref;
+    } id1;
+    union {
+        domaintype_t domainid;
+        ssidref_t    ssidref;
+    } id2;
+    uint32_t hook;
+    /* OUT */
+    uint32_t acm_decision;
+};
+
+
+#define ACMOP_chgpolicy        6
+struct acm_change_policy {
+    /* IN */
+    XEN_GUEST_HANDLE_64(void) policy_pushcache;
+    uint32_t policy_pushcache_size;
+    XEN_GUEST_HANDLE_64(void) del_array;
+    uint32_t delarray_size;
+    XEN_GUEST_HANDLE_64(void) chg_array;
+    uint32_t chgarray_size;
+    /* OUT */
+    /* array with error code */
+    XEN_GUEST_HANDLE_64(void) err_array;
+    uint32_t errarray_size;
+};
+
+#define ACMOP_relabeldoms       7
+struct acm_relabel_doms {
+    /* IN */
+    XEN_GUEST_HANDLE_64(void) relabel_map;
+    uint32_t relabel_map_size;
+    /* OUT */
+    XEN_GUEST_HANDLE_64(void) err_array;
+    uint32_t errarray_size;
+};
+
+/* future interface to Xen */
+struct xen_acmctl {
+    uint32_t cmd;
+    uint32_t interface_version;
+    union {
+        struct acm_setpolicy     setpolicy;
+        struct acm_getpolicy     getpolicy;
+        struct acm_dumpstats     dumpstats;
+        struct acm_getssid       getssid;
+        struct acm_getdecision   getdecision;
+        struct acm_change_policy change_policy;
+        struct acm_relabel_doms  relabel_doms;
+    } u;
+};
+
+typedef struct xen_acmctl xen_acmctl_t;
+DEFINE_XEN_GUEST_HANDLE(xen_acmctl_t);
+
+#endif /* __XEN_PUBLIC_ACM_OPS_H__ */
+
+/*
+ * Local variables:
+ * mode: C
+ * c-set-style: "BSD"
+ * c-basic-offset: 4
+ * tab-width: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff -r fa4d44c9d9f6 -r 7e7e0ea6a0bb xen/include/xen/sched.h
--- a/xen/include/xen/sched.h   Fri Aug 31 11:41:49 2007 +0100
+++ b/xen/include/xen/sched.h   Fri Aug 31 12:05:07 2007 +0100
@@ -10,7 +10,7 @@
 #include <public/xen.h>
 #include <public/domctl.h>
 #include <public/vcpu.h>
-#include <public/acm.h>
+#include <public/xsm/acm.h>
 #include <xen/time.h>
 #include <xen/timer.h>
 #include <xen/grant_table.h>
@@ -63,6 +63,9 @@ struct evtchn
         u16 pirq;      /* state == ECS_PIRQ */
         u16 virq;      /* state == ECS_VIRQ */
     } u;
+#ifdef FLASK_ENABLE
+    void *ssid;
+#endif
 };
 
 int  evtchn_init(struct domain *d);
diff -r fa4d44c9d9f6 -r 7e7e0ea6a0bb xen/include/xsm/acm/acm_core.h
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/xen/include/xsm/acm/acm_core.h    Fri Aug 31 12:05:07 2007 +0100
@@ -0,0 +1,196 @@
+/****************************************************************
+ * acm_core.h 
+ * 
+ * Copyright (C) 2005 IBM Corporation
+ *
+ * Author:
+ * Reiner Sailer <sailer@xxxxxxxxxxxxxx>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation, version 2 of the
+ * License.
+ *
+ * sHype header file describing core data types and constants
+ *    for the access control module and relevant policies
+ *
+ */
+
+#ifndef _ACM_CORE_H
+#define _ACM_CORE_H
+
+#include <xen/spinlock.h>
+#include <xen/list.h>
+#include <public/xsm/acm.h>
+#include <public/xsm/acm_ops.h>
+#include <xsm/acm/acm_endian.h>
+
+#define ACM_DEFAULT_SECURITY_POLICY \
+        ACM_CHINESE_WALL_AND_SIMPLE_TYPE_ENFORCEMENT_POLICY
+
+/* Xen-internal representation of the binary policy */
+struct acm_binary_policy {
+    char *policy_reference_name;
+    u16 primary_policy_code;
+    u16 secondary_policy_code;
+    struct acm_policy_version xml_pol_version;
+};
+
+struct chwall_binary_policy {
+    u32 max_types;
+    u32 max_ssidrefs;
+    u32 max_conflictsets;
+    domaintype_t *ssidrefs;     /* [max_ssidrefs][max_types]  */
+    domaintype_t *conflict_aggregate_set;  /* [max_types]      */
+    domaintype_t *running_types;    /* [max_types]      */
+    domaintype_t *conflict_sets;   /* [max_conflictsets][max_types]*/
+};
+
+struct ste_binary_policy {
+    u32 max_types;
+    u32 max_ssidrefs;
+    domaintype_t *ssidrefs;     /* [max_ssidrefs][max_types]  */
+    atomic_t ec_eval_count, gt_eval_count;
+    atomic_t ec_denied_count, gt_denied_count;
+    atomic_t ec_cachehit_count, gt_cachehit_count;
+};
+
+/* global acm policy */
+extern u16 acm_active_security_policy;
+extern struct acm_binary_policy acm_bin_pol;
+extern struct chwall_binary_policy chwall_bin_pol;
+extern struct ste_binary_policy ste_bin_pol;
+/* use the lock when reading / changing binary policy ! */
+extern rwlock_t acm_bin_pol_rwlock;
+extern rwlock_t ssid_list_rwlock;
+
+/* subject and object type definitions */
+#define ACM_DATATYPE_domain 1
+
+/* defines number of access decisions to other domains can be cached
+ * one entry per domain, TE does not distinguish evtchn or grant_table */
+#define ACM_TE_CACHE_SIZE 8
+#define ACM_STE_valid 0
+#define ACM_STE_free  1
+
+/* cache line:
+ * if cache_line.valid==ACM_STE_valid, then
+ *    STE decision is cached as "permitted" 
+ *                 on domain cache_line.id
+ */
+struct acm_ste_cache_line {
+    int valid; /* ACM_STE_* */
+    domid_t id;
+};
+
+/* general definition of a subject security id */
+struct acm_ssid_domain {
+    struct list_head node; /* all are chained together */
+    int datatype;          /* type of subject (e.g., partition): 
ACM_DATATYPE_* */
+    ssidref_t ssidref;     /* combined security reference */
+    ssidref_t old_ssidref; /* holds previous value of ssidref during 
relabeling */
+    void *primary_ssid;    /* primary policy ssid part (e.g. chinese wall) */
+    void *secondary_ssid;  /* secondary policy ssid part (e.g. type 
enforcement) */
+    struct domain *subject;/* backpointer to subject structure */
+    domid_t domainid;      /* replicate id */
+};
+
+/* chinese wall ssid type */
+struct chwall_ssid {
+    ssidref_t chwall_ssidref;
+};
+
+/* simple type enforcement ssid type */
+struct ste_ssid {
+    ssidref_t ste_ssidref;
+    struct acm_ste_cache_line ste_cache[ACM_TE_CACHE_SIZE]; /* decision cache 
*/
+};
+
+/* macros to access ssidref for primary / secondary policy 
+ * primary ssidref   = lower 16 bit
+ *  secondary ssidref = higher 16 bit
+ */
+#define ACM_PRIMARY(ssidref) \
+ ((ssidref) & 0xffff)
+
+#define ACM_SECONDARY(ssidref) \
+ ((ssidref) >> 16)
+
+#define GET_SSIDREF(POLICY, ssidref) \
+ ((POLICY) == acm_bin_pol.primary_policy_code) ? \
+ ACM_PRIMARY(ssidref) : ACM_SECONDARY(ssidref)
+
+/* macros to access ssid pointer for primary / secondary policy */
+#define GET_SSIDP(POLICY, ssid) \
+ ((POLICY) == acm_bin_pol.primary_policy_code) ? \
+ ((ssid)->primary_ssid) : ((ssid)->secondary_ssid)
+
+#define ACM_INVALID_SSIDREF  (0xffffffff)
+
+struct acm_sized_buffer
+{
+    uint32_t *array;
+    uint num_items;
+    uint position;
+};
+
+static inline int acm_array_append_tuple(struct acm_sized_buffer *buf,
+                                         uint32_t a, uint32_t b)
+{
+    uint i;
+    if (buf == NULL)
+        return 0;
+
+    i = buf->position;
+
+    if ((i + 2) > buf->num_items)
+        return 0;
+
+    buf->array[i]   = cpu_to_be32(a);
+    buf->array[i+1] = cpu_to_be32(b);
+    buf->position += 2;
+    return 1;
+}
+
+/* protos */
+int acm_init_domain_ssid(struct domain *, ssidref_t ssidref);
+void acm_free_domain_ssid(struct acm_ssid_domain *ssid);
+int acm_init_binary_policy(u32 policy_code);
+int acm_set_policy(XEN_GUEST_HANDLE_64(void) buf, u32 buf_size);
+int do_acm_set_policy(void *buf, u32 buf_size, int is_bootpolicy,
+                      struct acm_sized_buffer *, struct acm_sized_buffer *,
+                      struct acm_sized_buffer *);
+int acm_get_policy(XEN_GUEST_HANDLE_64(void) buf, u32 buf_size);
+int acm_dump_statistics(XEN_GUEST_HANDLE_64(void) buf, u16 buf_size);
+int acm_get_ssid(ssidref_t ssidref, XEN_GUEST_HANDLE_64(void) buf, u16 
buf_size);
+int acm_get_decision(ssidref_t ssidref1, ssidref_t ssidref2, u32 hook);
+int acm_set_policy_reference(u8 * buf, u32 buf_size);
+int acm_dump_policy_reference(u8 *buf, u32 buf_size);
+int acm_change_policy(struct acm_change_policy *);
+int acm_relabel_domains(struct acm_relabel_doms *);
+int do_chwall_init_state_curr(struct acm_sized_buffer *);
+int do_ste_init_state_curr(struct acm_sized_buffer *);
+
+/* variables */
+extern ssidref_t dom0_chwall_ssidref;
+extern ssidref_t dom0_ste_ssidref;
+#define ACM_MAX_NUM_TYPES   (256)
+
+/* traversing the list of ssids */
+extern struct list_head ssid_list;
+#define for_each_acmssid( N )                               \
+   for ( N =  (struct acm_ssid_domain *)ssid_list.next;     \
+         N != (struct acm_ssid_domain *)&ssid_list;         \
+         N =  (struct acm_ssid_domain *)N->node.next     )
+
+#endif
+
+/*
+ * Local variables:
+ * mode: C
+ * c-set-style: "BSD"
+ * c-basic-offset: 4
+ * tab-width: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff -r fa4d44c9d9f6 -r 7e7e0ea6a0bb xen/include/xsm/acm/acm_endian.h
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/xen/include/xsm/acm/acm_endian.h  Fri Aug 31 12:05:07 2007 +0100
@@ -0,0 +1,69 @@
+/****************************************************************
+ * acm_endian.h 
+ * 
+ * Copyright (C) 2005 IBM Corporation
+ *
+ * Author:
+ * Stefan Berger <stefanb@xxxxxxxxxxxxxx>
+ * 
+ * Contributions:
+ * Reiner Sailer <sailer@xxxxxxxxxxxxxx>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation, version 2 of the
+ * License.
+ *
+ * sHype header file defining endian-dependent functions for the
+ * big-endian policy interface
+ *
+ */
+
+#ifndef _ACM_ENDIAN_H
+#define _ACM_ENDIAN_H
+
+#include <asm/byteorder.h>
+
+static inline void arrcpy16(u16 *dest, const u16 *src, size_t n)
+{
+    unsigned int i;
+    for ( i = 0; i < n; i++ )
+        dest[i] = cpu_to_be16(src[i]);
+}
+
+static inline void arrcpy32(u32 *dest, const u32 *src, size_t n)
+{
+    unsigned int i;
+    for ( i = 0; i < n; i++ )
+        dest[i] = cpu_to_be32(src[i]);
+}
+
+static inline void arrcpy(
+    void *dest, const void *src, unsigned int elsize, size_t n)
+{
+    switch ( elsize )
+    {
+    case sizeof(u16):
+        arrcpy16((u16 *)dest, (u16 *)src, n);
+        break;
+
+    case sizeof(u32):
+        arrcpy32((u32 *)dest, (u32 *)src, n);
+        break;
+
+    default:
+        memcpy(dest, src, elsize*n);
+    }
+}
+
+#endif
+
+/*
+ * Local variables:
+ * mode: C
+ * c-set-style: "BSD"
+ * c-basic-offset: 4
+ * tab-width: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff -r fa4d44c9d9f6 -r 7e7e0ea6a0bb xen/include/xsm/acm/acm_hooks.h
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/xen/include/xsm/acm/acm_hooks.h   Fri Aug 31 12:05:07 2007 +0100
@@ -0,0 +1,349 @@
+/****************************************************************
+ * acm_hooks.h 
+ * 
+ * Copyright (C) 2005 IBM Corporation
+ *
+ * Author:
+ * Reiner Sailer <sailer@xxxxxxxxxxxxxx>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation, version 2 of the
+ * License.
+ *
+ * acm header file implementing the global (policy-independent)
+ *      sHype hooks that are called throughout Xen.
+ * 
+ */
+
+#ifndef _ACM_HOOKS_H
+#define _ACM_HOOKS_H
+
+#include <xen/config.h>
+#include <xen/errno.h>
+#include <xen/types.h>
+#include <xen/lib.h>
+#include <xen/delay.h>
+#include <xen/sched.h>
+#include <xen/multiboot.h>
+#include <public/xsm/acm.h>
+#include <xsm/acm/acm_core.h>
+#include <public/domctl.h>
+#include <public/event_channel.h>
+#include <asm/current.h>
+
+/*
+ * HOOK structure and meaning (justifies a few words about our model):
+ * 
+ * General idea: every policy-controlled system operation is reflected in a 
+ *               transaction in the system's security state
+ *
+ *      Keeping the security state consistent requires "atomic" transactions.
+ *      The name of the hooks to place around policy-controlled transactions
+ *      reflects this. If authorizations do not involve security state changes,
+ *      then and only then POST and FAIL hooks remain empty since we don't care
+ *      about the eventual outcome of the operation from a security viewpoint.
+ *
+ *      PURPOSE of hook types:
+ *      ======================
+ *      PRE-Hooks
+ *       a) general authorization to guard a controlled system operation
+ *       b) prepare security state change
+ *          (means: fail hook must be able to "undo" this)
+ *
+ *      POST-Hooks
+ *       a) commit prepared state change
+ *
+ *      FAIL-Hooks
+ *       a) roll-back prepared security state change from PRE-Hook
+ *
+ *
+ *      PLACEMENT of hook types:
+ *      ========================
+ *      PRE-Hooks must be called before a guarded/controlled system operation
+ *      is started. They return ACM_ACCESS_PERMITTED, ACM_ACCESS_DENIED or
+ *      error. Operation must be aborted if return is not ACM_ACCESS_PERMITTED.
+ *
+ *      POST-Hooks must be called after a successful system operation.
+ *      There is no return value: commit never fails.
+ *
+ *      FAIL-Hooks must be called:
+ *       a) if system transaction (operation) fails after calling the PRE-hook
+ *       b) if another (secondary) policy denies access in its PRE-Hook
+ *          (policy layering is useful but requires additional handling)
+ *
+ * Hook model from a security transaction viewpoint:
+ *   start-sys-ops--> prepare ----succeed-----> commit --> sys-ops success
+ *                   (pre-hook)  \           (post-hook)
+ *                                \
+ *                               fail
+ *                                   \
+ *                                    \
+ *                                  roll-back
+ *                                 (fail-hook)
+ *                                        \
+ *                                       sys-ops error
+ *
+ */
+
+struct acm_operations {
+    /* policy management functions (must always be defined!) */
+    int  (*init_domain_ssid)           (void **ssid, ssidref_t ssidref);
+    void (*free_domain_ssid)           (void *ssid);
+    int  (*dump_binary_policy)         (u8 *buffer, u32 buf_size);
+    int  (*test_binary_policy)         (u8 *buffer, u32 buf_size,
+                                        int is_bootpolicy,
+                                        struct acm_sized_buffer *);
+    int  (*set_binary_policy)          (u8 *buffer, u32 buf_size);
+    int  (*dump_statistics)            (u8 *buffer, u16 buf_size);
+    int  (*dump_ssid_types)            (ssidref_t ssidref, u8 *buffer, u16 
buf_size);
+    /* domain management control hooks (can be NULL) */
+    int  (*domain_create)              (void *subject_ssid, ssidref_t ssidref,
+                                        domid_t domid);
+    void (*domain_destroy)             (void *object_ssid, struct domain *d);
+    /* event channel control hooks  (can be NULL) */
+    int  (*pre_eventchannel_unbound)      (domid_t id1, domid_t id2);
+    void (*fail_eventchannel_unbound)     (domid_t id1, domid_t id2);
+    int  (*pre_eventchannel_interdomain)  (domid_t id);
+    void (*fail_eventchannel_interdomain) (domid_t id);
+    /* grant table control hooks (can be NULL)  */
+    int  (*pre_grant_map_ref)          (domid_t id);
+    void (*fail_grant_map_ref)         (domid_t id);
+    int  (*pre_grant_setup)            (domid_t id);
+    void (*fail_grant_setup)           (domid_t id);
+    /* generic domain-requested decision hooks (can be NULL) */
+    int (*sharing)                     (ssidref_t ssidref1,
+                                        ssidref_t ssidref2);
+    int (*authorization)               (ssidref_t ssidref1,
+                                        ssidref_t ssidref2);
+    /* determine whether the default policy is installed */
+    int (*is_default_policy)           (void);
+};
+
+/* global variables */
+extern struct acm_operations *acm_primary_ops;
+extern struct acm_operations *acm_secondary_ops;
+
+/* if ACM_TRACE_MODE defined, all hooks should
+ * print a short trace message */
+/* #define ACM_TRACE_MODE */
+
+#ifdef ACM_TRACE_MODE
+# define traceprintk(fmt, args...) printk(fmt,## args)
+#else
+# define traceprintk(fmt, args...)
+#endif
+
+
+#ifndef ACM_SECURITY
+
+static inline int acm_pre_eventchannel_unbound(domid_t id1, domid_t id2)
+{ return 0; }
+static inline int acm_pre_eventchannel_interdomain(domid_t id)
+{ return 0; }
+static inline int acm_pre_grant_map_ref(domid_t id) 
+{ return 0; }
+static inline int acm_pre_grant_setup(domid_t id) 
+{ return 0; }
+static inline int acm_is_policy(char *buf, unsigned long len)
+{ return 0; }
+static inline int acm_sharing(ssidref_t ssidref1, ssidref_t ssidref2)
+{ return 0; }
+static inline int acm_authorization(ssidref_t ssidref1, ssidref_t ssidref2)
+{ return 0; }
+static inline int acm_domain_create(struct domain *d, ssidref_t ssidref)
+{ return 0; }
+static inline void acm_domain_destroy(struct domain *d)
+{ return; }
+
+#define DOM0_SSIDREF 0x0
+
+#else
+
+static inline void acm_domain_ssid_onto_list(struct acm_ssid_domain *ssid)
+{
+    write_lock(&ssid_list_rwlock);
+    list_add(&ssid->node, &ssid_list);
+    write_unlock(&ssid_list_rwlock);
+}
+
+static inline void acm_domain_ssid_off_list(struct acm_ssid_domain *ssid)
+{
+    write_lock(&ssid_list_rwlock);
+    list_del(&ssid->node);
+    write_unlock(&ssid_list_rwlock);
+}
+
+static inline int acm_pre_eventchannel_unbound(domid_t id1, domid_t id2)
+{
+    if ((acm_primary_ops->pre_eventchannel_unbound != NULL) && 
+        acm_primary_ops->pre_eventchannel_unbound(id1, id2))
+        return ACM_ACCESS_DENIED;
+    else if ((acm_secondary_ops->pre_eventchannel_unbound != NULL) && 
+             acm_secondary_ops->pre_eventchannel_unbound(id1, id2)) {
+        /* roll-back primary */
+        if (acm_primary_ops->fail_eventchannel_unbound != NULL)
+            acm_primary_ops->fail_eventchannel_unbound(id1, id2);
+        return ACM_ACCESS_DENIED;
+    } else
+        return ACM_ACCESS_PERMITTED;
+}
+
+static inline int acm_pre_eventchannel_interdomain(domid_t id)
+{
+    if ((acm_primary_ops->pre_eventchannel_interdomain != NULL) &&
+        acm_primary_ops->pre_eventchannel_interdomain(id))
+        return ACM_ACCESS_DENIED;
+    else if ((acm_secondary_ops->pre_eventchannel_interdomain != NULL) &&
+             acm_secondary_ops->pre_eventchannel_interdomain(id)) {
+        /* roll-back primary */
+        if (acm_primary_ops->fail_eventchannel_interdomain != NULL)
+            acm_primary_ops->fail_eventchannel_interdomain(id);
+        return ACM_ACCESS_DENIED;
+    } else
+        return ACM_ACCESS_PERMITTED;
+}
+
+
+static inline int acm_pre_grant_map_ref(domid_t id)
+{
+    if ( (acm_primary_ops->pre_grant_map_ref != NULL) &&
+         acm_primary_ops->pre_grant_map_ref(id) )
+    {
+        return ACM_ACCESS_DENIED;
+    }
+    else if ( (acm_secondary_ops->pre_grant_map_ref != NULL) &&
+              acm_secondary_ops->pre_grant_map_ref(id) )
+    {
+        /* roll-back primary */
+        if ( acm_primary_ops->fail_grant_map_ref != NULL )
+            acm_primary_ops->fail_grant_map_ref(id);
+        return ACM_ACCESS_DENIED;
+    }
+    else
+    {
+        return ACM_ACCESS_PERMITTED;
+    }
+}
+
+static inline int acm_pre_grant_setup(domid_t id)
+{
+    if ( (acm_primary_ops->pre_grant_setup != NULL) &&
+         acm_primary_ops->pre_grant_setup(id) )
+    {
+        return ACM_ACCESS_DENIED;
+    }
+    else if ( (acm_secondary_ops->pre_grant_setup != NULL) &&
+              acm_secondary_ops->pre_grant_setup(id) )
+    {
+        /* roll-back primary */
+        if (acm_primary_ops->fail_grant_setup != NULL)
+            acm_primary_ops->fail_grant_setup(id);
+        return ACM_ACCESS_DENIED;
+    }
+    else
+    {
+        return ACM_ACCESS_PERMITTED;
+    }
+}
+
+
+static inline void acm_domain_destroy(struct domain *d)
+{
+    void *ssid = d->ssid;
+    if (ssid != NULL) {
+        if (acm_primary_ops->domain_destroy != NULL)
+            acm_primary_ops->domain_destroy(ssid, d);
+        if (acm_secondary_ops->domain_destroy != NULL)
+            acm_secondary_ops->domain_destroy(ssid, d);
+        /* free security ssid for the destroyed domain (also if null policy */
+        acm_domain_ssid_off_list(ssid);
+        acm_free_domain_ssid((struct acm_ssid_domain *)(ssid));
+    }
+}
+
+
+static inline int acm_domain_create(struct domain *d, ssidref_t ssidref)
+{
+    void *subject_ssid = current->domain->ssid;
+    domid_t domid = d->domain_id;
+    int rc;
+
+    read_lock(&acm_bin_pol_rwlock);
+    /*
+       To be called when a domain is created; returns '0' if the
+       domain is allowed to be created, != '0' if not.
+     */
+    rc = acm_init_domain_ssid(d, ssidref);
+    if (rc != ACM_OK)
+        goto error_out;
+
+    if ((acm_primary_ops->domain_create != NULL) &&
+        acm_primary_ops->domain_create(subject_ssid, ssidref, domid)) {
+        rc = ACM_ACCESS_DENIED;
+    } else if ((acm_secondary_ops->domain_create != NULL) &&
+                acm_secondary_ops->domain_create(subject_ssid, ssidref,
+                                                 domid)) {
+        /* roll-back primary */
+        if (acm_primary_ops->domain_destroy != NULL)
+            acm_primary_ops->domain_destroy(d->ssid, d);
+        rc = ACM_ACCESS_DENIED;
+    }
+
+    if ( rc == ACM_OK )
+    {
+        acm_domain_ssid_onto_list(d->ssid);
+    } else {
+        acm_free_domain_ssid(d->ssid);
+    }
+
+error_out:
+    read_unlock(&acm_bin_pol_rwlock);
+    return rc;
+}
+
+
+static inline int acm_sharing(ssidref_t ssidref1, ssidref_t ssidref2)
+{
+    if ((acm_primary_ops->sharing != NULL) &&
+        acm_primary_ops->sharing(ssidref1, ssidref2))
+        return ACM_ACCESS_DENIED;
+    else if ((acm_secondary_ops->sharing != NULL) &&
+             acm_secondary_ops->sharing(ssidref1, ssidref2)) {
+        return ACM_ACCESS_DENIED;
+    } else
+        return ACM_ACCESS_PERMITTED;
+}
+
+
+static inline int acm_authorization(ssidref_t ssidref1, ssidref_t ssidref2)
+{
+    if ((acm_primary_ops->authorization != NULL) &&
+        acm_primary_ops->authorization(ssidref1, ssidref2))
+        return ACM_ACCESS_DENIED;
+    else if ((acm_secondary_ops->authorization != NULL) &&
+             acm_secondary_ops->authorization(ssidref1, ssidref2)) {
+        return ACM_ACCESS_DENIED;
+    } else
+        return ACM_ACCESS_PERMITTED;
+}
+
+
+/* Return true iff buffer has an acm policy magic number.  */
+extern int acm_is_policy(char *buf, unsigned long len);
+
+#define DOM0_SSIDREF (dom0_ste_ssidref << 16 | dom0_chwall_ssidref)
+
+#endif
+
+#endif
+
+/*
+ * Local variables:
+ * mode: C
+ * c-set-style: "BSD"
+ * c-basic-offset: 4
+ * tab-width: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff -r fa4d44c9d9f6 -r 7e7e0ea6a0bb xen/xsm/acm/acm_chinesewall_hooks.c
--- a/xen/xsm/acm/acm_chinesewall_hooks.c       Fri Aug 31 11:41:49 2007 +0100
+++ b/xen/xsm/acm/acm_chinesewall_hooks.c       Fri Aug 31 12:05:07 2007 +0100
@@ -36,12 +36,11 @@
 #include <xen/lib.h>
 #include <xen/delay.h>
 #include <xen/sched.h>
-#include <public/acm.h>
+#include <public/xsm/acm.h>
 #include <asm/atomic.h>
-#include <acm/acm_core.h>
-#include <acm/acm_hooks.h>
-#include <acm/acm_endian.h>
-#include <acm/acm_core.h>
+#include <xsm/acm/acm_core.h>
+#include <xsm/acm/acm_hooks.h>
+#include <xsm/acm/acm_endian.h>
 
 ssidref_t dom0_chwall_ssidref = 0x0001;
 
diff -r fa4d44c9d9f6 -r 7e7e0ea6a0bb xen/xsm/acm/acm_core.c
--- a/xen/xsm/acm/acm_core.c    Fri Aug 31 11:41:49 2007 +0100
+++ b/xen/xsm/acm/acm_core.c    Fri Aug 31 12:05:07 2007 +0100
@@ -1,4 +1,4 @@
-/****************************************************************
+#/****************************************************************
  * acm_core.c
  * 
  * Copyright (C) 2005 IBM Corporation
@@ -29,16 +29,16 @@
 #include <xen/delay.h>
 #include <xen/sched.h>
 #include <xen/multiboot.h>
-#include <acm/acm_hooks.h>
-#include <acm/acm_endian.h>
+#include <xsm/acm/acm_hooks.h>
+#include <xsm/acm/acm_endian.h>
 #include <xsm/xsm.h>
 
 /* debug: 
- *   include/acm/acm_hooks.h defines a constant ACM_TRACE_MODE;
+ *   include/xsm/acm/acm_hooks.h defines a constant ACM_TRACE_MODE;
  *   define/undefine this constant to receive / suppress any
  *   security hook debug output of sHype
  *
- *   include/public/acm.h defines a constant ACM_DEBUG
+ *   include/public/xsm/acm.h defines a constant ACM_DEBUG
  *   define/undefine this constant to receive non-hook-related
  *   debug output.
  */
diff -r fa4d44c9d9f6 -r 7e7e0ea6a0bb xen/xsm/acm/acm_null_hooks.c
--- a/xen/xsm/acm/acm_null_hooks.c      Fri Aug 31 11:41:49 2007 +0100
+++ b/xen/xsm/acm/acm_null_hooks.c      Fri Aug 31 12:05:07 2007 +0100
@@ -12,7 +12,7 @@
  * License.
  */
 
-#include <acm/acm_hooks.h>
+#include <xsm/acm/acm_hooks.h>
 
 static int
 null_init_domain_ssid(void **ssid, ssidref_t ssidref)
diff -r fa4d44c9d9f6 -r 7e7e0ea6a0bb xen/xsm/acm/acm_ops.c
--- a/xen/xsm/acm/acm_ops.c     Fri Aug 31 11:41:49 2007 +0100
+++ b/xen/xsm/acm/acm_ops.c     Fri Aug 31 12:05:07 2007 +0100
@@ -18,14 +18,14 @@
 #include <xen/types.h>
 #include <xen/lib.h>
 #include <xen/mm.h>
-#include <public/acm.h>
-#include <public/acm_ops.h>
+#include <public/xsm/acm.h>
+#include <public/xsm/acm_ops.h>
 #include <xen/sched.h>
 #include <xen/event.h>
 #include <xen/trace.h>
 #include <xen/console.h>
 #include <xen/guest_access.h>
-#include <acm/acm_hooks.h>
+#include <xsm/acm/acm_hooks.h>
 
 #ifndef ACM_SECURITY
 
diff -r fa4d44c9d9f6 -r 7e7e0ea6a0bb xen/xsm/acm/acm_policy.c
--- a/xen/xsm/acm/acm_policy.c  Fri Aug 31 11:41:49 2007 +0100
+++ b/xen/xsm/acm/acm_policy.c  Fri Aug 31 12:05:07 2007 +0100
@@ -28,10 +28,10 @@
 #include <xen/sched.h>
 #include <xen/guest_access.h>
 #include <public/xen.h>
-#include <acm/acm_core.h>
-#include <public/acm_ops.h>
-#include <acm/acm_hooks.h>
-#include <acm/acm_endian.h>
+#include <xsm/acm/acm_core.h>
+#include <public/xsm/acm_ops.h>
+#include <xsm/acm/acm_hooks.h>
+#include <xsm/acm/acm_endian.h>
 #include <asm/current.h>
 
 static int acm_check_deleted_ssidrefs(struct acm_sized_buffer *dels,
diff -r fa4d44c9d9f6 -r 7e7e0ea6a0bb 
xen/xsm/acm/acm_simple_type_enforcement_hooks.c
--- a/xen/xsm/acm/acm_simple_type_enforcement_hooks.c   Fri Aug 31 11:41:49 
2007 +0100
+++ b/xen/xsm/acm/acm_simple_type_enforcement_hooks.c   Fri Aug 31 12:05:07 
2007 +0100
@@ -28,10 +28,10 @@
 #include <xen/lib.h>
 #include <asm/types.h>
 #include <asm/current.h>
-#include <acm/acm_hooks.h>
 #include <asm/atomic.h>
-#include <acm/acm_endian.h>
-#include <acm/acm_core.h>
+#include <xsm/acm/acm_hooks.h>
+#include <xsm/acm/acm_endian.h>
+#include <xsm/acm/acm_core.h>
 
 ssidref_t dom0_ste_ssidref = 0x0001;
 
diff -r fa4d44c9d9f6 -r 7e7e0ea6a0bb xen/xsm/acm/acm_xsm_hooks.c
--- a/xen/xsm/acm/acm_xsm_hooks.c       Fri Aug 31 11:41:49 2007 +0100
+++ b/xen/xsm/acm/acm_xsm_hooks.c       Fri Aug 31 12:05:07 2007 +0100
@@ -20,34 +20,36 @@
  */
 
 #include <xsm/xsm.h>
-#include <acm/acm_hooks.h>
-#include <public/acm.h>
+#include <xsm/acm/acm_hooks.h>
+#include <public/xsm/acm.h>
 
-static int acm_grant_mapref (struct domain *ld, struct domain *rd,
-                                                                 uint32_t 
flags) 
+static int acm_grant_mapref(
+    struct domain *ld, struct domain *rd, uint32_t flags) 
 {
     domid_t id = rd->domain_id;
 
     return acm_pre_grant_map_ref(id);
 }
 
-static int acm_evtchn_unbound (struct domain *d1, struct evtchn *chn1, domid_t 
id2) 
+static int acm_evtchn_unbound(
+    struct domain *d1, struct evtchn *chn1, domid_t id2) 
 {
     domid_t id1 = d1->domain_id;
     
     return acm_pre_eventchannel_unbound(id1, id2);
 }
 
-static int acm_evtchn_interdomain (struct domain *d1, struct evtchn *chn1, 
-                                        struct domain *d2, struct evtchn 
*chn2) 
+static int acm_evtchn_interdomain(
+    struct domain *d1, struct evtchn *chn1, 
+    struct domain *d2, struct evtchn *chn2) 
 {
     domid_t id2 = d2->domain_id;
 
     return acm_pre_eventchannel_interdomain(id2);
 }
 
-static void acm_security_domaininfo (struct domain *d, 
-                                        struct xen_domctl_getdomaininfo *info)
+static void acm_security_domaininfo(
+    struct domain *d, struct xen_domctl_getdomaininfo *info)
 {
     if ( d->ssid != NULL )
         info->ssidref = ((struct acm_ssid_domain *)d->ssid)->ssidref;

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.