intel_gas.c (257251) | intel_gas.c (259512) |
---|---|
1/*- 2 * Copyright (c) 2013 The FreeBSD Foundation 3 * All rights reserved. 4 * 5 * This software was developed by Konstantin Belousov <kib@FreeBSD.org> 6 * under sponsorship from the FreeBSD Foundation. 7 * 8 * Redistribution and use in source and binary forms, with or without --- 14 unchanged lines hidden (view full) --- 23 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 24 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 25 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 26 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 27 * SUCH DAMAGE. 28 */ 29 30#include <sys/cdefs.h> | 1/*- 2 * Copyright (c) 2013 The FreeBSD Foundation 3 * All rights reserved. 4 * 5 * This software was developed by Konstantin Belousov <kib@FreeBSD.org> 6 * under sponsorship from the FreeBSD Foundation. 7 * 8 * Redistribution and use in source and binary forms, with or without --- 14 unchanged lines hidden (view full) --- 23 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 24 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 25 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 26 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 27 * SUCH DAMAGE. 28 */ 29 30#include <sys/cdefs.h> |
31__FBSDID("$FreeBSD: head/sys/x86/iommu/intel_gas.c 257251 2013-10-28 13:33:29Z kib $"); | 31__FBSDID("$FreeBSD: stable/10/sys/x86/iommu/intel_gas.c 259512 2013-12-17 13:49:35Z kib $"); |
32 33#define RB_AUGMENT(entry) dmar_gas_augment_entry(entry) 34 35#include <sys/param.h> 36#include <sys/systm.h> 37#include <sys/malloc.h> 38#include <sys/bus.h> 39#include <sys/interrupt.h> --- 47 unchanged lines hidden (view full) --- 87{ 88 struct dmar_map_entry *res; 89 90 KASSERT((flags & ~(DMAR_PGF_WAITOK)) == 0, 91 ("unsupported flags %x", flags)); 92 93 res = uma_zalloc(dmar_map_entry_zone, ((flags & DMAR_PGF_WAITOK) != 94 0 ? M_WAITOK : M_NOWAIT) | M_ZERO); | 32 33#define RB_AUGMENT(entry) dmar_gas_augment_entry(entry) 34 35#include <sys/param.h> 36#include <sys/systm.h> 37#include <sys/malloc.h> 38#include <sys/bus.h> 39#include <sys/interrupt.h> --- 47 unchanged lines hidden (view full) --- 87{ 88 struct dmar_map_entry *res; 89 90 KASSERT((flags & ~(DMAR_PGF_WAITOK)) == 0, 91 ("unsupported flags %x", flags)); 92 93 res = uma_zalloc(dmar_map_entry_zone, ((flags & DMAR_PGF_WAITOK) != 94 0 ? M_WAITOK : M_NOWAIT) | M_ZERO); |
95 if (res != NULL) | 95 if (res != NULL) { 96 res->ctx = ctx; |
96 atomic_add_int(&ctx->entries_cnt, 1); | 97 atomic_add_int(&ctx->entries_cnt, 1); |
98 } |
|
97 return (res); 98} 99 100void 101dmar_gas_free_entry(struct dmar_ctx *ctx, struct dmar_map_entry *entry) 102{ 103 | 99 return (res); 100} 101 102void 103dmar_gas_free_entry(struct dmar_ctx *ctx, struct dmar_map_entry *entry) 104{ 105 |
106 KASSERT(ctx == entry->ctx, 107 ("mismatched free ctx %p entry %p entry->ctx %p", ctx, 108 entry, entry->ctx)); |
|
104 atomic_subtract_int(&ctx->entries_cnt, 1); 105 uma_zfree(dmar_map_entry_zone, entry); 106} 107 108static int 109dmar_gas_cmp_entries(struct dmar_map_entry *a, struct dmar_map_entry *b) 110{ 111 --- 53 unchanged lines hidden (view full) --- 165#ifdef INVARIANTS 166static void 167dmar_gas_check_free(struct dmar_ctx *ctx) 168{ 169 struct dmar_map_entry *entry, *next, *l, *r; 170 dmar_gaddr_t v; 171 172 RB_FOREACH(entry, dmar_gas_entries_tree, &ctx->rb_root) { | 109 atomic_subtract_int(&ctx->entries_cnt, 1); 110 uma_zfree(dmar_map_entry_zone, entry); 111} 112 113static int 114dmar_gas_cmp_entries(struct dmar_map_entry *a, struct dmar_map_entry *b) 115{ 116 --- 53 unchanged lines hidden (view full) --- 170#ifdef INVARIANTS 171static void 172dmar_gas_check_free(struct dmar_ctx *ctx) 173{ 174 struct dmar_map_entry *entry, *next, *l, *r; 175 dmar_gaddr_t v; 176 177 RB_FOREACH(entry, dmar_gas_entries_tree, &ctx->rb_root) { |
178 KASSERT(ctx == entry->ctx, 179 ("mismatched free ctx %p entry %p entry->ctx %p", ctx, 180 entry, entry->ctx)); |
|
173 next = RB_NEXT(dmar_gas_entries_tree, &ctx->rb_root, entry); 174 if (next == NULL) { 175 MPASS(entry->free_after == ctx->end - entry->end); 176 } else { 177 MPASS(entry->free_after = next->start - entry->end); 178 MPASS(entry->end <= next->start); 179 } 180 l = RB_LEFT(entry, rb_entry); --- 397 unchanged lines hidden (view full) --- 578 dmar_gas_rb_remove(ctx, entry); 579 entry->flags &= ~DMAR_MAP_ENTRY_MAP; 580#ifdef INVARIANTS 581 if (dmar_check_free) 582 dmar_gas_check_free(ctx); 583#endif 584} 585 | 181 next = RB_NEXT(dmar_gas_entries_tree, &ctx->rb_root, entry); 182 if (next == NULL) { 183 MPASS(entry->free_after == ctx->end - entry->end); 184 } else { 185 MPASS(entry->free_after = next->start - entry->end); 186 MPASS(entry->end <= next->start); 187 } 188 l = RB_LEFT(entry, rb_entry); --- 397 unchanged lines hidden (view full) --- 586 dmar_gas_rb_remove(ctx, entry); 587 entry->flags &= ~DMAR_MAP_ENTRY_MAP; 588#ifdef INVARIANTS 589 if (dmar_check_free) 590 dmar_gas_check_free(ctx); 591#endif 592} 593 |
586static void | 594void |
587dmar_gas_free_region(struct dmar_ctx *ctx, struct dmar_map_entry *entry) 588{ 589 struct dmar_map_entry *next, *prev; 590 591 DMAR_CTX_ASSERT_LOCKED(ctx); 592 KASSERT((entry->flags & (DMAR_MAP_ENTRY_PLACE | DMAR_MAP_ENTRY_RMRR | 593 DMAR_MAP_ENTRY_MAP)) == DMAR_MAP_ENTRY_RMRR, 594 ("non-RMRR entry %p %p", ctx, entry)); --- 44 unchanged lines hidden (view full) --- 639 640 error = ctx_map_buf(ctx, entry->start, size, ma, 641 ((eflags & DMAR_MAP_ENTRY_READ) != 0 ? DMAR_PTE_R : 0) | 642 ((eflags & DMAR_MAP_ENTRY_WRITE) != 0 ? DMAR_PTE_W : 0) | 643 ((eflags & DMAR_MAP_ENTRY_SNOOP) != 0 ? DMAR_PTE_SNP : 0) | 644 ((eflags & DMAR_MAP_ENTRY_TM) != 0 ? DMAR_PTE_TM : 0), 645 (flags & DMAR_GM_CANWAIT) != 0 ? DMAR_PGF_WAITOK : 0); 646 if (error == ENOMEM) { | 595dmar_gas_free_region(struct dmar_ctx *ctx, struct dmar_map_entry *entry) 596{ 597 struct dmar_map_entry *next, *prev; 598 599 DMAR_CTX_ASSERT_LOCKED(ctx); 600 KASSERT((entry->flags & (DMAR_MAP_ENTRY_PLACE | DMAR_MAP_ENTRY_RMRR | 601 DMAR_MAP_ENTRY_MAP)) == DMAR_MAP_ENTRY_RMRR, 602 ("non-RMRR entry %p %p", ctx, entry)); --- 44 unchanged lines hidden (view full) --- 647 648 error = ctx_map_buf(ctx, entry->start, size, ma, 649 ((eflags & DMAR_MAP_ENTRY_READ) != 0 ? DMAR_PTE_R : 0) | 650 ((eflags & DMAR_MAP_ENTRY_WRITE) != 0 ? DMAR_PTE_W : 0) | 651 ((eflags & DMAR_MAP_ENTRY_SNOOP) != 0 ? DMAR_PTE_SNP : 0) | 652 ((eflags & DMAR_MAP_ENTRY_TM) != 0 ? DMAR_PTE_TM : 0), 653 (flags & DMAR_GM_CANWAIT) != 0 ? DMAR_PGF_WAITOK : 0); 654 if (error == ENOMEM) { |
647 DMAR_CTX_LOCK(ctx); 648 dmar_gas_free_space(ctx, entry); 649 DMAR_CTX_UNLOCK(ctx); 650 dmar_gas_free_entry(ctx, entry); | 655 dmar_ctx_unload_entry(entry, true); |
651 return (error); 652 } 653 KASSERT(error == 0, 654 ("unexpected error %d from ctx_map_buf", error)); 655 656 *res = entry; 657 return (0); 658} --- 25 unchanged lines hidden (view full) --- 684 error = ctx_map_buf(ctx, entry->start, entry->end - entry->start, 685 ma + OFF_TO_IDX(start - entry->start), 686 ((eflags & DMAR_MAP_ENTRY_READ) != 0 ? DMAR_PTE_R : 0) | 687 ((eflags & DMAR_MAP_ENTRY_WRITE) != 0 ? DMAR_PTE_W : 0) | 688 ((eflags & DMAR_MAP_ENTRY_SNOOP) != 0 ? DMAR_PTE_SNP : 0) | 689 ((eflags & DMAR_MAP_ENTRY_TM) != 0 ? DMAR_PTE_TM : 0), 690 (flags & DMAR_GM_CANWAIT) != 0 ? DMAR_PGF_WAITOK : 0); 691 if (error == ENOMEM) { | 656 return (error); 657 } 658 KASSERT(error == 0, 659 ("unexpected error %d from ctx_map_buf", error)); 660 661 *res = entry; 662 return (0); 663} --- 25 unchanged lines hidden (view full) --- 689 error = ctx_map_buf(ctx, entry->start, entry->end - entry->start, 690 ma + OFF_TO_IDX(start - entry->start), 691 ((eflags & DMAR_MAP_ENTRY_READ) != 0 ? DMAR_PTE_R : 0) | 692 ((eflags & DMAR_MAP_ENTRY_WRITE) != 0 ? DMAR_PTE_W : 0) | 693 ((eflags & DMAR_MAP_ENTRY_SNOOP) != 0 ? DMAR_PTE_SNP : 0) | 694 ((eflags & DMAR_MAP_ENTRY_TM) != 0 ? DMAR_PTE_TM : 0), 695 (flags & DMAR_GM_CANWAIT) != 0 ? DMAR_PGF_WAITOK : 0); 696 if (error == ENOMEM) { |
692 DMAR_CTX_LOCK(ctx); 693 dmar_gas_free_region(ctx, entry); 694 DMAR_CTX_UNLOCK(ctx); 695 entry->flags = 0; | 697 dmar_ctx_unload_entry(entry, false); |
696 return (error); 697 } 698 KASSERT(error == 0, 699 ("unexpected error %d from ctx_map_buf", error)); 700 701 return (0); 702} 703 --- 19 unchanged lines hidden --- | 698 return (error); 699 } 700 KASSERT(error == 0, 701 ("unexpected error %d from ctx_map_buf", error)); 702 703 return (0); 704} 705 --- 19 unchanged lines hidden --- |