Rev 756 | Rev 793 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 756 | Rev 792 | ||
---|---|---|---|
Line 26... | Line 26... | ||
26 | * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
26 | * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
27 | */ |
27 | */ |
28 | 28 | ||
29 | /* |
29 | /* |
30 | * This is the generic page hash table interface. |
30 | * This is the generic page hash table interface. |
31 | * Architectures that use single page hash table for |
- | |
32 | * storing page translations must implement it. |
- | |
33 | */ |
31 | */ |
34 | 32 | ||
35 | #ifndef __PAGE_HT_H__ |
33 | #ifndef __PAGE_HT_H__ |
36 | #define __PAGE_HT_H__ |
34 | #define __PAGE_HT_H__ |
37 | 35 | ||
38 | #include <mm/page.h> |
36 | #include <mm/page.h> |
39 | #include <typedefs.h> |
37 | #include <typedefs.h> |
40 | - | ||
41 | /** Page hash table size. */ |
38 | #include <arch/types.h> |
42 | #define HT_WIDTH HT_WIDTH_ARCH |
- | |
43 | #define HT_SIZE (1<<HT_WIDTH) |
- | |
44 | #define HT_ENTRIES (HT_SIZE/sizeof(pte_t)) |
- | |
45 | - | ||
46 | /** Hash function. |
39 | #include <adt/list.h> |
47 | * |
- | |
48 | * @param page Virtual address. Only vpn bits will be used. |
- | |
49 | * @param asid Address space identifier. |
- | |
50 | * |
- | |
51 | * @return Pointer to hash table typed pte_t *. |
40 | #include <adt/hash_table.h> |
52 | */ |
- | |
53 | #define HT_HASH(page, asid) HT_HASH_ARCH(page, asid) |
- | |
54 | 41 | ||
55 | /** Compare PTE with page and asid. |
42 | #define PAGE_HT_KEYS 2 |
56 | * |
- | |
57 | * @param page Virtual address. Only vpn bits will be used. |
- | |
58 | * @param asid Address space identifier. |
43 | #define KEY_AS 0 |
59 | * @param t PTE. |
44 | #define KEY_PAGE 1 |
60 | * |
- | |
61 | * @return 1 on match, 0 otherwise. |
- | |
62 | */ |
- | |
63 | #define HT_COMPARE(page, asid, t) HT_COMPARE_ARCH(page, asid, t) |
- | |
64 | 45 | ||
65 | /** Identify empty page hash table slots. |
- | |
66 | * |
- | |
67 | * @param t Pointer ro hash table typed pte_t *. |
- | |
68 | * |
- | |
69 | * @return 1 if the slot is empty, 0 otherwise. |
- | |
70 | */ |
- | |
71 | #define HT_SLOT_EMPTY(t) HT_SLOT_EMPTY_ARCH(t) |
46 | #define PAGE_HT_ENTRIES_BITS 13 |
72 | - | ||
73 | /** Invalidate/empty page hash table slot. |
- | |
74 | * |
- | |
75 | * @param t Address of the slot to be invalidated. |
- | |
76 | */ |
- | |
77 | #define HT_INVALIDATE_SLOT(t) HT_INVALIDATE_SLOT_ARCH(t) |
47 | #define PAGE_HT_ENTRIES (1<<PAGE_HT_ENTRIES_BITS) |
78 | 48 | ||
79 | /** Return next record in collision chain. |
- | |
80 | * |
- | |
81 | * @param t PTE. |
49 | struct pte { |
82 | * |
- | |
83 | * @return Successor of PTE or NULL. |
- | |
84 | */ |
- | |
85 | #define HT_GET_NEXT(t) HT_GET_NEXT_ARCH(t) |
- | |
86 | - | ||
87 | /** Set successor in collision chain. |
50 | link_t link; /**< Page hash table link. */ |
88 | * |
- | |
89 | * @param t PTE. |
- | |
90 | * @param s Successor or NULL. |
51 | as_t *as; /**< Address space. */ |
91 | */ |
- | |
92 | #define HT_SET_NEXT(t, s) HT_SET_NEXT_ARCH(t, s) |
52 | __address page; /**< Virtual memory page. */ |
93 | - | ||
94 | /** Set page hash table record. |
53 | __address frame; /**< Physical memory frame. */ |
95 | * |
- | |
96 | * @param t PTE. |
54 | int flags; |
97 | * @param page Virtual address. Only vpn bits will be used. |
- | |
98 | * @param asid Address space identifier. |
55 | unsigned a : 1; /**< Accessed. */ |
99 | * @param frame Physical address. Only pfn bits will be used. |
56 | unsigned d : 1; /**< Dirty. */ |
100 | * @param flags Flags. See mm/page.h. |
57 | unsigned p : 1; /**< Present. */ |
101 | */ |
58 | }; |
102 | #define HT_SET_RECORD(t, page, asid, frame, flags) HT_SET_RECORD_ARCH(t, page, asid, frame, flags) |
- | |
103 | 59 | ||
104 | extern page_operations_t page_ht_operations; |
60 | extern page_operations_t page_ht_operations; |
105 | extern spinlock_t page_ht_lock; |
61 | extern spinlock_t page_ht_lock; |
106 | 62 | ||
107 | extern pte_t *page_ht; |
63 | extern hash_table_t page_ht; |
108 | - | ||
109 | extern void ht_invalidate_all(void); |
64 | extern hash_table_operations_t ht_operations; |
110 | 65 | ||
111 | #endif |
66 | #endif |