Changeset bc78c75 in mainline


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).

Location:
arch/ia64
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • arch/ia64/include/mm/page.h

    r4c8715d2 rbc78c75  
    7171#define AR_EXECUTE      0x1
    7272#define AR_WRITE        0x2
     73
     74
     75#define VA_REGION_INDEX 61
     76
     77#define VA_REGION(va) (va>>VA_REGION_INDEX)
     78
     79
    7380
    7481struct vhpt_tag_info {
     
    221228{
    222229        ASSERT(i < REGION_REGISTERS);
    223         __asm__ volatile ("mov rr[%0] = %1\n" : : "r" (i), "r" (v));
     230        __asm__ volatile (
     231        "mov rr[%0] = %1;;\n"
     232        "srlz.d;;\n"
     233        :
     234        : "r" (i), "r" (v));
    224235}
    225236 
  • arch/ia64/include/mm/tlb.h

    r4c8715d2 rbc78c75  
    3333#define tlb_print()
    3434
     35
     36#include <arch/mm/page.h>
     37#include <arch/mm/asid.h>
     38#include <arch/register.h>
     39
     40
     41void tlb_fill_data(__address va,asid_t asid,vhpt_entry_t entry);
     42void tlb_fill_code(__address va,asid_t asid,vhpt_entry_t entry);
     43
     44
    3545#endif
     46
     47
  • 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.