Subversion Repositories HelenOS-historic

Rev

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

Rev Author Line No. Line
35 jermar 1
/*
747 jermar 2
 * Copyright (C) 2005 - 2006 Jakub Jermar
3
 * Copyright (C) 2006 Jakub Vana
35 jermar 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
 
747 jermar 33
#include <arch/mm/frame.h>
34
#include <genarch/mm/page_ht.h>
121 jermar 35
#include <arch/types.h>
747 jermar 36
#include <typedefs.h>
37
#include <debug.h>
35 jermar 38
 
39
#define PAGE_SIZE   FRAME_SIZE
715 vana 40
#define PAGE_WIDTH  FRAME_WIDTH
35 jermar 41
 
537 jermar 42
#define KA2PA(x)    ((__address) (x))
43
#define PA2KA(x)    ((__address) (x))
35 jermar 44
 
125 jermar 45
#define GET_PTL0_ADDRESS_ARCH()         ((pte_t *) 0)
120 jermar 46
#define SET_PTL0_ADDRESS_ARCH(ptl0)
47
 
699 jermar 48
/** Implementation of page hash table interface. */
748 jermar 49
#define HT_ENTRIES_ARCH         (VHPT_SIZE/sizeof(pte_t))
50
#define HT_HASH_ARCH(page, asid)    vhpt_hash((page), (asid))
699 jermar 51
#define HT_COMPARE_ARCH(page, asid, t)  0
52
#define HT_SLOT_EMPTY_ARCH(t)       1
746 jermar 53
#define HT_INVALIDATE_SLOT_ARCH(t)
699 jermar 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
 
748 jermar 58
#define VRN_SHIFT           61
59
#define VRN_MASK            (7LL << VRN_SHIFT)
60
 
747 jermar 61
#define VRN_KERNEL          0
748 jermar 62
#define VRN_WORK            1LL
747 jermar 63
#define REGION_REGISTERS        8
715 vana 64
 
747 jermar 65
#define VHPT_WIDTH          20          /* 1M */
66
#define VHPT_SIZE           (1<<VHPT_WIDTH)
715 vana 67
 
747 jermar 68
#define VHPT_BASE           page_ht     /* Must be aligned to VHPT_SIZE */
715 vana 69
 
747 jermar 70
struct vhpt_tag_info {
71
    unsigned long long tag : 63;
72
    unsigned ti : 1;
73
} __attribute__ ((packed));
710 vana 74
 
747 jermar 75
union vhpt_tag {
76
    struct vhpt_tag_info tag_info;
77
    unsigned tag_word;
710 vana 78
};
79
 
747 jermar 80
struct vhpt_entry_present {
710 vana 81
    /* Word 0 */
747 jermar 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;
710 vana 93
 
94
    /* Word 1 */
747 jermar 95
    unsigned : 2;
96
    unsigned ps : 6;
97
    unsigned key : 24;
98
    unsigned : 32;
710 vana 99
 
100
    /* Word 2 */
747 jermar 101
    union vhpt_tag tag;
102
 
710 vana 103
    /* Word 3 */                                                   
747 jermar 104
    unsigned long long next : 64;   /**< Collision chain next pointer. */
105
} __attribute__ ((packed));
710 vana 106
 
747 jermar 107
struct vhpt_entry_not_present {
710 vana 108
    /* Word 0 */
747 jermar 109
    unsigned p : 1;
110
    unsigned long long ig0 : 52;
111
    unsigned ig1 : 11;
710 vana 112
 
113
    /* Word 1 */
747 jermar 114
    unsigned : 2;
115
    unsigned ps : 6;
116
    unsigned long long ig2 : 56;
710 vana 117
 
747 jermar 118
    /* Word 2 */
119
    union vhpt_tag tag;
710 vana 120
 
121
    /* Word 3 */                                                   
747 jermar 122
    unsigned long long next : 64;   /**< Collision chain next pointer. */
710 vana 123
 
747 jermar 124
} __attribute__ ((packed));
710 vana 125
 
747 jermar 126
typedef union vhpt_entry {
127
    struct vhpt_entry_present present;
128
    struct vhpt_entry_not_present not_present;
129
} vhpt_entry;
710 vana 130
 
747 jermar 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));
684 jermar 138
 
747 jermar 139
typedef union region_register {
140
    struct region_register_map map;
141
    unsigned long long word;
142
} region_register;
715 vana 143
 
747 jermar 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)
715 vana 168
{
747 jermar 169
    __u64 ret;
715 vana 170
 
747 jermar 171
    __asm__ volatile ("thash %0 = %1\n" : "=r" (ret) : "r" (va));
715 vana 172
 
747 jermar 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)
715 vana 186
{
747 jermar 187
    __u64 ret;
715 vana 188
 
747 jermar 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)
715 vana 201
{
747 jermar 202
    __u64 ret;
203
 
748 jermar 204
    ASSERT(i < REGION_REGISTERS);
747 jermar 205
    __asm__ volatile ("mov %0 = rr[%1]\n" : "=r" (ret) : "r" (i));
206
 
207
    return ret;
208
}
715 vana 209
 
210
 
747 jermar 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)
715 vana 217
{
748 jermar 218
    ASSERT(i < REGION_REGISTERS);
747 jermar 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
}
715 vana 234
 
747 jermar 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
}
715 vana 243
 
747 jermar 244
extern void page_arch_init(void);
748 jermar 245
extern pte_t *vhpt_hash(__address page, asid_t asid);
747 jermar 246
 
35 jermar 247
#endif