Deleted Added
full compact
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 ---