Subversion Repositories HelenOS

Rev

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

  1. /*
  2.  * Copyright (C) 2005 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. /** @addtogroup sparc64mm  
  30.  * @{
  31.  */
  32. /** @file
  33.  */
  34.  
  35. #ifndef __sparc64_TLB_H__
  36. #define __sparc64_TLB_H__
  37.  
  38.  
  39. #define ITLB_ENTRY_COUNT        64
  40. #define DTLB_ENTRY_COUNT        64
  41.  
  42. #define MEM_CONTEXT_KERNEL      0
  43. #define MEM_CONTEXT_TEMP        1
  44.  
  45. /** Page sizes. */
  46. #define PAGESIZE_8K 0
  47. #define PAGESIZE_64K    1
  48. #define PAGESIZE_512K   2
  49. #define PAGESIZE_4M 3
  50.  
  51. /** Bit width of the TLB-locked portion of kernel address space. */
  52. #define KERNEL_PAGE_WIDTH       22  /* 4M */
  53.  
  54. /* TLB Demap Operation types. */
  55. #define TLB_DEMAP_PAGE      0
  56. #define TLB_DEMAP_CONTEXT   1
  57.  
  58. #define TLB_DEMAP_TYPE_SHIFT    6
  59.  
  60. /* TLB Demap Operation Context register encodings. */
  61. #define TLB_DEMAP_PRIMARY   0
  62. #define TLB_DEMAP_SECONDARY 1
  63. #define TLB_DEMAP_NUCLEUS   2
  64.  
  65. #define TLB_DEMAP_CONTEXT_SHIFT 4
  66.  
  67. /* TLB Tag Access shifts */
  68. #define TLB_TAG_ACCESS_CONTEXT_SHIFT    0
  69. #define TLB_TAG_ACCESS_CONTEXT_MASK ((1<<13)-1)
  70. #define TLB_TAG_ACCESS_VPN_SHIFT    13
  71.  
  72. #ifndef __ASM__
  73.  
  74. #include <arch/mm/tte.h>
  75. #include <arch/mm/mmu.h>
  76. #include <arch/mm/page.h>
  77. #include <arch/asm.h>
  78. #include <arch/barrier.h>
  79. #include <arch/types.h>
  80. #include <typedefs.h>
  81.  
  82. union tlb_context_reg {
  83.     uint64_t v;
  84.     struct {
  85.         unsigned long : 51;
  86.         unsigned context : 13;      /**< Context/ASID. */
  87.     } __attribute__ ((packed));
  88. };
  89. typedef union tlb_context_reg tlb_context_reg_t;
  90.  
  91. /** I-/D-TLB Data In/Access Register type. */
  92. typedef tte_data_t tlb_data_t;
  93.  
  94. /** I-/D-TLB Data Access Address in Alternate Space. */
  95. union tlb_data_access_addr {
  96.     uint64_t value;
  97.     struct {
  98.         uint64_t : 55;
  99.         unsigned tlb_entry : 6;
  100.         unsigned : 3;
  101.     } __attribute__ ((packed));
  102. };
  103. typedef union tlb_data_access_addr tlb_data_access_addr_t;
  104. typedef union tlb_data_access_addr tlb_tag_read_addr_t;
  105.  
  106. /** I-/D-TLB Tag Read Register. */
  107. union tlb_tag_read_reg {
  108.     uint64_t value;
  109.     struct {
  110.         uint64_t vpn : 51;      /**< Virtual Address bits 63:13. */
  111.         unsigned context : 13;      /**< Context identifier. */
  112.     } __attribute__ ((packed));
  113. };
  114. typedef union tlb_tag_read_reg tlb_tag_read_reg_t;
  115. typedef union tlb_tag_read_reg tlb_tag_access_reg_t;
  116.  
  117.  
  118. /** TLB Demap Operation Address. */
  119. union tlb_demap_addr {
  120.     uint64_t value;
  121.     struct {
  122.         uint64_t vpn: 51;   /**< Virtual Address bits 63:13. */
  123.         unsigned : 6;       /**< Ignored. */
  124.         unsigned type : 1;  /**< The type of demap operation. */
  125.         unsigned context : 2;   /**< Context register selection. */
  126.         unsigned : 4;       /**< Zero. */
  127.     } __attribute__ ((packed));
  128. };
  129. typedef union tlb_demap_addr tlb_demap_addr_t;
  130.  
  131. /** TLB Synchronous Fault Status Register. */
  132. union tlb_sfsr_reg {
  133.     uint64_t value;
  134.     struct {
  135.         unsigned long : 40; /**< Implementation dependent. */
  136.         unsigned asi : 8;   /**< ASI. */
  137.         unsigned : 2;
  138.         unsigned ft : 7;    /**< Fault type. */
  139.         unsigned e : 1;     /**< Side-effect bit. */
  140.         unsigned ct : 2;    /**< Context Register selection. */
  141.         unsigned pr : 1;    /**< Privilege bit. */
  142.         unsigned w : 1;     /**< Write bit. */
  143.         unsigned ow : 1;    /**< Overwrite bit. */
  144.         unsigned fv : 1;    /**< Fault Valid bit. */
  145.     } __attribute__ ((packed));
  146. };
  147. typedef union tlb_sfsr_reg tlb_sfsr_reg_t;
  148.  
  149. /** Read MMU Primary Context Register.
  150.  *
  151.  * @return Current value of Primary Context Register.
  152.  */
  153. static inline uint64_t mmu_primary_context_read(void)
  154. {
  155.     return asi_u64_read(ASI_DMMU, VA_PRIMARY_CONTEXT_REG);
  156. }
  157.  
  158. /** Write MMU Primary Context Register.
  159.  *
  160.  * @param v New value of Primary Context Register.
  161.  */
  162. static inline void mmu_primary_context_write(uint64_t v)
  163. {
  164.     asi_u64_write(ASI_DMMU, VA_PRIMARY_CONTEXT_REG, v);
  165.     flush();
  166. }
  167.  
  168. /** Read MMU Secondary Context Register.
  169.  *
  170.  * @return Current value of Secondary Context Register.
  171.  */
  172. static inline uint64_t mmu_secondary_context_read(void)
  173. {
  174.     return asi_u64_read(ASI_DMMU, VA_SECONDARY_CONTEXT_REG);
  175. }
  176.  
  177. /** Write MMU Primary Context Register.
  178.  *
  179.  * @param v New value of Primary Context Register.
  180.  */
  181. static inline void mmu_secondary_context_write(uint64_t v)
  182. {
  183.     asi_u64_write(ASI_DMMU, VA_PRIMARY_CONTEXT_REG, v);
  184.     flush();
  185. }
  186.  
  187. /** Read IMMU TLB Data Access Register.
  188.  *
  189.  * @param entry TLB Entry index.
  190.  *
  191.  * @return Current value of specified IMMU TLB Data Access Register.
  192.  */
  193. static inline uint64_t itlb_data_access_read(index_t entry)
  194. {
  195.     tlb_data_access_addr_t reg;
  196.    
  197.     reg.value = 0;
  198.     reg.tlb_entry = entry;
  199.     return asi_u64_read(ASI_ITLB_DATA_ACCESS_REG, reg.value);
  200. }
  201.  
  202. /** Write IMMU TLB Data Access Register.
  203.  *
  204.  * @param entry TLB Entry index.
  205.  * @param value Value to be written.
  206.  */
  207. static inline void itlb_data_access_write(index_t entry, uint64_t value)
  208. {
  209.     tlb_data_access_addr_t reg;
  210.    
  211.     reg.value = 0;
  212.     reg.tlb_entry = entry;
  213.     asi_u64_write(ASI_ITLB_DATA_ACCESS_REG, reg.value, value);
  214.     flush();
  215. }
  216.  
  217. /** Read DMMU TLB Data Access Register.
  218.  *
  219.  * @param entry TLB Entry index.
  220.  *
  221.  * @return Current value of specified DMMU TLB Data Access Register.
  222.  */
  223. static inline uint64_t dtlb_data_access_read(index_t entry)
  224. {
  225.     tlb_data_access_addr_t reg;
  226.    
  227.     reg.value = 0;
  228.     reg.tlb_entry = entry;
  229.     return asi_u64_read(ASI_DTLB_DATA_ACCESS_REG, reg.value);
  230. }
  231.  
  232. /** Write DMMU TLB Data Access Register.
  233.  *
  234.  * @param entry TLB Entry index.
  235.  * @param value Value to be written.
  236.  */
  237. static inline void dtlb_data_access_write(index_t entry, uint64_t value)
  238. {
  239.     tlb_data_access_addr_t reg;
  240.    
  241.     reg.value = 0;
  242.     reg.tlb_entry = entry;
  243.     asi_u64_write(ASI_DTLB_DATA_ACCESS_REG, reg.value, value);
  244.     membar();
  245. }
  246.  
  247. /** Read IMMU TLB Tag Read Register.
  248.  *
  249.  * @param entry TLB Entry index.
  250.  *
  251.  * @return Current value of specified IMMU TLB Tag Read Register.
  252.  */
  253. static inline uint64_t itlb_tag_read_read(index_t entry)
  254. {
  255.     tlb_tag_read_addr_t tag;
  256.  
  257.     tag.value = 0;
  258.     tag.tlb_entry = entry;
  259.     return asi_u64_read(ASI_ITLB_TAG_READ_REG, tag.value);
  260. }
  261.  
  262. /** Read DMMU TLB Tag Read Register.
  263.  *
  264.  * @param entry TLB Entry index.
  265.  *
  266.  * @return Current value of specified DMMU TLB Tag Read Register.
  267.  */
  268. static inline uint64_t dtlb_tag_read_read(index_t entry)
  269. {
  270.     tlb_tag_read_addr_t tag;
  271.  
  272.     tag.value = 0;
  273.     tag.tlb_entry = entry;
  274.     return asi_u64_read(ASI_DTLB_TAG_READ_REG, tag.value);
  275. }
  276.  
  277. /** Write IMMU TLB Tag Access Register.
  278.  *
  279.  * @param v Value to be written.
  280.  */
  281. static inline void itlb_tag_access_write(uint64_t v)
  282. {
  283.     asi_u64_write(ASI_IMMU, VA_IMMU_TAG_ACCESS, v);
  284.     flush();
  285. }
  286.  
  287. /** Read IMMU TLB Tag Access Register.
  288.  *
  289.  * @return Current value of IMMU TLB Tag Access Register.
  290.  */
  291. static inline uint64_t itlb_tag_access_read(void)
  292. {
  293.     return asi_u64_read(ASI_IMMU, VA_IMMU_TAG_ACCESS);
  294. }
  295.  
  296. /** Write DMMU TLB Tag Access Register.
  297.  *
  298.  * @param v Value to be written.
  299.  */
  300. static inline void dtlb_tag_access_write(uint64_t v)
  301. {
  302.     asi_u64_write(ASI_DMMU, VA_DMMU_TAG_ACCESS, v);
  303.     membar();
  304. }
  305.  
  306. /** Read DMMU TLB Tag Access Register.
  307.  *
  308.  * @return Current value of DMMU TLB Tag Access Register.
  309.  */
  310. static inline uint64_t dtlb_tag_access_read(void)
  311. {
  312.     return asi_u64_read(ASI_DMMU, VA_DMMU_TAG_ACCESS);
  313. }
  314.  
  315.  
  316. /** Write IMMU TLB Data in Register.
  317.  *
  318.  * @param v Value to be written.
  319.  */
  320. static inline void itlb_data_in_write(uint64_t v)
  321. {
  322.     asi_u64_write(ASI_ITLB_DATA_IN_REG, 0, v);
  323.     flush();
  324. }
  325.  
  326. /** Write DMMU TLB Data in Register.
  327.  *
  328.  * @param v Value to be written.
  329.  */
  330. static inline void dtlb_data_in_write(uint64_t v)
  331. {
  332.     asi_u64_write(ASI_DTLB_DATA_IN_REG, 0, v);
  333.     membar();
  334. }
  335.  
  336. /** Read ITLB Synchronous Fault Status Register.
  337.  *
  338.  * @return Current content of I-SFSR register.
  339.  */
  340. static inline uint64_t itlb_sfsr_read(void)
  341. {
  342.     return asi_u64_read(ASI_IMMU, VA_IMMU_SFSR);
  343. }
  344.  
  345. /** Write ITLB Synchronous Fault Status Register.
  346.  *
  347.  * @param v New value of I-SFSR register.
  348.  */
  349. static inline void itlb_sfsr_write(uint64_t v)
  350. {
  351.     asi_u64_write(ASI_IMMU, VA_IMMU_SFSR, v);
  352.     flush();
  353. }
  354.  
  355. /** Read DTLB Synchronous Fault Status Register.
  356.  *
  357.  * @return Current content of D-SFSR register.
  358.  */
  359. static inline uint64_t dtlb_sfsr_read(void)
  360. {
  361.     return asi_u64_read(ASI_DMMU, VA_DMMU_SFSR);
  362. }
  363.  
  364. /** Write DTLB Synchronous Fault Status Register.
  365.  *
  366.  * @param v New value of D-SFSR register.
  367.  */
  368. static inline void dtlb_sfsr_write(uint64_t v)
  369. {
  370.     asi_u64_write(ASI_DMMU, VA_DMMU_SFSR, v);
  371.     membar();
  372. }
  373.  
  374. /** Read DTLB Synchronous Fault Address Register.
  375.  *
  376.  * @return Current content of D-SFAR register.
  377.  */
  378. static inline uint64_t dtlb_sfar_read(void)
  379. {
  380.     return asi_u64_read(ASI_DMMU, VA_DMMU_SFAR);
  381. }
  382.  
  383. /** Perform IMMU TLB Demap Operation.
  384.  *
  385.  * @param type Selects between context and page demap.
  386.  * @param context_encoding Specifies which Context register has Context ID for demap.
  387.  * @param page Address which is on the page to be demapped.
  388.  */
  389. static inline void itlb_demap(int type, int context_encoding, uintptr_t page)
  390. {
  391.     tlb_demap_addr_t da;
  392.     page_address_t pg;
  393.    
  394.     da.value = 0;
  395.     pg.address = page;
  396.    
  397.     da.type = type;
  398.     da.context = context_encoding;
  399.     da.vpn = pg.vpn;
  400.    
  401.     asi_u64_write(ASI_IMMU_DEMAP, da.value, 0); /* da.value is the address within the ASI */
  402.     flush();
  403. }
  404.  
  405. /** Perform DMMU TLB Demap Operation.
  406.  *
  407.  * @param type Selects between context and page demap.
  408.  * @param context_encoding Specifies which Context register has Context ID for demap.
  409.  * @param page Address which is on the page to be demapped.
  410.  */
  411. static inline void dtlb_demap(int type, int context_encoding, uintptr_t page)
  412. {
  413.     tlb_demap_addr_t da;
  414.     page_address_t pg;
  415.    
  416.     da.value = 0;
  417.     pg.address = page;
  418.    
  419.     da.type = type;
  420.     da.context = context_encoding;
  421.     da.vpn = pg.vpn;
  422.    
  423.     asi_u64_write(ASI_DMMU_DEMAP, da.value, 0); /* da.value is the address within the ASI */
  424.     membar();
  425. }
  426.  
  427. extern void fast_instruction_access_mmu_miss(int n, istate_t *istate);
  428. extern void fast_data_access_mmu_miss(int n, istate_t *istate);
  429. extern void fast_data_access_protection(int n, istate_t *istate);
  430.  
  431. extern void dtlb_insert_mapping(uintptr_t page, uintptr_t frame, int pagesize, bool locked, bool cacheable);
  432.  
  433. #endif /* !def __ASM__ */
  434.  
  435. #endif
  436.  
  437. /** @}
  438.  */
  439.