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
RevLine 
[b4a4c5e3]1/*
[6b7c36f]2 * Copyright (C) 2005 Martin Decky
[cc205f1]3 * Copyright (C) 2005 Jakub Jermar
[b4a4c5e3]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
[1084a784]30#include <arch/mm/asid.h>
31#include <synch/spinlock.h>
[b4a4c5e3]32#include <arch.h>
[1084a784]33#include <debug.h>
[cc205f1]34#include <typedefs.h>
[b4a4c5e3]35
[1084a784]36static spinlock_t asid_usage_lock;
37static count_t asid_usage[ASIDS]; /**< Usage tracking array for ASIDs */
[b4a4c5e3]38
[1084a784]39/** Get ASID
[b4a4c5e3]40 *
[1084a784]41 * Get the least used ASID.
42 *
43 * @return ASID
[b4a4c5e3]44 */
[1084a784]45asid_t asid_get(void)
[b4a4c5e3]46{
[1084a784]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
[cc205f1]56 for (i = ASID_START, j = ASID_START; i < ASIDS; i++) {
[1084a784]57 if (asid_usage[i] < min) {
58 j = i;
59 min = asid_usage[i];
60 if (!min)
61 break;
62 }
63 }
64
[cc205f1]65 asid_usage[j]++;
[b4a4c5e3]66
[1084a784]67 spinlock_unlock(&asid_usage_lock);
68 cpu_priority_restore(pri);
69
70 return i;
71}
[b4a4c5e3]72
[1084a784]73/** Release ASID
[b4a4c5e3]74 *
[1084a784]75 * Release ASID by decrementing its usage count.
76 *
77 * @param asid ASID.
[b4a4c5e3]78 */
[1084a784]79void asid_put(asid_t asid)
[b4a4c5e3]80{
[1084a784]81 pri_t pri;
82
83 pri = cpu_priority_high();
84 spinlock_lock(&asid_usage_lock);
85
[cc205f1]86 ASSERT(asid != ASID_INVALID);
87
[1084a784]88 ASSERT(asid_usage[asid] > 0);
89 asid_usage[asid]--;
90
91 spinlock_unlock(&asid_usage_lock);
92 cpu_priority_restore(pri);
[b4a4c5e3]93}
[cc205f1]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.