2
* Copyright (c) 2005 - 2006 Jakub Jermar
3
* Copyright (c) 2006 Jakub Vana
6
* Redistribution and use in source and binary forms, with or without
7
* modification, are permitted provided that the following conditions
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.
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.
30
/** @addtogroup ia64mm
36
#ifndef KERN_ia64_PAGE_H_
37
#define KERN_ia64_PAGE_H_
39
#include <arch/mm/frame.h>
41
#define PAGE_SIZE FRAME_SIZE
42
#define PAGE_WIDTH FRAME_WIDTH
46
/** Bit width of the TLB-locked portion of kernel address space. */
47
#define KERNEL_PAGE_WIDTH 28 /* 256M */
48
#define IO_PAGE_WIDTH 26 /* 64M */
49
#define FW_PAGE_WIDTH 28 /* 256M */
51
#define USPACE_IO_PAGE_WIDTH 12 /* 4K */
55
* Statically mapped IO spaces - offsets to 0xe...00 of virtual addresses
56
* because of "minimal virtual bits implemented is 51" it is possible to
57
* have values up to 0x0007000000000000
60
/* Firmware area (bellow 4GB in phys mem) */
61
#define FW_OFFSET 0x00000000F0000000
63
#define IO_OFFSET 0x0001000000000000
64
/* Videoram - now mapped to 0 as VGA text mode vram on 0xb8000 */
65
#define VIO_OFFSET 0x0002000000000000
71
#define VRN_MASK (7LL << VRN_SHIFT)
72
#define VA2VRN(va) ((va)>>VRN_SHIFT)
77
#define VRN_KERNEL 7LL
80
#define REGION_REGISTERS 8
82
#define KA2PA(x) ((uintptr_t) (x - (VRN_KERNEL << VRN_SHIFT)))
83
#define PA2KA(x) ((uintptr_t) (x + (VRN_KERNEL << VRN_SHIFT)))
85
#define VHPT_WIDTH 20 /* 1M */
86
#define VHPT_SIZE (1 << VHPT_WIDTH)
88
#define PTA_BASE_SHIFT 15
90
/** Memory Attributes. */
91
#define MA_WRITEBACK 0x0
92
#define MA_UNCACHEABLE 0x4
94
/** Privilege Levels. Only the most and the least privileged ones are ever used. */
98
/* Access Rigths. Only certain combinations are used by the kernel. */
100
#define AR_EXECUTE 0x1
105
#include <arch/mm/as.h>
106
#include <arch/mm/frame.h>
107
#include <arch/interrupt.h>
108
#include <arch/barrier.h>
109
#include <arch/mm/asid.h>
110
#include <arch/types.h>
113
struct vhpt_tag_info {
114
unsigned long long tag : 63;
116
} __attribute__ ((packed));
119
struct vhpt_tag_info tag_info;
123
struct vhpt_entry_present {
132
unsigned long long ppn : 38;
148
} __attribute__ ((packed));
150
struct vhpt_entry_not_present {
153
unsigned long long ig0 : 52;
159
unsigned long long ig2 : 56;
166
} __attribute__ ((packed));
168
typedef union vhpt_entry {
169
struct vhpt_entry_present present;
170
struct vhpt_entry_not_present not_present;
174
struct region_register_map {
180
} __attribute__ ((packed));
182
typedef union region_register {
183
struct region_register_map map;
184
unsigned long long word;
187
struct pta_register_map {
193
unsigned long long base : 49;
194
} __attribute__ ((packed));
196
typedef union pta_register {
197
struct pta_register_map map;
201
/** Return Translation Hashed Entry Address.
203
* VRN bits are used to read RID (ASID) from one
204
* of the eight region registers registers.
206
* @param va Virtual address including VRN bits.
208
* @return Address of the head of VHPT collision chain.
210
static inline uint64_t thash(uint64_t va)
214
asm volatile ("thash %0 = %1\n" : "=r" (ret) : "r" (va));
219
/** Return Translation Hashed Entry Tag.
221
* VRN bits are used to read RID (ASID) from one
222
* of the eight region registers.
224
* @param va Virtual address including VRN bits.
226
* @return The unique tag for VPN and RID in the collision chain returned by thash().
228
static inline uint64_t ttag(uint64_t va)
232
asm volatile ("ttag %0 = %1\n" : "=r" (ret) : "r" (va));
237
/** Read Region Register.
239
* @param i Region register index.
241
* @return Current contents of rr[i].
243
static inline uint64_t rr_read(size_t i)
246
ASSERT(i < REGION_REGISTERS);
247
asm volatile ("mov %0 = rr[%1]\n" : "=r" (ret) : "r" (i << VRN_SHIFT));
251
/** Write Region Register.
253
* @param i Region register index.
254
* @param v Value to be written to rr[i].
256
static inline void rr_write(size_t i, uint64_t v)
258
ASSERT(i < REGION_REGISTERS);
262
: "r" (i << VRN_SHIFT), "r" (v)
266
/** Read Page Table Register.
268
* @return Current value stored in PTA.
270
static inline uint64_t pta_read(void)
274
asm volatile ("mov %0 = cr.pta\n" : "=r" (ret));
279
/** Write Page Table Register.
281
* @param v New value to be stored in PTA.
283
static inline void pta_write(uint64_t v)
285
asm volatile ("mov cr.pta = %0\n" : : "r" (v));
288
extern void page_arch_init(void);
290
extern vhpt_entry_t *vhpt_hash(uintptr_t page, asid_t asid);
291
extern bool vhpt_compare(uintptr_t page, asid_t asid, vhpt_entry_t *v);
292
extern void vhpt_set_record(vhpt_entry_t *v, uintptr_t page, asid_t asid, uintptr_t frame, int flags);