Subversion Repositories HelenOS-historic

Rev

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

  1. /*
  2.  * Copyright (C) 2005 - 2006 Jakub Jermar
  3.  * Copyright (C) 2006 Jakub Vana
  4.  * All rights reserved.
  5.  *
  6.  * Redistribution and use in source and binary forms, with or without
  7.  * modification, are permitted provided that the following conditions
  8.  * are met:
  9.  *
  10.  * - Redistributions of source code must retain the above copyright
  11.  *   notice, this list of conditions and the following disclaimer.
  12.  * - Redistributions in binary form must reproduce the above copyright
  13.  *   notice, this list of conditions and the following disclaimer in the
  14.  *   documentation and/or other materials provided with the distribution.
  15.  * - The name of the author may not be used to endorse or promote products
  16.  *   derived from this software without specific prior written permission.
  17.  *
  18.  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
  19.  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
  20.  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
  21.  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
  22.  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
  23.  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
  24.  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
  25.  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  26.  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
  27.  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  28.  */
  29.  
  30. #ifndef __ia64_PAGE_H__
  31. #define __ia64_PAGE_H__
  32.  
  33. #include <arch/mm/frame.h>
  34. #include <genarch/mm/page_ht.h>
  35. #include <arch/types.h>
  36. #include <typedefs.h>
  37. #include <debug.h>
  38.  
  39. #define PAGE_SIZE   FRAME_SIZE
  40. #define PAGE_WIDTH  FRAME_WIDTH
  41.  
  42. #define KA2PA(x)    ((__address) (x))
  43. #define PA2KA(x)    ((__address) (x))
  44.  
  45. #define GET_PTL0_ADDRESS_ARCH()         ((pte_t *) 0)
  46. #define SET_PTL0_ADDRESS_ARCH(ptl0)
  47.  
  48. /** Implementation of page hash table interface. */
  49. #define HT_ENTRIES_ARCH         (VHPT_SIZE/sizeof(pte_t))
  50. #define HT_HASH_ARCH(page, asid)    vhpt_hash((page), (asid))
  51. #define HT_COMPARE_ARCH(page, asid, t)  0
  52. #define HT_SLOT_EMPTY_ARCH(t)       1
  53. #define HT_INVALIDATE_SLOT_ARCH(t)
  54. #define HT_GET_NEXT_ARCH(t)     0
  55. #define HT_SET_NEXT_ARCH(t, s)
  56. #define HT_SET_RECORD_ARCH(t, page, asid, frame, flags)
  57.  
  58. #define VRN_SHIFT           61
  59. #define VRN_MASK            (7LL << VRN_SHIFT)
  60.  
  61. #define VRN_KERNEL          0
  62. #define VRN_WORK            1LL
  63. #define REGION_REGISTERS        8
  64.  
  65. #define VHPT_WIDTH          20          /* 1M */
  66. #define VHPT_SIZE           (1<<VHPT_WIDTH)
  67.  
  68. #define VHPT_BASE           page_ht     /* Must be aligned to VHPT_SIZE */
  69.  
  70. struct vhpt_tag_info {
  71.     unsigned long long tag : 63;
  72.     unsigned ti : 1;
  73. } __attribute__ ((packed));
  74.  
  75. union vhpt_tag {
  76.     struct vhpt_tag_info tag_info;
  77.     unsigned tag_word;
  78. };
  79.  
  80. struct vhpt_entry_present {
  81.     /* Word 0 */
  82.     unsigned p : 1;
  83.     unsigned : 1;
  84.     unsigned ma : 3;
  85.     unsigned a : 1;
  86.     unsigned d : 1;
  87.     unsigned pl : 2;
  88.     unsigned ar : 3;
  89.     unsigned long long ppn : 38;
  90.     unsigned : 2;
  91.     unsigned ed : 1;
  92.     unsigned ig1 : 11;
  93.    
  94.     /* Word 1 */
  95.     unsigned : 2;
  96.     unsigned ps : 6;
  97.     unsigned key : 24;
  98.     unsigned : 32;
  99.    
  100.     /* Word 2 */
  101.     union vhpt_tag tag;
  102.    
  103.     /* Word 3 */                                                   
  104.     unsigned long long next : 64;   /**< Collision chain next pointer. */
  105. } __attribute__ ((packed));
  106.  
  107. struct vhpt_entry_not_present {
  108.     /* Word 0 */
  109.     unsigned p : 1;
  110.     unsigned long long ig0 : 52;
  111.     unsigned ig1 : 11;
  112.    
  113.     /* Word 1 */
  114.     unsigned : 2;
  115.     unsigned ps : 6;
  116.     unsigned long long ig2 : 56;
  117.  
  118.     /* Word 2 */
  119.     union vhpt_tag tag;
  120.    
  121.     /* Word 3 */                                                   
  122.     unsigned long long next : 64;   /**< Collision chain next pointer. */
  123.    
  124. } __attribute__ ((packed));
  125.  
  126. typedef union vhpt_entry {
  127.     struct vhpt_entry_present present;
  128.     struct vhpt_entry_not_present not_present;
  129. } vhpt_entry;
  130.  
  131. struct region_register_map {
  132.     unsigned ve : 1;
  133.     unsigned : 1;
  134.     unsigned ps : 6;
  135.     unsigned rid : 24;
  136.     unsigned : 32;
  137. } __attribute__ ((packed));
  138.  
  139. typedef union region_register {
  140.     struct region_register_map map;
  141.     unsigned long long word;
  142. } region_register;
  143.  
  144. struct pta_register_map {
  145.     unsigned ve : 1;
  146.     unsigned : 1;
  147.     unsigned size : 6;
  148.     unsigned vf : 1;
  149.     unsigned : 6;
  150.     unsigned long long base : 49;
  151. } __attribute__ ((packed));
  152.  
  153. typedef union pta_register {
  154.     struct pta_register_map map;
  155.     __u64 word;
  156. } pta_register;
  157.  
  158. /** Return Translation Hashed Entry Address.
  159.  *
  160.  * VRN bits are used to read RID (ASID) from one
  161.  * of the eight region registers registers.
  162.  *
  163.  * @param va Virtual address including VRN bits.
  164.  *
  165.  * @return Address of the head of VHPT collision chain.
  166.  */
  167. static inline __u64 thash(__u64 va)
  168. {
  169.     __u64 ret;
  170.  
  171.     __asm__ volatile ("thash %0 = %1\n" : "=r" (ret) : "r" (va));
  172.  
  173.     return ret;
  174. }
  175.  
  176. /** Return Translation Hashed Entry Tag.
  177.  *
  178.  * VRN bits are used to read RID (ASID) from one
  179.  * of the eight region registers.
  180.  *
  181.  * @param va Virtual address including VRN bits.
  182.  *
  183.  * @return The unique tag for VPN and RID in the collision chain returned by thash().
  184.  */
  185. static inline __u64 ttag(__u64 va)
  186. {
  187.     __u64 ret;
  188.  
  189.     __asm__ volatile ("ttag %0 = %1\n" : "=r" (ret) : "r" (va));
  190.  
  191.     return ret;
  192. }
  193.  
  194. /** Read Region Register.
  195.  *
  196.  * @param i Region register index.
  197.  *
  198.  * @return Current contents of rr[i].
  199.  */
  200. static inline __u64 rr_read(index_t i)
  201. {
  202.     __u64 ret;
  203.    
  204.     ASSERT(i < REGION_REGISTERS);
  205.     __asm__ volatile ("mov %0 = rr[%1]\n" : "=r" (ret) : "r" (i));
  206.    
  207.     return ret;
  208. }
  209.  
  210.  
  211. /** Write Region Register.
  212.  *
  213.  * @param i Region register index.
  214.  * @param v Value to be written to rr[i].
  215.  */
  216. static inline void rr_write(index_t i, __u64 v)
  217. {
  218.     ASSERT(i < REGION_REGISTERS);
  219.     __asm__ volatile ("mov rr[%0] = %1\n" : : "r" (i), "r" (v));
  220. }
  221.  
  222. /** Read Page Table Register.
  223.  *
  224.  * @return Current value stored in PTA.
  225.  */
  226. static inline __u64 pta_read(void)
  227. {
  228.     __u64 ret;
  229.    
  230.     __asm__ volatile ("mov %0 = cr.pta\n" : "=r" (ret));
  231.    
  232.     return ret;
  233. }
  234.  
  235. /** Write Page Table Register.
  236.  *
  237.  * @param v New value to be stored in PTA.
  238.  */
  239. static inline void pta_write(__u64 v)
  240. {
  241.     __asm__ volatile ("mov cr.pta = %0\n" : : "r" (v));
  242. }
  243.  
  244. extern void page_arch_init(void);
  245. extern pte_t *vhpt_hash(__address page, asid_t asid);
  246.  
  247. #endif
  248.