Changeset 1084a784 in mainline for arch/mips32/src/mm/asid.c


Ignore:
Timestamp:
2005-10-04T22:09:41Z (20 years ago)
Author:
Jakub Jermar <jakub@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
342de62
Parents:
8e3f47b3
Message:

mips32 memory management work.
TLB Refill Exception implemented (passed basic testing).
Remove bit g from struct entry_hi.
Add generic find_mapping().
Add asid to vm_t type, define asid_t to hide architecture specific differences.
Implement ASID allocation for mips32, dummy for other architectures.
Add THE→vm (a.k.a. VM).
Add vm_install_arch().
Move pte_t definition to arch/types.h on each architecture.
Fix PTL manipulating functions on mips32 to shift pfn by 12 instead of by 14.
Fix tlb_init_arch() to initialize all entries.

Other.
Remove unnecessary header files from arch.h
Add missing headers here and there.
Remove two unnecessary ld flags from mips32 makefile.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • arch/mips32/src/mm/asid.c

    r8e3f47b3 r1084a784  
    2727 */
    2828
     29#include <arch/mm/asid.h>
     30#include <synch/spinlock.h>
    2931#include <arch.h>
    30 #include <memstr.h>
     32#include <debug.h>
    3133
    32 /**< Array of threads that have currently some ASID assigned,
    33      NULL means no thread have ASID with number of that index assigned */
    34 struct thread * asids[256];
    35 int last_asid; /**< The number of last assigned ASID */
    36 int asid_bitmap[32]; /**< Bitmap of ASIDs currently in TLB */
     34#define ASIDS   256
    3735
     36static spinlock_t asid_usage_lock;
     37static count_t asid_usage[ASIDS];       /**< Usage tracking array for ASIDs */
    3838
    39 /** Cleanup asid_bitmap
     39/** Get ASID
    4040 *
     41 * Get the least used ASID.
     42 *
     43 * @return ASID
    4144 */
    42 void asid_bitmap_reset(void)
     45asid_t asid_get(void)
    4346{
    44         memsetb(asid_bitmap, sizeof(asid_bitmap), 0);
     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=0, j = 0; (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[i]++;
     66
     67        spinlock_unlock(&asid_usage_lock);
     68        cpu_priority_restore(pri);
     69
     70        return i;
    4571}
    4672
     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;
    4782
    48 /** Initialize manipulating with ASIDs
    49  *
    50  */
    51 void init_asids(void)
    52 {
    53         memsetb(asids, sizeof(asids), 0);
    54         asid_bitmap_reset();
    55         last_asid = 0;
     83        pri = cpu_priority_high();
     84        spinlock_lock(&asid_usage_lock);
     85
     86        ASSERT(asid_usage[asid] > 0);
     87        asid_usage[asid]--;
     88
     89        spinlock_unlock(&asid_usage_lock);
     90        cpu_priority_restore(pri);
    5691}
Note: See TracChangeset for help on using the changeset viewer.