Changeset 4512d7e in mainline for arch/mips32/src/mm/tlb.c


Ignore:
Timestamp:
2006-01-19T22:17:47Z (19 years ago)
Author:
Jakub Jermar <jakub@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
6461d67c
Parents:
64c44e8
Message:

New ASID management subsystem (initial work, more is required).
Some TLB invalidation changes.

File:
1 edited

Legend:

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

    r64c44e8 r4512d7e  
    2828
    2929#include <arch/mm/tlb.h>
    30 #include <arch/mm/asid.h>
     30#include <mm/asid.h>
    3131#include <mm/tlb.h>
    3232#include <mm/page.h>
     
    495495}
    496496
    497 /** Invalidate TLB entry for specified page belonging to specified address space.
     497/** Invalidate TLB entries for specified page range belonging to specified address space.
    498498 *
    499499 * @param asid Address space identifier.
    500  * @param page Page whose TLB entry is to be invalidated.
    501  */
    502 void tlb_invalidate_page(asid_t asid, __address page)
    503 {
     500 * @param page First page whose TLB entry is to be invalidated.
     501 * @param cnt Number of entries to invalidate.
     502 */
     503void tlb_invalidate_pages(asid_t asid, __address page, count_t cnt)
     504{
     505        int i;
    504506        ipl_t ipl;
    505507        entry_lo_t lo0, lo1;
     
    512514        ipl = interrupts_disable();
    513515
    514         hi.value = 0;
    515         prepare_entry_hi(&hi, asid, page);
    516         cp0_entry_hi_write(hi.value);
    517 
    518         tlbp();
    519         index.value = cp0_index_read();
    520 
    521         if (!index.p) {
    522                 /* Entry was found, index register contains valid index. */
    523                 tlbr();
    524 
    525                 lo0.value = cp0_entry_lo0_read();
    526                 lo1.value = cp0_entry_lo1_read();
    527 
    528                 lo0.v = 0;
    529                 lo1.v = 0;
    530 
    531                 cp0_entry_lo0_write(lo0.value);
    532                 cp0_entry_lo1_write(lo1.value);
    533 
    534                 tlbwi();
     516        for (i = 0; i < cnt; i++) {
     517                hi.value = 0;
     518                prepare_entry_hi(&hi, asid, page + i * PAGE_SIZE);
     519                cp0_entry_hi_write(hi.value);
     520
     521                tlbp();
     522                index.value = cp0_index_read();
     523
     524                if (!index.p) {
     525                        /* Entry was found, index register contains valid index. */
     526                        tlbr();
     527
     528                        lo0.value = cp0_entry_lo0_read();
     529                        lo1.value = cp0_entry_lo1_read();
     530
     531                        lo0.v = 0;
     532                        lo1.v = 0;
     533
     534                        cp0_entry_lo0_write(lo0.value);
     535                        cp0_entry_lo1_write(lo1.value);
     536
     537                        tlbwi();
     538                }
    535539        }
    536540       
Note: See TracChangeset for help on using the changeset viewer.