Subversion Repositories HelenOS-historic

Rev

Rev 818 | Rev 900 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. /*
  2.  * Copyright (C) 2006 Jakub Jermar
  3.  * All rights reserved.
  4.  *
  5.  * Redistribution and use in source and binary forms, with or without
  6.  * modification, are permitted provided that the following conditions
  7.  * are met:
  8.  *
  9.  * - Redistributions of source code must retain the above copyright
  10.  *   notice, this list of conditions and the following disclaimer.
  11.  * - Redistributions in binary form must reproduce the above copyright
  12.  *   notice, this list of conditions and the following disclaimer in the
  13.  *   documentation and/or other materials provided with the distribution.
  14.  * - The name of the author may not be used to endorse or promote products
  15.  *   derived from this software without specific prior written permission.
  16.  *
  17.  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
  18.  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
  19.  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
  20.  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
  21.  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
  22.  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
  23.  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
  24.  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  25.  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
  26.  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  27.  */
  28.  
  29. /*
  30.  * TLB management.
  31.  */
  32.  
  33. #include <mm/tlb.h>
  34. #include <arch/mm/tlb.h>
  35. #include <arch/barrier.h>
  36.  
  37.  
  38. /** Invalidate all TLB entries. */
  39. void tlb_invalidate_all(void)
  40. {
  41.     /* TODO */
  42. }
  43.  
  44. /** Invalidate entries belonging to an address space.
  45.  *
  46.  * @param asid Address space identifier.
  47.  */
  48. void tlb_invalidate_asid(asid_t asid)
  49. {
  50.     /* TODO */
  51. }
  52.  
  53.  
  54.  
  55. void tlb_fill_data(__address va,asid_t asid,tlb_entry_t entry)
  56. {
  57.     region_register rr;
  58.  
  59.  
  60.     if(!(entry.not_present.p)) return;
  61.  
  62.     rr.word=rr_read(VA_REGION(va));
  63.  
  64.     if(rr.map.rid==ASID2RID(asid,VA_REGION(va)))
  65.     {
  66.         asm volatile
  67.         (
  68.             "srlz.i;;\n"
  69.             "srlz.d;;\n"
  70.             "mov r8=psr;;\n"
  71.             "and r9=r8,%0;;\n"                  /*(~PSR_IC_MASK)*/
  72.             "mov psr.l=r9;;\n"
  73.             "srlz.d;;\n"
  74.             "srlz.i;;\n"
  75.             "mov cr.ifa=%1\n"               /*va*/       
  76.             "mov cr.itir=%2;;\n"                /*entry.word[1]*/
  77.             "itc.d %3;;\n"                      /*entry.word[0]*/
  78.             "mov psr.l=r8;;\n"
  79.             "srlz.d;;\n"
  80.             :
  81.             :"r"(~PSR_IC_MASK),"r"(va),"r"(entry.word[1]),"r"(entry.word[0])
  82.             :"r8","r9"
  83.         );
  84.     }
  85.     else
  86.     {
  87.         region_register rr0;
  88.         rr0=rr;
  89.         rr0.map.rid=ASID2RID(asid,VA_REGION(va));
  90.         rr_write(VA_REGION(va),rr0.word);
  91.         srlz_d();
  92.         asm volatile
  93.         (
  94.             "mov r8=psr;;\n"
  95.             "and r9=r8,%0;;\n"                  /*(~PSR_IC_MASK)*/
  96.             "mov psr.l=r9;;\n"
  97.             "srlz.d;;\n"
  98.             "mov cr.ifa=%1\n"               /*va*/       
  99.             "mov cr.itir=%2;;\n"                /*entry.word[1]*/
  100.             "itc.d %3;;\n"                      /*entry.word[0]*/
  101.             "mov psr.l=r8;;\n"
  102.             "srlz.d;;\n"
  103.             :
  104.             :"r"(~PSR_IC_MASK),"r"(va),"r"(entry.word[1]),"r"(entry.word[0])
  105.             :"r8","r9"
  106.         );
  107.         rr_write(VA_REGION(va),rr.word);
  108.     }
  109.  
  110.  
  111. }
  112.  
  113. void tlb_fill_code(__address va,asid_t asid,tlb_entry_t entry)
  114. {
  115.     region_register rr;
  116.  
  117.  
  118.     if(!(entry.not_present.p)) return;
  119.  
  120.     rr.word=rr_read(VA_REGION(va));
  121.  
  122.     if(rr.map.rid==ASID2RID(asid,VA_REGION(va)))
  123.     {
  124.         asm volatile
  125.         (
  126.             "srlz.i;;\n"
  127.             "srlz.d;;\n"
  128.             "mov r8=psr;;\n"
  129.             "and r9=r8,%0;;\n"                  /*(~PSR_IC_MASK)*/
  130.             "mov psr.l=r9;;\n"
  131.             "srlz.d;;\n"
  132.             "srlz.i;;\n"
  133.             "mov cr.ifa=%1\n"               /*va*/       
  134.             "mov cr.itir=%2;;\n"                /*entry.word[1]*/
  135.             "itc.i %3;;\n"                      /*entry.word[0]*/
  136.             "mov psr.l=r8;;\n"
  137.             "srlz.d;;\n"
  138.             :
  139.             :"r"(~PSR_IC_MASK),"r"(va),"r"(entry.word[1]),"r"(entry.word[0])
  140.             :"r8","r9"
  141.         );
  142.     }
  143.     else
  144.     {
  145.         region_register rr0;
  146.         rr0=rr;
  147.         rr0.map.rid=ASID2RID(asid,VA_REGION(va));
  148.         rr_write(VA_REGION(va),rr0.word);
  149.         srlz_d();
  150.         asm volatile
  151.         (
  152.             "mov r8=psr;;\n"
  153.             "and r9=r8,%0;;\n"                  /*(~PSR_IC_MASK)*/
  154.             "mov psr.l=r9;;\n"
  155.             "srlz.d;;\n"
  156.             "mov cr.ifa=%1\n"           /*va*/       
  157.             "mov cr.itir=%2;;\n"            /*entry.word[1]*/
  158.             "itc.i %3;;\n"                      /*entry.word[0]*/
  159.             "mov psr.l=r8;;\n"
  160.             "srlz.d;;\n"
  161.             :
  162.             :"r"(~PSR_IC_MASK),"r"(va),"r"(entry.word[1]),"r"(entry.word[0])
  163.             :"r8","r9"
  164.         );
  165.         rr_write(VA_REGION(va),rr.word);
  166.     }
  167.  
  168.  
  169. }
  170.  
  171.  
  172. void tlb_fill_data_tr(__u64 tr,__address va,asid_t asid,tlb_entry_t entry)
  173. {
  174.     region_register rr;
  175.  
  176.  
  177.     if(!(entry.not_present.p)) return;
  178.  
  179.     rr.word=rr_read(VA_REGION(va));
  180.  
  181.     if(rr.map.rid==ASID2RID(asid,VA_REGION(va)))
  182.     {
  183.         asm volatile
  184.         (
  185.             "srlz.i;;\n"
  186.             "srlz.d;;\n"
  187.             "mov r8=psr;;\n"
  188.             "and r9=r8,%0;;\n"                  /*(~PSR_IC_MASK)*/
  189.             "mov psr.l=r9;;\n"
  190.             "srlz.d;;\n"
  191.             "srlz.i;;\n"
  192.             "mov cr.ifa=%1\n"               /*va*/       
  193.             "mov cr.itir=%2;;\n"                /*entry.word[1]*/
  194.             "itr.d dtr[%4]=%3;;\n"                      /*entry.word[0]*/
  195.             "mov psr.l=r8;;\n"
  196.             "srlz.d;;\n"
  197.             :
  198.             :"r"(~PSR_IC_MASK),"r"(va),"r"(entry.word[1]),"r"(entry.word[0]),"r"(tr)
  199.             :"r8","r9"
  200.         );
  201.     }
  202.     else
  203.     {
  204.         region_register rr0;
  205.         rr0=rr;
  206.         rr0.map.rid=ASID2RID(asid,VA_REGION(va));
  207.         rr_write(VA_REGION(va),rr0.word);
  208.         srlz_d();
  209.         asm volatile
  210.         (
  211.             "mov r8=psr;;\n"
  212.             "and r9=r8,%0;;\n"                  /*(~PSR_IC_MASK)*/
  213.             "mov psr.l=r9;;\n"
  214.             "srlz.d;;\n"
  215.             "mov cr.ifa=%1\n"               /*va*/       
  216.             "mov cr.itir=%2;;\n"                /*entry.word[1]*/
  217.             "itr.d dtr[%4]=%3;;\n"                      /*entry.word[0]*/
  218.             "mov psr.l=r8;;\n"
  219.             "srlz.d;;\n"
  220.             :
  221.             :"r"(~PSR_IC_MASK),"r"(va),"r"(entry.word[1]),"r"(entry.word[0]),"r"(tr)
  222.             :"r8","r9"
  223.         );
  224.         rr_write(VA_REGION(va),rr.word);
  225.     }
  226.  
  227.  
  228. }
  229.  
  230. void tlb_fill_code_tr(__u64 tr,__address va,asid_t asid,tlb_entry_t entry)
  231. {
  232.     region_register rr;
  233.  
  234.  
  235.     if(!(entry.not_present.p)) return;
  236.  
  237.     rr.word=rr_read(VA_REGION(va));
  238.  
  239.     if(rr.map.rid==ASID2RID(asid,VA_REGION(va)))
  240.     {
  241.         asm volatile
  242.         (
  243.             "srlz.i;;\n"
  244.             "srlz.d;;\n"
  245.             "mov r8=psr;;\n"
  246.             "and r9=r8,%0;;\n"                  /*(~PSR_IC_MASK)*/
  247.             "mov psr.l=r9;;\n"
  248.             "srlz.d;;\n"
  249.             "srlz.i;;\n"
  250.             "mov cr.ifa=%1\n"               /*va*/       
  251.             "mov cr.itir=%2;;\n"                /*entry.word[1]*/
  252.             "itr.i itr[%4]=%3;;\n"                      /*entry.word[0]*/
  253.             "mov psr.l=r8;;\n"
  254.             "srlz.d;;\n"
  255.             :
  256.             :"r"(~PSR_IC_MASK),"r"(va),"r"(entry.word[1]),"r"(entry.word[0]),"r"(tr)
  257.             :"r8","r9"
  258.         );
  259.     }
  260.     else
  261.     {
  262.         region_register rr0;
  263.         rr0=rr;
  264.         rr0.map.rid=ASID2RID(asid,VA_REGION(va));
  265.         rr_write(VA_REGION(va),rr0.word);
  266.         srlz_d();
  267.         asm volatile
  268.         (
  269.             "mov r8=psr;;\n"
  270.             "and r9=r8,%0;;\n"                  /*(~PSR_IC_MASK)*/
  271.             "mov psr.l=r9;;\n"
  272.             "srlz.d;;\n"
  273.             "mov cr.ifa=%1\n"           /*va*/       
  274.             "mov cr.itir=%2;;\n"            /*entry.word[1]*/
  275.             "itr.i itr[%4]=%3;;\n"                      /*entry.word[0]*/
  276.             "mov psr.l=r8;;\n"
  277.             "srlz.d;;\n"
  278.             :
  279.             :"r"(~PSR_IC_MASK),"r"(va),"r"(entry.word[1]),"r"(entry.word[0]),"r"(tr)
  280.             :"r8","r9"
  281.         );
  282.         rr_write(VA_REGION(va),rr.word);
  283.     }
  284.  
  285.  
  286. }
  287.  
  288.