Subversion Repositories HelenOS

Rev

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

Rev Author Line No. Line
35 jermar 1
/*
2071 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
 
1780 jermar 30
/** @addtogroup ia64mm 
1702 cejka 31
 * @{
32
 */
33
/** @file
34
 */
35
 
1888 jermar 36
#ifndef KERN_ia64_PAGE_H_
37
#define KERN_ia64_PAGE_H_
35 jermar 38
 
967 palkovsky 39
#include <arch/mm/frame.h>
40
 
35 jermar 41
#define PAGE_SIZE   FRAME_SIZE
715 vana 42
#define PAGE_WIDTH  FRAME_WIDTH
35 jermar 43
 
2007 jermar 44
#define PAGE_COLOR_BITS 0           /* dummy */
967 palkovsky 45
 
46
#ifdef KERNEL
47
 
901 jermar 48
/** Bit width of the TLB-locked portion of kernel address space. */
2007 jermar 49
#define KERNEL_PAGE_WIDTH       28  /* 256M */
2726 vana 50
#define IO_PAGE_WIDTH           26  /* 64M */
35 jermar 51
 
2726 vana 52
 
749 jermar 53
#define PPN_SHIFT           12
54
 
748 jermar 55
#define VRN_SHIFT           61
56
#define VRN_MASK            (7LL << VRN_SHIFT)
901 jermar 57
#define VA2VRN(va)          ((va)>>VRN_SHIFT)
869 vana 58
 
59
#ifdef __ASM__
60
#define VRN_KERNEL          7
61
#else
62
#define VRN_KERNEL          7LL
63
#endif
64
 
747 jermar 65
#define REGION_REGISTERS        8
715 vana 66
 
1780 jermar 67
#define KA2PA(x)    ((uintptr_t) (x-(VRN_KERNEL<<VRN_SHIFT)))
68
#define PA2KA(x)    ((uintptr_t) (x+(VRN_KERNEL<<VRN_SHIFT)))
869 vana 69
 
2007 jermar 70
#define VHPT_WIDTH          20  /* 1M */
792 jermar 71
#define VHPT_SIZE           (1 << VHPT_WIDTH)
715 vana 72
 
751 jermar 73
#define PTA_BASE_SHIFT          15
74
 
749 jermar 75
/** Memory Attributes. */
76
#define MA_WRITEBACK    0x0
77
#define MA_UNCACHEABLE  0x4
78
 
79
/** Privilege Levels. Only the most and the least privileged ones are ever used. */
80
#define PL_KERNEL   0x0
81
#define PL_USER     0x3
82
 
83
/* Access Rigths. Only certain combinations are used by the kernel. */
84
#define AR_READ     0x0
85
#define AR_EXECUTE  0x1
86
#define AR_WRITE    0x2
87
 
901 jermar 88
#ifndef __ASM__
818 vana 89
 
2089 decky 90
#include <arch/mm/as.h>
901 jermar 91
#include <arch/mm/frame.h>
2089 decky 92
#include <arch/interrupt.h>
901 jermar 93
#include <arch/barrier.h>
94
#include <arch/mm/asid.h>
95
#include <arch/types.h>
96
#include <debug.h>
818 vana 97
 
747 jermar 98
struct vhpt_tag_info {
99
    unsigned long long tag : 63;
100
    unsigned ti : 1;
101
} __attribute__ ((packed));
710 vana 102
 
747 jermar 103
union vhpt_tag {
104
    struct vhpt_tag_info tag_info;
105
    unsigned tag_word;
710 vana 106
};
107
 
747 jermar 108
struct vhpt_entry_present {
710 vana 109
    /* Word 0 */
747 jermar 110
    unsigned p : 1;
111
    unsigned : 1;
112
    unsigned ma : 3;
113
    unsigned a : 1;
114
    unsigned d : 1;
115
    unsigned pl : 2;
116
    unsigned ar : 3;
117
    unsigned long long ppn : 38;
118
    unsigned : 2;
119
    unsigned ed : 1;
120
    unsigned ig1 : 11;
710 vana 121
 
122
    /* Word 1 */
747 jermar 123
    unsigned : 2;
124
    unsigned ps : 6;
125
    unsigned key : 24;
126
    unsigned : 32;
710 vana 127
 
128
    /* Word 2 */
747 jermar 129
    union vhpt_tag tag;
130
 
710 vana 131
    /* Word 3 */                                                   
1780 jermar 132
    uint64_t ig3 : 64;
747 jermar 133
} __attribute__ ((packed));
710 vana 134
 
747 jermar 135
struct vhpt_entry_not_present {
710 vana 136
    /* Word 0 */
747 jermar 137
    unsigned p : 1;
138
    unsigned long long ig0 : 52;
139
    unsigned ig1 : 11;
710 vana 140
 
141
    /* Word 1 */
747 jermar 142
    unsigned : 2;
143
    unsigned ps : 6;
144
    unsigned long long ig2 : 56;
710 vana 145
 
747 jermar 146
    /* Word 2 */
147
    union vhpt_tag tag;
710 vana 148
 
149
    /* Word 3 */                                                   
1780 jermar 150
    uint64_t ig3 : 64;
747 jermar 151
} __attribute__ ((packed));
710 vana 152
 
747 jermar 153
typedef union vhpt_entry {
154
    struct vhpt_entry_present present;
155
    struct vhpt_entry_not_present not_present;
1780 jermar 156
    uint64_t word[4];
792 jermar 157
} vhpt_entry_t;
710 vana 158
 
747 jermar 159
struct region_register_map {
160
    unsigned ve : 1;
161
    unsigned : 1;
162
    unsigned ps : 6;
163
    unsigned rid : 24;
164
    unsigned : 32;
165
} __attribute__ ((packed));
684 jermar 166
 
747 jermar 167
typedef union region_register {
168
    struct region_register_map map;
169
    unsigned long long word;
170
} region_register;
715 vana 171
 
747 jermar 172
struct pta_register_map {
173
    unsigned ve : 1;
174
    unsigned : 1;
175
    unsigned size : 6;
176
    unsigned vf : 1;
177
    unsigned : 6;
178
    unsigned long long base : 49;
179
} __attribute__ ((packed));
180
 
181
typedef union pta_register {
182
    struct pta_register_map map;
1780 jermar 183
    uint64_t word;
747 jermar 184
} pta_register;
185
 
186
/** Return Translation Hashed Entry Address.
187
 *
188
 * VRN bits are used to read RID (ASID) from one
189
 * of the eight region registers registers.
190
 *
191
 * @param va Virtual address including VRN bits.
192
 *
193
 * @return Address of the head of VHPT collision chain.
194
 */
1780 jermar 195
static inline uint64_t thash(uint64_t va)
715 vana 196
{
1780 jermar 197
    uint64_t ret;
715 vana 198
 
2082 decky 199
    asm volatile ("thash %0 = %1\n" : "=r" (ret) : "r" (va));
715 vana 200
 
747 jermar 201
    return ret;
202
}
203
 
204
/** Return Translation Hashed Entry Tag.
205
 *
206
 * VRN bits are used to read RID (ASID) from one
207
 * of the eight region registers.
208
 *
209
 * @param va Virtual address including VRN bits.
210
 *
211
 * @return The unique tag for VPN and RID in the collision chain returned by thash().
212
 */
1780 jermar 213
static inline uint64_t ttag(uint64_t va)
715 vana 214
{
1780 jermar 215
    uint64_t ret;
715 vana 216
 
2082 decky 217
    asm volatile ("ttag %0 = %1\n" : "=r" (ret) : "r" (va));
747 jermar 218
 
219
    return ret;
220
}
221
 
222
/** Read Region Register.
223
 *
224
 * @param i Region register index.
225
 *
226
 * @return Current contents of rr[i].
227
 */
1780 jermar 228
static inline uint64_t rr_read(index_t i)
715 vana 229
{
1780 jermar 230
    uint64_t ret;
748 jermar 231
    ASSERT(i < REGION_REGISTERS);
2082 decky 232
    asm volatile ("mov %0 = rr[%1]\n" : "=r" (ret) : "r" (i << VRN_SHIFT));
747 jermar 233
    return ret;
234
}
715 vana 235
 
747 jermar 236
/** Write Region Register.
237
 *
238
 * @param i Region register index.
239
 * @param v Value to be written to rr[i].
240
 */
1780 jermar 241
static inline void rr_write(index_t i, uint64_t v)
715 vana 242
{
748 jermar 243
    ASSERT(i < REGION_REGISTERS);
2082 decky 244
    asm volatile (
901 jermar 245
        "mov rr[%0] = %1\n"
246
        :
247
        : "r" (i << VRN_SHIFT), "r" (v)
248
    );
747 jermar 249
}
250
 
251
/** Read Page Table Register.
252
 *
253
 * @return Current value stored in PTA.
254
 */
1780 jermar 255
static inline uint64_t pta_read(void)
747 jermar 256
{
1780 jermar 257
    uint64_t ret;
747 jermar 258
 
2082 decky 259
    asm volatile ("mov %0 = cr.pta\n" : "=r" (ret));
747 jermar 260
 
261
    return ret;
262
}
715 vana 263
 
747 jermar 264
/** Write Page Table Register.
265
 *
266
 * @param v New value to be stored in PTA.
267
 */
1780 jermar 268
static inline void pta_write(uint64_t v)
747 jermar 269
{
2082 decky 270
    asm volatile ("mov cr.pta = %0\n" : : "r" (v));
747 jermar 271
}
715 vana 272
 
747 jermar 273
extern void page_arch_init(void);
274
 
1780 jermar 275
extern vhpt_entry_t *vhpt_hash(uintptr_t page, asid_t asid);
276
extern bool vhpt_compare(uintptr_t page, asid_t asid, vhpt_entry_t *v);
277
extern void vhpt_set_record(vhpt_entry_t *v, uintptr_t page, asid_t asid, uintptr_t frame, int flags);
792 jermar 278
 
967 palkovsky 279
#endif /* __ASM__ */
869 vana 280
 
967 palkovsky 281
#endif /* KERNEL */
282
 
869 vana 283
#endif
1702 cejka 284
 
1780 jermar 285
/** @}
1702 cejka 286
 */