Subversion Repositories HelenOS

Rev

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