source: mainline/arch/mips32/src/mm/asid.c@ cc205f1

lfn serial ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since cc205f1 was cc205f1, checked in by Jakub Jermar <jakub@…>, 20 years ago

Add mm/mapping1 test.
(Will not make it past TLB Invalid exception on mips32.)
Fixes in asid.c.
Make TLB register types union with u32 value.
Implement tlb_invalidate() for mips32.
(TLB invalidation and shootdown path will have to be revised.)

  • Property mode set to 100644
File size: 3.0 KB
Line 
1/*
2 * Copyright (C) 2005 Martin Decky
3 * Copyright (C) 2005 Jakub Jermar
4 * All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:
9 *
10 * - Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * - Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
15 * - The name of the author may not be used to endorse or promote products
16 * derived from this software without specific prior written permission.
17 *
18 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
19 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
20 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
21 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
22 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
23 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
27 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28 */
29
30#include <arch/mm/asid.h>
31#include <synch/spinlock.h>
32#include <arch.h>
33#include <debug.h>
34#include <typedefs.h>
35
36static spinlock_t asid_usage_lock;
37static count_t asid_usage[ASIDS]; /**< Usage tracking array for ASIDs */
38
39/** Get ASID
40 *
41 * Get the least used ASID.
42 *
43 * @return ASID
44 */
45asid_t asid_get(void)
46{
47 pri_t pri;
48 int i, j;
49 count_t min;
50
51 min = (unsigned) -1;
52
53 pri = cpu_priority_high();
54 spinlock_lock(&asid_usage_lock);
55
56 for (i = ASID_START, j = ASID_START; i < ASIDS; i++) {
57 if (asid_usage[i] < min) {
58 j = i;
59 min = asid_usage[i];
60 if (!min)
61 break;
62 }
63 }
64
65 asid_usage[j]++;
66
67 spinlock_unlock(&asid_usage_lock);
68 cpu_priority_restore(pri);
69
70 return i;
71}
72
73/** Release ASID
74 *
75 * Release ASID by decrementing its usage count.
76 *
77 * @param asid ASID.
78 */
79void asid_put(asid_t asid)
80{
81 pri_t pri;
82
83 pri = cpu_priority_high();
84 spinlock_lock(&asid_usage_lock);
85
86 ASSERT(asid != ASID_INVALID);
87
88 ASSERT(asid_usage[asid] > 0);
89 asid_usage[asid]--;
90
91 spinlock_unlock(&asid_usage_lock);
92 cpu_priority_restore(pri);
93}
94
95/** Find out whether ASID is used by more address spaces
96 *
97 * Find out whether ASID is used by more address spaces.
98 *
99 * @param asid ASID in question.
100 *
101 * @return True if 'asid' is used by more address spaces, false otherwise.
102 */
103bool asid_has_conflicts(asid_t asid)
104{
105 bool has_conflicts = false;
106 pri_t pri;
107
108 ASSERT(asid != ASID_INVALID);
109
110 pri = cpu_priority_high();
111 spinlock_lock(&asid_usage_lock);
112
113 if (asid_usage[asid] > 1)
114 has_conflicts = true;
115
116 spinlock_unlock(&asid_usage_lock);
117 cpu_priority_restore(pri);
118
119 return has_conflicts;
120}
Note: See TracBrowser for help on using the repository browser.