[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen-unstable] xsm: refactor IO hooks/sysctl hooks
# HG changeset patch # User Keir Fraser <keir.fraser@xxxxxxxxxx> # Date 1220523909 -3600 # Node ID 44f039c4aee498ef47103c94cc9e7b78575b0e85 # Parent 5b133625223ad0d95b80467535ff1384d6317f16 xsm: refactor IO hooks/sysctl hooks - The patch refactors the IO resource checks into the rangeset add/del code. This produces a much more architecture friendly implementation and ensures that HVM and paravirtualized guests are checked consistently. - The patch removes the following hooks in support of the refactoring of the IO resource checks: - xsm_irq_permission - xsm_iomem_permission - xsm_ioport_permission - The patch adds the following hooks in support of the refactoring of the IO resource checks: - xsm_add_range - xsm_remove_range - These IO refactoring changes are transparent to any pre-existing Flask policies. - The patch adds also adds hooks for sysctl functionality that was added since the last major XSM patch. The following hooks were added: - xsm_set_target - xsm_debug_keys - xsm_getcpuinfo - xsm_availheap - xsm_firmware_info - xsm_acpi_sleep - xsm_change_freq - xsm_getidletime - xsm_sendtrigger - xsm_test_assign_device - xsm_assign_device - xsm_deassign_device - xsm_bind_pt_irq - xsm_pin_mem_cacheattr - xsm_ext_vcpucontext Signed-off-by: George Coker <gscoker@xxxxxxxxxxxxxx> --- xen/arch/x86/domctl.c | 45 +++- xen/arch/x86/platform_hypercall.c | 16 + xen/common/domctl.c | 16 - xen/common/rangeset.c | 9 xen/common/sysctl.c | 12 + xen/include/xsm/xsm.h | 128 +++++++++-- xen/xsm/dummy.c | 124 +++++++++-- xen/xsm/flask/hooks.c | 288 +++++++++++++++++++++++--- xen/xsm/flask/include/av_perm_to_string.h | 21 + xen/xsm/flask/include/av_permissions.h | 63 +++-- xen/xsm/flask/include/flask.h | 11 xen/xsm/flask/include/initial_sid_to_string.h | 3 xen/xsm/flask/include/security.h | 6 xen/xsm/flask/ss/policydb.h | 13 - xen/xsm/flask/ss/services.c | 40 +++ 15 files changed, 655 insertions(+), 140 deletions(-) diff -r 5b133625223a -r 44f039c4aee4 xen/arch/x86/domctl.c --- a/xen/arch/x86/domctl.c Thu Sep 04 11:23:08 2008 +0100 +++ b/xen/arch/x86/domctl.c Thu Sep 04 11:25:09 2008 +0100 @@ -68,14 +68,6 @@ long arch_do_domctl( if ( unlikely((d = rcu_lock_domain_by_id(domctl->domain)) == NULL) ) break; - ret = xsm_ioport_permission(d, fp, - domctl->u.ioport_permission.allow_access); - if ( ret ) - { - rcu_unlock_domain(d); - break; - } - if ( np == 0 ) ret = 0; else if ( domctl->u.ioport_permission.allow_access ) @@ -550,6 +542,10 @@ long arch_do_domctl( if ( (d = rcu_lock_domain_by_id(domctl->domain)) == NULL ) break; + ret = xsm_sendtrigger(d); + if ( ret ) + goto sendtrigger_out; + ret = -EINVAL; if ( domctl->u.sendtrigger.vcpu >= MAX_VIRT_CPUS ) goto sendtrigger_out; @@ -628,6 +624,10 @@ long arch_do_domctl( bus = (domctl->u.assign_device.machine_bdf >> 16) & 0xff; devfn = (domctl->u.assign_device.machine_bdf >> 8) & 0xff; + ret = xsm_test_assign_device(domctl->u.assign_device.machine_bdf); + if ( ret ) + break; + if ( device_assigned(bus, devfn) ) { gdprintk(XENLOG_ERR, "XEN_DOMCTL_test_assign_device: " @@ -655,6 +655,11 @@ long arch_do_domctl( "XEN_DOMCTL_assign_device: get_domain_by_id() failed\n"); break; } + + ret = xsm_assign_device(d, domctl->u.assign_device.machine_bdf); + if ( ret ) + goto assign_device_out; + bus = (domctl->u.assign_device.machine_bdf >> 16) & 0xff; devfn = (domctl->u.assign_device.machine_bdf >> 8) & 0xff; @@ -680,6 +685,7 @@ long arch_do_domctl( "assign device (%x:%x:%x) failed\n", bus, PCI_SLOT(devfn), PCI_FUNC(devfn)); + assign_device_out: put_domain(d); } break; @@ -700,6 +706,11 @@ long arch_do_domctl( "XEN_DOMCTL_deassign_device: get_domain_by_id() failed\n"); break; } + + ret = xsm_assign_device(d, domctl->u.assign_device.machine_bdf); + if ( ret ) + goto deassign_device_out; + bus = (domctl->u.assign_device.machine_bdf >> 16) & 0xff; devfn = (domctl->u.assign_device.machine_bdf >> 8) & 0xff; @@ -720,6 +731,8 @@ long arch_do_domctl( deassign_device(d, bus, devfn); gdprintk(XENLOG_INFO, "XEN_DOMCTL_deassign_device: bdf = %x:%x:%x\n", bus, PCI_SLOT(devfn), PCI_FUNC(devfn)); + + deassign_device_out: put_domain(d); } break; @@ -733,10 +746,17 @@ long arch_do_domctl( if ( (d = rcu_lock_domain_by_id(domctl->domain)) == NULL ) break; bind = &(domctl->u.bind_pt_irq); + + ret = xsm_bind_pt_irq(d, bind); + if ( ret ) + goto bind_out; + if ( iommu_enabled ) ret = pt_irq_create_bind_vtd(d, bind); if ( ret < 0 ) gdprintk(XENLOG_ERR, "pt_irq_create_bind failed!\n"); + + bind_out: rcu_unlock_domain(d); } break; @@ -877,11 +897,16 @@ long arch_do_domctl( if ( d == NULL ) break; + ret = xsm_pin_mem_cacheattr(d); + if ( ret ) + goto pin_out; + ret = hvm_set_mem_pinned_cacheattr( d, domctl->u.pin_mem_cacheattr.start, domctl->u.pin_mem_cacheattr.end, domctl->u.pin_mem_cacheattr.type); + pin_out: rcu_unlock_domain(d); } break; @@ -899,6 +924,10 @@ long arch_do_domctl( d = rcu_lock_domain_by_id(domctl->domain); if ( d == NULL ) break; + + ret = xsm_ext_vcpucontext(d, domctl->cmd); + if ( ret ) + goto ext_vcpucontext_out; ret = -ESRCH; if ( (evc->vcpu >= MAX_VIRT_CPUS) || diff -r 5b133625223a -r 44f039c4aee4 xen/arch/x86/platform_hypercall.c --- a/xen/arch/x86/platform_hypercall.c Thu Sep 04 11:23:08 2008 +0100 +++ b/xen/arch/x86/platform_hypercall.c Thu Sep 04 11:25:09 2008 +0100 @@ -192,6 +192,10 @@ ret_t do_platform_op(XEN_GUEST_HANDLE(xe break; case XENPF_firmware_info: + ret = xsm_firmware_info(); + if ( ret ) + break; + switch ( op->u.firmware_info.type ) { case XEN_FW_DISK_INFO: { @@ -280,10 +284,18 @@ ret_t do_platform_op(XEN_GUEST_HANDLE(xe break; case XENPF_enter_acpi_sleep: + ret = xsm_acpi_sleep(); + if ( ret ) + break; + ret = acpi_enter_sleep(&op->u.enter_acpi_sleep); break; case XENPF_change_freq: + ret = xsm_change_freq(); + if ( ret ) + break; + ret = -ENOSYS; if ( cpufreq_controller != FREQCTL_dom0_kernel ) break; @@ -305,6 +317,10 @@ ret_t do_platform_op(XEN_GUEST_HANDLE(xe cpumask_t cpumap; XEN_GUEST_HANDLE(uint8) cpumap_bitmap; XEN_GUEST_HANDLE(uint64) idletimes; + + ret = xsm_getidletime(); + if ( ret ) + break; ret = -ENOSYS; if ( cpufreq_controller != FREQCTL_dom0_kernel ) diff -r 5b133625223a -r 44f039c4aee4 xen/common/domctl.c --- a/xen/common/domctl.c Thu Sep 04 11:23:08 2008 +0100 +++ b/xen/common/domctl.c Thu Sep 04 11:25:09 2008 +0100 @@ -726,16 +726,11 @@ long do_domctl(XEN_GUEST_HANDLE(xen_domc if ( d == NULL ) break; - ret = xsm_irq_permission(d, pirq, op->u.irq_permission.allow_access); - if ( ret ) - goto irq_permission_out; - if ( op->u.irq_permission.allow_access ) ret = irq_permit_access(d, pirq); else ret = irq_deny_access(d, pirq); - irq_permission_out: rcu_unlock_domain(d); } break; @@ -754,17 +749,12 @@ long do_domctl(XEN_GUEST_HANDLE(xen_domc d = rcu_lock_domain_by_id(op->domain); if ( d == NULL ) break; - - ret = xsm_iomem_permission(d, mfn, op->u.iomem_permission.allow_access); - if ( ret ) - goto iomem_permission_out; if ( op->u.iomem_permission.allow_access ) ret = iomem_permit_access(d, mfn, mfn + nr_mfns - 1); else ret = iomem_deny_access(d, mfn, mfn + nr_mfns - 1); - iomem_permission_out: rcu_unlock_domain(d); } break; @@ -810,6 +800,12 @@ long do_domctl(XEN_GUEST_HANDLE(xen_domc { put_domain(e); goto set_target_out; + } + + ret = xsm_set_target(d, e); + if ( ret ) { + put_domain(e); + goto set_target_out; } /* Hold reference on @e until we destroy @d. */ diff -r 5b133625223a -r 44f039c4aee4 xen/common/rangeset.c --- a/xen/common/rangeset.c Thu Sep 04 11:23:08 2008 +0100 +++ b/xen/common/rangeset.c Thu Sep 04 11:25:09 2008 +0100 @@ -10,6 +10,7 @@ #include <xen/sched.h> #include <xen/errno.h> #include <xen/rangeset.h> +#include <xsm/xsm.h> /* An inclusive range [s,e] and pointer to next range in ascending order. */ struct range { @@ -95,6 +96,10 @@ int rangeset_add_range( { struct range *x, *y; int rc = 0; + + rc = xsm_add_range(r->domain, r->name, s, e); + if ( rc ) + return rc; ASSERT(s <= e); @@ -164,6 +169,10 @@ int rangeset_remove_range( struct range *x, *y, *t; int rc = 0; + rc = xsm_remove_range(r->domain, r->name, s, e); + if ( rc ) + return rc; + ASSERT(s <= e); spin_lock(&r->lock); diff -r 5b133625223a -r 44f039c4aee4 xen/common/sysctl.c --- a/xen/common/sysctl.c Thu Sep 04 11:23:08 2008 +0100 +++ b/xen/common/sysctl.c Thu Sep 04 11:25:09 2008 +0100 @@ -149,6 +149,10 @@ long do_sysctl(XEN_GUEST_HANDLE(xen_sysc char c; uint32_t i; + ret = xsm_debug_keys(); + if ( ret ) + break; + for ( i = 0; i < op->u.debug_keys.nr_keys; i++ ) { if ( copy_from_guest_offset(&c, op->u.debug_keys.keys, i, 1) ) @@ -166,6 +170,10 @@ long do_sysctl(XEN_GUEST_HANDLE(xen_sysc nr_cpus = min_t(uint32_t, op->u.getcpuinfo.max_cpus, NR_CPUS); + ret = xsm_getcpuinfo(); + if ( ret ) + break; + for ( i = 0; i < nr_cpus; i++ ) { /* Assume no holes in idle-vcpu map. */ @@ -188,6 +196,10 @@ long do_sysctl(XEN_GUEST_HANDLE(xen_sysc case XEN_SYSCTL_availheap: { + ret = xsm_availheap(); + if ( ret ) + break; + op->u.availheap.avail_bytes = avail_domheap_pages_region( op->u.availheap.node, op->u.availheap.min_bitwidth, diff -r 5b133625223a -r 44f039c4aee4 xen/include/xsm/xsm.h --- a/xen/include/xsm/xsm.h Thu Sep 04 11:23:08 2008 +0100 +++ b/xen/include/xsm/xsm.h Thu Sep 04 11:25:09 2008 +0100 @@ -64,16 +64,17 @@ struct xsm_operations { int (*getvcpucontext) (struct domain *d); int (*getvcpuinfo) (struct domain *d); int (*domain_settime) (struct domain *d); + int (*set_target) (struct domain *d, struct domain *e); int (*tbufcontrol) (void); int (*readconsole) (uint32_t clear); int (*sched_id) (void); int (*setdomainmaxmem) (struct domain *d); int (*setdomainhandle) (struct domain *d); int (*setdebugging) (struct domain *d); - int (*irq_permission) (struct domain *d, uint8_t pirq, uint8_t access); - int (*iomem_permission) (struct domain *d, unsigned long mfn, - uint8_t access); int (*perfcontrol) (void); + int (*debug_keys) (void); + int (*getcpuinfo) (void); + int (*availheap) (void); int (*evtchn_unbound) (struct domain *d, struct evtchn *chn, domid_t id2); int (*evtchn_interdomain) (struct domain *d1, struct evtchn *chn1, @@ -106,13 +107,13 @@ struct xsm_operations { int (*kexec) (void); int (*schedop_shutdown) (struct domain *d1, struct domain *d2); + int (*add_range) (struct domain *d, char *name, unsigned long s, unsigned long e); + int (*remove_range) (struct domain *d, char *name, unsigned long s, unsigned long e); long (*__do_xsm_op) (XEN_GUEST_HANDLE(xsm_op_t) op); #ifdef CONFIG_X86 int (*shadow_control) (struct domain *d, uint32_t op); - int (*ioport_permission) (struct domain *d, uint32_t ioport, - uint8_t access); int (*getpageframeinfo) (struct page_info *page); int (*getmemlist) (struct domain *d); int (*hypercall_init) (struct domain *d); @@ -130,6 +131,10 @@ struct xsm_operations { int (*microcode) (void); int (*physinfo) (void); int (*platform_quirk) (uint32_t); + int (*firmware_info) (void); + int (*acpi_sleep) (void); + int (*change_freq) (void); + int (*getidletime) (void); int (*machine_memory_map) (void); int (*domain_memory_map) (struct domain *d); int (*mmu_normal_update) (struct domain *d, intpte_t fpte); @@ -137,6 +142,13 @@ struct xsm_operations { int (*update_va_mapping) (struct domain *d, l1_pgentry_t pte); int (*add_to_physmap) (struct domain *d1, struct domain *d2); int (*remove_from_physmap) (struct domain *d1, struct domain *d2); + int (*sendtrigger) (struct domain *d); + int (*test_assign_device) (uint32_t machine_bdf); + int (*assign_device) (struct domain *d, uint32_t machine_bdf); + int (*deassign_device) (struct domain *d, uint32_t machine_bdf); + int (*bind_pt_irq) (struct domain *d, struct xen_domctl_bind_pt_irq *bind); + int (*pin_mem_cacheattr) (struct domain *d); + int (*ext_vcpucontext) (struct domain *d, uint32_t cmd); #endif }; @@ -215,6 +227,11 @@ static inline int xsm_domain_settime (st return xsm_call(domain_settime(d)); } +static inline int xsm_set_target (struct domain *d, struct domain *e) +{ + return xsm_call(set_target(d, e)); +} + static inline int xsm_tbufcontrol (void) { return xsm_call(tbufcontrol()); @@ -245,21 +262,24 @@ static inline int xsm_setdebugging (stru return xsm_call(setdebugging(d)); } -static inline int xsm_irq_permission (struct domain *d, uint8_t pirq, - uint8_t access) -{ - return xsm_call(irq_permission(d, pirq, access)); -} - -static inline int xsm_iomem_permission (struct domain *d, unsigned long mfn, - uint8_t access) -{ - return xsm_call(iomem_permission(d, mfn, access)); -} - static inline int xsm_perfcontrol (void) { return xsm_call(perfcontrol()); +} + +static inline int xsm_debug_keys (void) +{ + return xsm_call(debug_keys()); +} + +static inline int xsm_availheap (void) +{ + return xsm_call(availheap()); +} + +static inline int xsm_getcpuinfo (void) +{ + return xsm_call(getcpuinfo()); } static inline int xsm_evtchn_unbound (struct domain *d1, struct evtchn *chn, @@ -385,6 +405,18 @@ static inline int xsm_schedop_shutdown ( static inline int xsm_schedop_shutdown (struct domain *d1, struct domain *d2) { return xsm_call(schedop_shutdown(d1, d2)); +} + +static inline int xsm_add_range (struct domain *d, char *name, unsigned long s, + unsigned long e) +{ + return xsm_call(add_range(d, name, s, e)); +} + +static inline int xsm_remove_range (struct domain *d, char *name, unsigned long s, + unsigned long e) +{ + return xsm_call(remove_range(d, name, s, e)); } static inline long __do_xsm_op (XEN_GUEST_HANDLE(xsm_op_t) op) @@ -413,12 +445,6 @@ static inline int xsm_shadow_control (st return xsm_call(shadow_control(d, op)); } -static inline int xsm_ioport_permission (struct domain *d, uint32_t ioport, - uint8_t access) -{ - return xsm_call(ioport_permission(d, ioport, access)); -} - static inline int xsm_getpageframeinfo (struct page_info *page) { return xsm_call(getpageframeinfo(page)); @@ -504,6 +530,26 @@ static inline int xsm_platform_quirk (ui return xsm_call(platform_quirk(quirk)); } +static inline int xsm_firmware_info (void) +{ + return xsm_call(firmware_info()); +} + +static inline int xsm_acpi_sleep (void) +{ + return xsm_call(acpi_sleep()); +} + +static inline int xsm_change_freq (void) +{ + return xsm_call(change_freq()); +} + +static inline int xsm_getidletime (void) +{ + return xsm_call(getidletime()); +} + static inline int xsm_machine_memory_map(void) { return xsm_call(machine_memory_map()); @@ -538,6 +584,42 @@ static inline int xsm_remove_from_physma { return xsm_call(remove_from_physmap(d1, d2)); } + +static inline int xsm_sendtrigger(struct domain *d) +{ + return xsm_call(sendtrigger(d)); +} + +static inline int xsm_test_assign_device(uint32_t machine_bdf) +{ + return xsm_call(test_assign_device(machine_bdf)); +} + +static inline int xsm_assign_device(struct domain *d, uint32_t machine_bdf) +{ + return xsm_call(assign_device(d, machine_bdf)); +} + +static inline int xsm_deassign_device(struct domain *d, uint32_t machine_bdf) +{ + return xsm_call(deassign_device(d, machine_bdf)); +} + +static inline int xsm_bind_pt_irq(struct domain *d, + struct xen_domctl_bind_pt_irq *bind) +{ + return xsm_call(bind_pt_irq(d, bind)); +} + +static inline int xsm_pin_mem_cacheattr(struct domain *d) +{ + return xsm_call(pin_mem_cacheattr(d)); +} + +static inline int xsm_ext_vcpucontext(struct domain *d, uint32_t cmd) +{ + return xsm_call(ext_vcpucontext(d, cmd)); +} #endif /* CONFIG_X86 */ #endif /* __XSM_H */ diff -r 5b133625223a -r 44f039c4aee4 xen/xsm/dummy.c --- a/xen/xsm/dummy.c Thu Sep 04 11:23:08 2008 +0100 +++ b/xen/xsm/dummy.c Thu Sep 04 11:25:09 2008 +0100 @@ -84,6 +84,11 @@ static int dummy_domain_settime (struct return 0; } +static int dummy_set_target (struct domain *d, struct domain *e) +{ + return 0; +} + static int dummy_tbufcontrol (void) { return 0; @@ -114,18 +119,22 @@ static int dummy_setdebugging (struct do return 0; } -static int dummy_irq_permission (struct domain *d, uint8_t pirq, uint8_t access) -{ - return 0; -} - -static int dummy_iomem_permission (struct domain *d, unsigned long mfn, - uint8_t access) -{ - return 0; -} - static int dummy_perfcontrol (void) +{ + return 0; +} + +static int dummy_debug_keys (void) +{ + return 0; +} + +static int dummy_getcpuinfo (void) +{ + return 0; +} + +static int dummy_availheap (void) { return 0; } @@ -259,18 +268,23 @@ static long dummy___do_xsm_op(XEN_GUEST_ return -ENOSYS; } +static int dummy_add_range (struct domain *d, char *name, unsigned long s, unsigned long e) +{ + return 0; +} + +static int dummy_remove_range (struct domain *d, char *name, unsigned long s, + unsigned long e) +{ + return 0; +} + #ifdef CONFIG_X86 static int dummy_shadow_control (struct domain *d, uint32_t op) { return 0; } -static int dummy_ioport_permission (struct domain *d, uint32_t ioport, - uint8_t access) -{ - return 0; -} - static int dummy_getpageframeinfo (struct page_info *page) { return 0; @@ -356,6 +370,26 @@ static int dummy_platform_quirk (uint32_ return 0; } +static int dummy_firmware_info (void) +{ + return 0; +} + +static int dummy_acpi_sleep (void) +{ + return 0; +} + +static int dummy_change_freq (void) +{ + return 0; +} + +static int dummy_getidletime (void) +{ + return 0; +} + static int dummy_machine_memory_map (void) { return 0; @@ -382,6 +416,41 @@ static int dummy_update_va_mapping (stru } static int dummy_add_to_physmap (struct domain *d1, struct domain *d2) +{ + return 0; +} + +static int dummy_sendtrigger (struct domain *d) +{ + return 0; +} + +static int dummy_test_assign_device (uint32_t machine_bdf) +{ + return 0; +} + +static int dummy_assign_device (struct domain *d, uint32_t machine_bdf) +{ + return 0; +} + +static int dummy_deassign_device (struct domain *d, uint32_t machine_bdf) +{ + return 0; +} + +static int dummy_bind_pt_irq (struct domain *d, struct xen_domctl_bind_pt_irq *bind) +{ + return 0; +} + +static int dummy_pin_mem_cacheattr (struct domain *d) +{ + return 0; +} + +static int dummy_ext_vcpucontext (struct domain *d, uint32_t cmd) { return 0; } @@ -420,15 +489,17 @@ void xsm_fixup_ops (struct xsm_operation set_to_dummy_if_null(ops, getvcpucontext); set_to_dummy_if_null(ops, getvcpuinfo); set_to_dummy_if_null(ops, domain_settime); + set_to_dummy_if_null(ops, set_target); set_to_dummy_if_null(ops, tbufcontrol); set_to_dummy_if_null(ops, readconsole); set_to_dummy_if_null(ops, sched_id); set_to_dummy_if_null(ops, setdomainmaxmem); set_to_dummy_if_null(ops, setdomainhandle); set_to_dummy_if_null(ops, setdebugging); - set_to_dummy_if_null(ops, irq_permission); - set_to_dummy_if_null(ops, iomem_permission); set_to_dummy_if_null(ops, perfcontrol); + set_to_dummy_if_null(ops, debug_keys); + set_to_dummy_if_null(ops, getcpuinfo); + set_to_dummy_if_null(ops, availheap); set_to_dummy_if_null(ops, evtchn_unbound); set_to_dummy_if_null(ops, evtchn_interdomain); @@ -461,11 +532,13 @@ void xsm_fixup_ops (struct xsm_operation set_to_dummy_if_null(ops, kexec); set_to_dummy_if_null(ops, schedop_shutdown); + set_to_dummy_if_null(ops, add_range); + set_to_dummy_if_null(ops, remove_range); + set_to_dummy_if_null(ops, __do_xsm_op); #ifdef CONFIG_X86 set_to_dummy_if_null(ops, shadow_control); - set_to_dummy_if_null(ops, ioport_permission); set_to_dummy_if_null(ops, getpageframeinfo); set_to_dummy_if_null(ops, getmemlist); set_to_dummy_if_null(ops, hypercall_init); @@ -483,6 +556,10 @@ void xsm_fixup_ops (struct xsm_operation set_to_dummy_if_null(ops, microcode); set_to_dummy_if_null(ops, physinfo); set_to_dummy_if_null(ops, platform_quirk); + set_to_dummy_if_null(ops, firmware_info); + set_to_dummy_if_null(ops, acpi_sleep); + set_to_dummy_if_null(ops, change_freq); + set_to_dummy_if_null(ops, getidletime); set_to_dummy_if_null(ops, machine_memory_map); set_to_dummy_if_null(ops, domain_memory_map); set_to_dummy_if_null(ops, mmu_normal_update); @@ -490,5 +567,12 @@ void xsm_fixup_ops (struct xsm_operation set_to_dummy_if_null(ops, update_va_mapping); set_to_dummy_if_null(ops, add_to_physmap); set_to_dummy_if_null(ops, remove_from_physmap); + set_to_dummy_if_null(ops, sendtrigger); + set_to_dummy_if_null(ops, test_assign_device); + set_to_dummy_if_null(ops, assign_device); + set_to_dummy_if_null(ops, deassign_device); + set_to_dummy_if_null(ops, bind_pt_irq); + set_to_dummy_if_null(ops, pin_mem_cacheattr); + set_to_dummy_if_null(ops, ext_vcpucontext); #endif } diff -r 5b133625223a -r 44f039c4aee4 xen/xsm/flask/hooks.c --- a/xen/xsm/flask/hooks.c Thu Sep 04 11:23:08 2008 +0100 +++ b/xen/xsm/flask/hooks.c Thu Sep 04 11:25:09 2008 +0100 @@ -129,8 +129,7 @@ static int flask_evtchn_unbound(struct d if ( rc ) goto out; - rc = avc_has_perm(dsec->sid, newsid, SECCLASS_EVENT, - EVENT__CREATE|EVENT__ALLOC, NULL); + rc = avc_has_perm(dsec->sid, newsid, SECCLASS_EVENT, EVENT__CREATE, NULL); if ( rc ) goto out; @@ -210,7 +209,22 @@ static void flask_evtchn_close_post(stru static int flask_evtchn_send(struct domain *d, struct evtchn *chn) { - return domain_has_evtchn(d, chn, EVENT__SEND); + int rc; + + switch ( chn->state ) + { + case ECS_INTERDOMAIN: + rc = domain_has_evtchn(d, chn, EVENT__SEND); + break; + case ECS_IPI: + case ECS_UNBOUND: + rc = 0; + break; + default: + rc = -EPERM; + } + + return rc; } static int flask_evtchn_status(struct domain *d, struct evtchn *chn) @@ -506,22 +520,22 @@ static int flask_domain_create(struct do dsec1 = current->domain->ssid; - if ( dsec1->create_sid == SECSID_NULL ) - dsec1->create_sid = ssidref; - - rc = avc_has_perm(dsec1->sid, dsec1->create_sid, SECCLASS_DOMAIN, - DOMAIN__CREATE, NULL); - if ( rc ) - { - dsec1->create_sid = SECSID_NULL; - return rc; + if ( dsec1->create_sid == SECSID_NULL ) + dsec1->create_sid = ssidref; + + rc = avc_has_perm(dsec1->sid, dsec1->create_sid, SECCLASS_DOMAIN, + DOMAIN__CREATE, NULL); + if ( rc ) + { + dsec1->create_sid = SECSID_NULL; + return rc; } dsec2 = d->ssid; dsec2->sid = dsec1->create_sid; - dsec1->create_sid = SECSID_NULL; - dsec2->create_sid = SECSID_NULL; + dsec1->create_sid = SECSID_NULL; + dsec2->create_sid = SECSID_NULL; return rc; } @@ -592,6 +606,11 @@ static int flask_domain_settime(struct d return domain_has_perm(current->domain, d, SECCLASS_DOMAIN, DOMAIN__SETTIME); } +static int flask_set_target(struct domain *d, struct domain *e) +{ + return domain_has_perm(d, e, SECCLASS_DOMAIN, DOMAIN__SET_TARGET); +} + static int flask_tbufcontrol(void) { return domain_has_xen(current->domain, SECCLASS_XEN); @@ -628,6 +647,21 @@ static int flask_setdebugging(struct dom { return domain_has_perm(current->domain, d, SECCLASS_DOMAIN, DOMAIN__SETDEBUGGING); +} + +static int flask_debug_keys(void) +{ + return domain_has_xen(current->domain, XEN__DEBUG); +} + +static int flask_getcpuinfo(void) +{ + return domain_has_xen(current->domain, XEN__GETCPUINFO); +} + +static int flask_availheap(void) +{ + return domain_has_xen(current->domain, XEN__HEAP); } static inline u32 resource_to_perm(uint8_t access) @@ -638,7 +672,7 @@ static inline u32 resource_to_perm(uint8 return RESOURCE__REMOVE; } -static int flask_irq_permission(struct domain *d, uint8_t pirq, uint8_t access) +static int irq_has_perm(struct domain *d, uint8_t pirq, uint8_t access) { u32 perm; u32 rsid; @@ -665,16 +699,17 @@ static int flask_irq_permission(struct d return rc; rc = avc_has_perm(ssec->sid, rsid, SECCLASS_RESOURCE, perm, NULL); - - if ( rc ) - return rc; - - return avc_has_perm(tsec->sid, rsid, SECCLASS_RESOURCE, + if ( rc ) + return rc; + + if ( access ) + return avc_has_perm(tsec->sid, rsid, SECCLASS_RESOURCE, RESOURCE__USE, NULL); -} - -static int flask_iomem_permission(struct domain *d, unsigned long mfn, - uint8_t access) + else + return rc; +} + +static int iomem_has_perm(struct domain *d, unsigned long mfn, uint8_t access) { u32 perm; u32 rsid; @@ -684,7 +719,6 @@ static int flask_iomem_permission(struct rc = domain_has_perm(current->domain, d, SECCLASS_RESOURCE, resource_to_perm(access)); - if ( rc ) return rc; @@ -743,8 +777,7 @@ static int flask_shadow_control(struct d return domain_has_perm(current->domain, d, SECCLASS_SHADOW, perm); } -static int flask_ioport_permission(struct domain *d, uint32_t ioport, - uint8_t access) +static int ioport_has_perm(struct domain *d, uint32_t ioport, uint8_t access) { u32 perm; u32 rsid; @@ -774,8 +807,11 @@ static int flask_ioport_permission(struc if ( rc ) return rc; - return avc_has_perm(tsec->sid, rsid, SECCLASS_RESOURCE, + if ( access ) + return avc_has_perm(tsec->sid, rsid, SECCLASS_RESOURCE, RESOURCE__USE, NULL); + else + return rc; } static int flask_getpageframeinfo(struct page_info *page) @@ -951,6 +987,26 @@ static int flask_platform_quirk(uint32_t return avc_has_perm(dsec->sid, SECINITSID_XEN, SECCLASS_XEN, XEN__QUIRK, NULL); +} + +static int flask_firmware_info(void) +{ + return domain_has_xen(current->domain, XEN__FIRMWARE); +} + +static int flask_acpi_sleep(void) +{ + return domain_has_xen(current->domain, XEN__SLEEP); +} + +static int flask_change_freq(void) +{ + return domain_has_xen(current->domain, XEN__FREQUENCY); +} + +static int flask_getidletime(void) +{ + return domain_has_xen(current->domain, XEN__GETIDLE); } static int flask_machine_memory_map(void) @@ -1033,7 +1089,162 @@ static int flask_remove_from_physmap(str { return domain_has_perm(d1, d2, SECCLASS_MMU, MMU__PHYSMAP); } + +static int flask_sendtrigger(struct domain *d) +{ + return domain_has_perm(current->domain, d, SECCLASS_DOMAIN, DOMAIN__TRIGGER); +} + +static int flask_test_assign_device(uint32_t machine_bdf) +{ + u32 rsid; + int rc = -EPERM; + struct domain_security_struct *ssec = current->domain->ssid; + + rc = security_device_sid(machine_bdf, &rsid); + if ( rc ) + return rc; + + return rc = avc_has_perm(ssec->sid, rsid, SECCLASS_RESOURCE, RESOURCE__STAT_DEVICE, NULL); +} + +static int flask_assign_device(struct domain *d, uint32_t machine_bdf) +{ + u32 rsid; + int rc = -EPERM; + struct domain_security_struct *ssec, *tsec; + + rc = domain_has_perm(current->domain, d, SECCLASS_RESOURCE, RESOURCE__ADD); + if ( rc ) + return rc; + + rc = security_device_sid(machine_bdf, &rsid); + if ( rc ) + return rc; + + ssec = current->domain->ssid; + rc = avc_has_perm(ssec->sid, rsid, SECCLASS_RESOURCE, RESOURCE__ADD_DEVICE, NULL); + if ( rc ) + return rc; + + tsec = d->ssid; + return avc_has_perm(tsec->sid, rsid, SECCLASS_RESOURCE, RESOURCE__USE, NULL); +} + +static int flask_deassign_device(struct domain *d, uint32_t machine_bdf) +{ + u32 rsid; + int rc = -EPERM; + struct domain_security_struct *ssec = current->domain->ssid; + + rc = domain_has_perm(current->domain, d, SECCLASS_RESOURCE, RESOURCE__REMOVE); + if ( rc ) + return rc; + + rc = security_device_sid(machine_bdf, &rsid); + if ( rc ) + return rc; + + return rc = avc_has_perm(ssec->sid, rsid, SECCLASS_RESOURCE, RESOURCE__REMOVE_DEVICE, NULL); +} + +static int flask_bind_pt_irq (struct domain *d, struct xen_domctl_bind_pt_irq *bind) +{ + u32 rsid; + int rc = -EPERM; + struct domain_security_struct *ssec, *tsec; + + rc = domain_has_perm(current->domain, d, SECCLASS_RESOURCE, RESOURCE__ADD); + if ( rc ) + return rc; + + rc = security_pirq_sid(bind->machine_irq, &rsid); + if ( rc ) + return rc; + + ssec = current->domain->ssid; + rc = avc_has_perm(ssec->sid, rsid, SECCLASS_HVM, HVM__BIND_IRQ, NULL); + if ( rc ) + return rc; + + tsec = d->ssid; + return avc_has_perm(tsec->sid, rsid, SECCLASS_RESOURCE, RESOURCE__USE, NULL); +} + +static int flask_pin_mem_cacheattr (struct domain *d) +{ + return domain_has_perm(current->domain, d, SECCLASS_HVM, HVM__CACHEATTR); +} + +static int flask_ext_vcpucontext (struct domain *d, uint32_t cmd) +{ + u32 perm; + + switch ( cmd ) + { + case XEN_DOMCTL_set_ext_vcpucontext: + perm = DOMAIN__SETEXTVCPUCONTEXT; + break; + case XEN_DOMCTL_get_ext_vcpucontext: + perm = DOMAIN__GETEXTVCPUCONTEXT; + break; + default: + return -EPERM; + } + + return domain_has_perm(current->domain, d, SECCLASS_DOMAIN, perm); +} #endif + +static int io_has_perm(struct domain *d, char *name, unsigned long s, + unsigned long e, u32 access) +{ + int rc = -EPERM; + + if ( strcmp(name, "I/O Memory") == 0 ) + { + rc = iomem_has_perm(d, s, access); + if ( rc ) + return rc; + + if ( s != e ) + rc = iomem_has_perm(d, s, access); + } + else if ( strcmp(name, "Interrupts") == 0 ) + { + rc = irq_has_perm(d, s, access); + if ( rc ) + return rc; + + if ( s != e ) + rc = irq_has_perm(d, e, access); + } +#ifdef CONFIG_X86 + else if ( strcmp(name, "I/O Ports") == 0 ) + { + rc = ioport_has_perm(d, s, access); + if ( rc ) + return rc; + + if ( s != e ) + rc = ioport_has_perm(d, e, access); + } +#endif + + return rc; +} + +static int flask_add_range(struct domain *d, char *name, unsigned long s, + unsigned long e) +{ + return io_has_perm(d, name, s, e, 1); +} + +static int flask_remove_range(struct domain *d, char *name, unsigned long s, + unsigned long e) +{ + return io_has_perm(d, name, s, e, 0); +} long do_flask_op(XEN_GUEST_HANDLE(xsm_op_t) u_flask_op); @@ -1052,15 +1263,17 @@ static struct xsm_operations flask_ops = .getvcpucontext = flask_getvcpucontext, .getvcpuinfo = flask_getvcpuinfo, .domain_settime = flask_domain_settime, + .set_target = flask_set_target, .tbufcontrol = flask_tbufcontrol, .readconsole = flask_readconsole, .sched_id = flask_sched_id, .setdomainmaxmem = flask_setdomainmaxmem, .setdomainhandle = flask_setdomainhandle, .setdebugging = flask_setdebugging, - .irq_permission = flask_irq_permission, - .iomem_permission = flask_iomem_permission, .perfcontrol = flask_perfcontrol, + .debug_keys = flask_debug_keys, + .getcpuinfo = flask_getcpuinfo, + .availheap = flask_availheap, .evtchn_unbound = flask_evtchn_unbound, .evtchn_interdomain = flask_evtchn_interdomain, @@ -1093,11 +1306,13 @@ static struct xsm_operations flask_ops = .kexec = flask_kexec, .schedop_shutdown = flask_schedop_shutdown, + .add_range = flask_add_range, + .remove_range = flask_remove_range, + .__do_xsm_op = do_flask_op, #ifdef CONFIG_X86 .shadow_control = flask_shadow_control, - .ioport_permission = flask_ioport_permission, .getpageframeinfo = flask_getpageframeinfo, .getmemlist = flask_getmemlist, .hypercall_init = flask_hypercall_init, @@ -1114,6 +1329,10 @@ static struct xsm_operations flask_ops = .microcode = flask_microcode, .physinfo = flask_physinfo, .platform_quirk = flask_platform_quirk, + .firmware_info = flask_firmware_info, + .acpi_sleep = flask_acpi_sleep, + .change_freq = flask_change_freq, + .getidletime = flask_getidletime, .machine_memory_map = flask_machine_memory_map, .domain_memory_map = flask_domain_memory_map, .mmu_normal_update = flask_mmu_normal_update, @@ -1121,6 +1340,13 @@ static struct xsm_operations flask_ops = .update_va_mapping = flask_update_va_mapping, .add_to_physmap = flask_add_to_physmap, .remove_from_physmap = flask_remove_from_physmap, + .sendtrigger = flask_sendtrigger, + .test_assign_device = flask_test_assign_device, + .assign_device = flask_assign_device, + .deassign_device = flask_deassign_device, + .bind_pt_irq = flask_bind_pt_irq, + .pin_mem_cacheattr = flask_pin_mem_cacheattr, + .ext_vcpucontext = flask_ext_vcpucontext, #endif }; diff -r 5b133625223a -r 44f039c4aee4 xen/xsm/flask/include/av_perm_to_string.h --- a/xen/xsm/flask/include/av_perm_to_string.h Thu Sep 04 11:23:08 2008 +0100 +++ b/xen/xsm/flask/include/av_perm_to_string.h Thu Sep 04 11:25:09 2008 +0100 @@ -17,11 +17,19 @@ S_(SECCLASS_XEN, XEN__PRIVPROFILE, "privprofile") S_(SECCLASS_XEN, XEN__NONPRIVPROFILE, "nonprivprofile") S_(SECCLASS_XEN, XEN__KEXEC, "kexec") + S_(SECCLASS_XEN, XEN__FIRMWARE, "firmware") + S_(SECCLASS_XEN, XEN__SLEEP, "sleep") + S_(SECCLASS_XEN, XEN__FREQUENCY, "frequency") + S_(SECCLASS_XEN, XEN__GETIDLE, "getidle") + S_(SECCLASS_XEN, XEN__DEBUG, "debug") + S_(SECCLASS_XEN, XEN__GETCPUINFO, "getcpuinfo") + S_(SECCLASS_XEN, XEN__HEAP, "heap") S_(SECCLASS_DOMAIN, DOMAIN__SETVCPUCONTEXT, "setvcpucontext") S_(SECCLASS_DOMAIN, DOMAIN__PAUSE, "pause") S_(SECCLASS_DOMAIN, DOMAIN__UNPAUSE, "unpause") S_(SECCLASS_DOMAIN, DOMAIN__RESUME, "resume") S_(SECCLASS_DOMAIN, DOMAIN__CREATE, "create") + S_(SECCLASS_DOMAIN, DOMAIN__TRANSITION, "transition") S_(SECCLASS_DOMAIN, DOMAIN__MAX_VCPUS, "max_vcpus") S_(SECCLASS_DOMAIN, DOMAIN__DESTROY, "destroy") S_(SECCLASS_DOMAIN, DOMAIN__SETVCPUAFFINITY, "setvcpuaffinity") @@ -34,11 +42,14 @@ S_(SECCLASS_DOMAIN, DOMAIN__SETDOMAINHANDLE, "setdomainhandle") S_(SECCLASS_DOMAIN, DOMAIN__SETDEBUGGING, "setdebugging") S_(SECCLASS_DOMAIN, DOMAIN__HYPERCALL, "hypercall") - S_(SECCLASS_DOMAIN, DOMAIN__TRANSITION, "transition") S_(SECCLASS_DOMAIN, DOMAIN__SETTIME, "settime") + S_(SECCLASS_DOMAIN, DOMAIN__SET_TARGET, "set_target") S_(SECCLASS_DOMAIN, DOMAIN__SHUTDOWN, "shutdown") S_(SECCLASS_DOMAIN, DOMAIN__SETADDRSIZE, "setaddrsize") S_(SECCLASS_DOMAIN, DOMAIN__GETADDRSIZE, "getaddrsize") + S_(SECCLASS_DOMAIN, DOMAIN__TRIGGER, "trigger") + S_(SECCLASS_DOMAIN, DOMAIN__GETEXTVCPUCONTEXT, "getextvcpucontext") + S_(SECCLASS_DOMAIN, DOMAIN__SETEXTVCPUCONTEXT, "setextvcpucontext") S_(SECCLASS_HVM, HVM__SETHVMC, "sethvmc") S_(SECCLASS_HVM, HVM__GETHVMC, "gethvmc") S_(SECCLASS_HVM, HVM__SETPARAM, "setparam") @@ -46,14 +57,13 @@ S_(SECCLASS_HVM, HVM__PCILEVEL, "pcilevel") S_(SECCLASS_HVM, HVM__IRQLEVEL, "irqlevel") S_(SECCLASS_HVM, HVM__PCIROUTE, "pciroute") + S_(SECCLASS_HVM, HVM__BIND_IRQ, "bind_irq") + S_(SECCLASS_HVM, HVM__CACHEATTR, "cacheattr") S_(SECCLASS_EVENT, EVENT__BIND, "bind") - S_(SECCLASS_EVENT, EVENT__CLOSE, "close") S_(SECCLASS_EVENT, EVENT__SEND, "send") S_(SECCLASS_EVENT, EVENT__STATUS, "status") - S_(SECCLASS_EVENT, EVENT__UNMASK, "unmask") S_(SECCLASS_EVENT, EVENT__NOTIFY, "notify") S_(SECCLASS_EVENT, EVENT__CREATE, "create") - S_(SECCLASS_EVENT, EVENT__ALLOC, "alloc") S_(SECCLASS_EVENT, EVENT__VECTOR, "vector") S_(SECCLASS_EVENT, EVENT__RESET, "reset") S_(SECCLASS_GRANT, GRANT__MAP_READ, "map_read") @@ -87,6 +97,9 @@ S_(SECCLASS_RESOURCE, RESOURCE__REMOVE_IOPORT, "remove_ioport") S_(SECCLASS_RESOURCE, RESOURCE__ADD_IOMEM, "add_iomem") S_(SECCLASS_RESOURCE, RESOURCE__REMOVE_IOMEM, "remove_iomem") + S_(SECCLASS_RESOURCE, RESOURCE__STAT_DEVICE, "stat_device") + S_(SECCLASS_RESOURCE, RESOURCE__ADD_DEVICE, "add_device") + S_(SECCLASS_RESOURCE, RESOURCE__REMOVE_DEVICE, "remove_device") S_(SECCLASS_SECURITY, SECURITY__COMPUTE_AV, "compute_av") S_(SECCLASS_SECURITY, SECURITY__COMPUTE_CREATE, "compute_create") S_(SECCLASS_SECURITY, SECURITY__COMPUTE_MEMBER, "compute_member") diff -r 5b133625223a -r 44f039c4aee4 xen/xsm/flask/include/av_permissions.h --- a/xen/xsm/flask/include/av_permissions.h Thu Sep 04 11:23:08 2008 +0100 +++ b/xen/xsm/flask/include/av_permissions.h Thu Sep 04 11:25:09 2008 +0100 @@ -17,29 +17,40 @@ #define XEN__PRIVPROFILE 0x00008000UL #define XEN__NONPRIVPROFILE 0x00010000UL #define XEN__KEXEC 0x00020000UL +#define XEN__FIRMWARE 0x00040000UL +#define XEN__SLEEP 0x00080000UL +#define XEN__FREQUENCY 0x00100000UL +#define XEN__GETIDLE 0x00200000UL +#define XEN__DEBUG 0x00400000UL +#define XEN__GETCPUINFO 0x00800000UL +#define XEN__HEAP 0x01000000UL #define DOMAIN__SETVCPUCONTEXT 0x00000001UL #define DOMAIN__PAUSE 0x00000002UL #define DOMAIN__UNPAUSE 0x00000004UL #define DOMAIN__RESUME 0x00000008UL #define DOMAIN__CREATE 0x00000010UL -#define DOMAIN__MAX_VCPUS 0x00000020UL -#define DOMAIN__DESTROY 0x00000040UL -#define DOMAIN__SETVCPUAFFINITY 0x00000080UL -#define DOMAIN__GETVCPUAFFINITY 0x00000100UL -#define DOMAIN__SCHEDULER 0x00000200UL -#define DOMAIN__GETDOMAININFO 0x00000400UL -#define DOMAIN__GETVCPUINFO 0x00000800UL -#define DOMAIN__GETVCPUCONTEXT 0x00001000UL -#define DOMAIN__SETDOMAINMAXMEM 0x00002000UL -#define DOMAIN__SETDOMAINHANDLE 0x00004000UL -#define DOMAIN__SETDEBUGGING 0x00008000UL -#define DOMAIN__HYPERCALL 0x00010000UL -#define DOMAIN__TRANSITION 0x00020000UL +#define DOMAIN__TRANSITION 0x00000020UL +#define DOMAIN__MAX_VCPUS 0x00000040UL +#define DOMAIN__DESTROY 0x00000080UL +#define DOMAIN__SETVCPUAFFINITY 0x00000100UL +#define DOMAIN__GETVCPUAFFINITY 0x00000200UL +#define DOMAIN__SCHEDULER 0x00000400UL +#define DOMAIN__GETDOMAININFO 0x00000800UL +#define DOMAIN__GETVCPUINFO 0x00001000UL +#define DOMAIN__GETVCPUCONTEXT 0x00002000UL +#define DOMAIN__SETDOMAINMAXMEM 0x00004000UL +#define DOMAIN__SETDOMAINHANDLE 0x00008000UL +#define DOMAIN__SETDEBUGGING 0x00010000UL +#define DOMAIN__HYPERCALL 0x00020000UL #define DOMAIN__SETTIME 0x00040000UL -#define DOMAIN__SHUTDOWN 0x00080000UL -#define DOMAIN__SETADDRSIZE 0x00100000UL -#define DOMAIN__GETADDRSIZE 0x00200000UL +#define DOMAIN__SET_TARGET 0x00080000UL +#define DOMAIN__SHUTDOWN 0x00100000UL +#define DOMAIN__SETADDRSIZE 0x00200000UL +#define DOMAIN__GETADDRSIZE 0x00400000UL +#define DOMAIN__TRIGGER 0x00800000UL +#define DOMAIN__GETEXTVCPUCONTEXT 0x01000000UL +#define DOMAIN__SETEXTVCPUCONTEXT 0x02000000UL #define HVM__SETHVMC 0x00000001UL #define HVM__GETHVMC 0x00000002UL @@ -48,17 +59,16 @@ #define HVM__PCILEVEL 0x00000010UL #define HVM__IRQLEVEL 0x00000020UL #define HVM__PCIROUTE 0x00000040UL +#define HVM__BIND_IRQ 0x00000080UL +#define HVM__CACHEATTR 0x00000100UL #define EVENT__BIND 0x00000001UL -#define EVENT__CLOSE 0x00000002UL -#define EVENT__SEND 0x00000004UL -#define EVENT__STATUS 0x00000008UL -#define EVENT__UNMASK 0x00000010UL -#define EVENT__NOTIFY 0x00000020UL -#define EVENT__CREATE 0x00000040UL -#define EVENT__ALLOC 0x00000080UL -#define EVENT__VECTOR 0x00000100UL -#define EVENT__RESET 0x00000200UL +#define EVENT__SEND 0x00000002UL +#define EVENT__STATUS 0x00000004UL +#define EVENT__NOTIFY 0x00000008UL +#define EVENT__CREATE 0x00000010UL +#define EVENT__VECTOR 0x00000020UL +#define EVENT__RESET 0x00000040UL #define GRANT__MAP_READ 0x00000001UL #define GRANT__MAP_WRITE 0x00000002UL @@ -94,6 +104,9 @@ #define RESOURCE__REMOVE_IOPORT 0x00000040UL #define RESOURCE__ADD_IOMEM 0x00000080UL #define RESOURCE__REMOVE_IOMEM 0x00000100UL +#define RESOURCE__STAT_DEVICE 0x00000200UL +#define RESOURCE__ADD_DEVICE 0x00000400UL +#define RESOURCE__REMOVE_DEVICE 0x00000800UL #define SECURITY__COMPUTE_AV 0x00000001UL #define SECURITY__COMPUTE_CREATE 0x00000002UL diff -r 5b133625223a -r 44f039c4aee4 xen/xsm/flask/include/flask.h --- a/xen/xsm/flask/include/flask.h Thu Sep 04 11:23:08 2008 +0100 +++ b/xen/xsm/flask/include/flask.h Thu Sep 04 11:25:09 2008 +0100 @@ -1,6 +1,6 @@ /* This file is automatically generated. Do not edit. */ -#ifndef _FLASK_FLASK_H_ -#define _FLASK_FLASK_H_ +#ifndef _SELINUX_FLASK_H_ +#define _SELINUX_FLASK_H_ /* * Security object class definitions @@ -27,10 +27,9 @@ #define SECINITSID_SECURITY 7 #define SECINITSID_IOPORT 8 #define SECINITSID_IOMEM 9 -#define SECINITSID_VCPU 10 -#define SECINITSID_VIRQ 11 -#define SECINITSID_PIRQ 12 +#define SECINITSID_PIRQ 10 +#define SECINITSID_DEVICE 11 -#define SECINITSID_NUM 12 +#define SECINITSID_NUM 11 #endif diff -r 5b133625223a -r 44f039c4aee4 xen/xsm/flask/include/initial_sid_to_string.h --- a/xen/xsm/flask/include/initial_sid_to_string.h Thu Sep 04 11:23:08 2008 +0100 +++ b/xen/xsm/flask/include/initial_sid_to_string.h Thu Sep 04 11:25:09 2008 +0100 @@ -11,8 +11,7 @@ static char *initial_sid_to_string[] = "security", "ioport", "iomem", - "vcpu", - "virq", "pirq", + "device", }; diff -r 5b133625223a -r 44f039c4aee4 xen/xsm/flask/include/security.h --- a/xen/xsm/flask/include/security.h Thu Sep 04 11:23:08 2008 +0100 +++ b/xen/xsm/flask/include/security.h Thu Sep 04 11:25:09 2008 +0100 @@ -69,13 +69,11 @@ int security_get_user_sids(u32 callsid, int security_pirq_sid(int pirq, u32 *out_sid); -int security_virq_sid(int virq, u32 *out_sid); - -int security_vcpu_sid(int vcpu, u32 *out_sid); - int security_iomem_sid(unsigned long, u32 *out_sid); int security_ioport_sid(u32 ioport, u32 *out_sid); + +int security_device_sid(u32 device, u32 *out_sid); int security_validate_transition(u32 oldsid, u32 newsid, u32 tasksid, u16 tclass); diff -r 5b133625223a -r 44f039c4aee4 xen/xsm/flask/ss/policydb.h --- a/xen/xsm/flask/ss/policydb.h Thu Sep 04 11:23:08 2008 +0100 +++ b/xen/xsm/flask/ss/policydb.h Thu Sep 04 11:25:09 2008 +0100 @@ -133,10 +133,9 @@ struct ocontext { union { char *name; /* name of initial SID, fs, netif, fstype, path */ int pirq; - int virq; - int vcpu; u32 ioport; unsigned long iomem; + u32 device; } u; struct context context[2]; /* security context(s) */ u32 sid[2]; /* SID(s) */ @@ -157,11 +156,11 @@ struct ocontext { /* object context array indices */ #define OCON_ISID 0 /* initial SIDs */ #define OCON_PIRQ 1 /* physical irqs */ -#define OCON_VIRQ 2 /* virtual irqs */ -#define OCON_VCPU 3 /* virtual cpus */ -#define OCON_IOPORT 4 /* io ports */ -#define OCON_IOMEM 5 /* io memory */ -#define OCON_DUMMY 6 +#define OCON_IOPORT 2 /* io ports */ +#define OCON_IOMEM 3 /* io memory */ +#define OCON_DEVICE 4 /* pci devices */ +#define OCON_DUMMY1 5 /* reserved */ +#define OCON_DUMMY2 6 /* reserved */ #define OCON_NUM 7 /* The policy database */ diff -r 5b133625223a -r 44f039c4aee4 xen/xsm/flask/ss/services.c --- a/xen/xsm/flask/ss/services.c Thu Sep 04 11:23:08 2008 +0100 +++ b/xen/xsm/flask/ss/services.c Thu Sep 04 11:25:09 2008 +0100 @@ -1418,6 +1418,46 @@ out: return rc; } +/** + * security_ioport_sid - Obtain the SID for an ioport. + * @ioport: ioport + * @out_sid: security identifier + */ +int security_device_sid(u32 device, u32 *out_sid) +{ + struct ocontext *c; + int rc = 0; + + POLICY_RDLOCK; + + c = policydb.ocontexts[OCON_DEVICE]; + while ( c ) + { + if ( c->u.device == device ) + break; + c = c->next; + } + + if ( c ) + { + if ( !c->sid[0] ) + { + rc = sidtab_context_to_sid(&sidtab, &c->context[0], &c->sid[0]); + if ( rc ) + goto out; + } + *out_sid = c->sid[0]; + } + else + { + *out_sid = SECINITSID_DEVICE; + } + +out: + POLICY_RDUNLOCK; + return rc; +} + #define SIDS_NEL 25 /** _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |