Changeset bc78c75 in mainline for arch/ia64/src/mm/tlb.c


Ignore:
Timestamp:
2006-02-08T17:15:56Z (19 years ago)
Author:
Jakub Vana <jakub.vana@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
89298e3
Parents:
4c8715d2
Message:

IA-64 TLB filling functions for dynamic tlb filling (TC tlb).

File:
1 edited

Legend:

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

    r4c8715d2 rbc78c75  
    3232
    3333#include <mm/tlb.h>
    34 #include <arch/mm/asid.h>
     34#include <arch/mm/tlb.h>
     35
    3536
    3637/** Invalidate all TLB entries. */
     
    4849        /* TODO */
    4950}
     51
     52
     53
     54void tlb_fill_data(__address va,asid_t asid,vhpt_entry_t entry)
     55{
     56        region_register rr;
     57
     58
     59        if(!(entry.not_present.p)) return;
     60
     61        rr.word=rr_read(VA_REGION(va));
     62
     63        if(rr.map.rid==ASID2RID(asid,VA_REGION(va)))
     64        {
     65                asm
     66                (
     67                        "srlz.i;;\n"
     68                        "srlz.d;;\n"
     69                        "mov r8=psr;;\n"
     70                        "and r9=r8,%0;;\n"                              /*(~PSR_IC_MASK)*/
     71                        "mov psr.l=r9;;\n"
     72                        "srlz.d;;\n"
     73                        "srlz.i;;\n"
     74                        "mov cr20=%1\n"                 /*va*/          /*cr20 == IFA*/
     75                        "mov cr21=%2;;\n"                                       /*entry.word[1]*/ /*cr21=ITIR*/
     76                        "itc.d %3;;\n"                                          /*entry.word[0]*/
     77                        "mov psr.l=r8;;\n"
     78                        "srlz.d;;\n"
     79                        :
     80                        :"r"(~PSR_IC_MASK),"r"(va),"r"(entry.word[1]),"r"(entry.word[0])
     81                        :"r8","r9"
     82                );
     83        }
     84        else
     85        {
     86                region_register rr0;
     87                rr0=rr;
     88                rr0.map.rid=ASID2RID(asid,VA_REGION(va));
     89                rr_write(VA_REGION(va),rr0.word);
     90                asm
     91                (
     92                        "mov r8=psr;;\n"
     93                        "and r9=r8,%0;;\n"                              /*(~PSR_IC_MASK)*/
     94                        "mov psr.l=r9;;\n"
     95                        "srlz.d;;\n"
     96                        "mov cr20=%1\n"                 /*va*/          /*cr20 == IFA*/
     97                        "mov cr21=%2;;\n"                                       /*entry.word[1]*/ /*cr21=ITIR*/
     98                        "itc.d %3;;\n"                                          /*entry.word[0]*/
     99                        "mov psr.l=r8;;\n"
     100                        "srlz.d;;\n"
     101                        :
     102                        :"r"(~PSR_IC_MASK),"r"(va),"r"(entry.word[1]),"r"(entry.word[0])
     103                        :"r8","r9"
     104                );
     105                rr_write(VA_REGION(va),rr.word);
     106        }
     107
     108
     109}
     110
     111void tlb_fill_code(__address va,asid_t asid,vhpt_entry_t entry)
     112{
     113        region_register rr;
     114
     115
     116        if(!(entry.not_present.p)) return;
     117
     118        rr.word=rr_read(VA_REGION(va));
     119
     120        if(rr.map.rid==ASID2RID(asid,VA_REGION(va)))
     121        {
     122                asm
     123                (
     124                        "srlz.i;;\n"
     125                        "srlz.d;;\n"
     126                        "mov r8=psr;;\n"
     127                        "and r9=r8,%0;;\n"                              /*(~PSR_IC_MASK)*/
     128                        "mov psr.l=r9;;\n"
     129                        "srlz.d;;\n"
     130                        "srlz.i;;\n"
     131                        "mov cr20=%1\n"                 /*va*/          /*cr20 == IFA*/
     132                        "mov cr21=%2;;\n"                                       /*entry.word[1]*/ /*cr21=ITIR*/
     133                        "itc.i %3;;\n"                                          /*entry.word[0]*/
     134                        "mov psr.l=r8;;\n"
     135                        "srlz.d;;\n"
     136                        :
     137                        :"r"(~PSR_IC_MASK),"r"(va),"r"(entry.word[1]),"r"(entry.word[0])
     138                        :"r8","r9"
     139                );
     140        }
     141        else
     142        {
     143                region_register rr0;
     144                rr0=rr;
     145                rr0.map.rid=ASID2RID(asid,VA_REGION(va));
     146                rr_write(VA_REGION(va),rr0.word);
     147                asm
     148                (
     149                        "mov r8=psr;;\n"
     150                        "and r9=r8,%0;;\n"                              /*(~PSR_IC_MASK)*/
     151                        "mov psr.l=r9;;\n"
     152                        "srlz.d;;\n"
     153                        "mov cr20=%1\n"                 /*va*/          /*cr20 == IFA*/
     154                        "mov cr21=%2;;\n"                                       /*entry.word[1]*/ /*cr21=ITIR*/
     155                        "itc.i %3;;\n"                                          /*entry.word[0]*/
     156                        "mov psr.l=r8;;\n"
     157                        "srlz.d;;\n"
     158                        :
     159                        :"r"(~PSR_IC_MASK),"r"(va),"r"(entry.word[1]),"r"(entry.word[0])
     160                        :"r8","r9"
     161                );
     162                rr_write(VA_REGION(va),rr.word);
     163        }
     164
     165
     166}
     167
     168
Note: See TracChangeset for help on using the changeset viewer.