Subversion Repositories HelenOS-historic

Rev

Rev 748 | Rev 751 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 748 Rev 749
Line 30... Line 30...
30
#ifndef __ia64_PAGE_H__
30
#ifndef __ia64_PAGE_H__
31
#define __ia64_PAGE_H__
31
#define __ia64_PAGE_H__
32
 
32
 
33
#include <arch/mm/frame.h>
33
#include <arch/mm/frame.h>
34
#include <genarch/mm/page_ht.h>
34
#include <genarch/mm/page_ht.h>
-
 
35
#include <arch/mm/asid.h>
35
#include <arch/types.h>
36
#include <arch/types.h>
36
#include <typedefs.h>
37
#include <typedefs.h>
37
#include <debug.h>
38
#include <debug.h>
38
 
39
 
39
#define PAGE_SIZE   FRAME_SIZE
40
#define PAGE_SIZE   FRAME_SIZE
Line 44... Line 45...
44
 
45
 
45
#define GET_PTL0_ADDRESS_ARCH()         ((pte_t *) 0)
46
#define GET_PTL0_ADDRESS_ARCH()         ((pte_t *) 0)
46
#define SET_PTL0_ADDRESS_ARCH(ptl0)
47
#define SET_PTL0_ADDRESS_ARCH(ptl0)
47
 
48
 
48
/** Implementation of page hash table interface. */
49
/** Implementation of page hash table interface. */
49
#define HT_ENTRIES_ARCH         (VHPT_SIZE/sizeof(pte_t))
50
#define HT_ENTRIES_ARCH                 (VHPT_SIZE/sizeof(pte_t))
50
#define HT_HASH_ARCH(page, asid)    vhpt_hash((page), (asid))
51
#define HT_HASH_ARCH(page, asid)            vhpt_hash((page), (asid))
51
#define HT_COMPARE_ARCH(page, asid, t)  0
52
#define HT_COMPARE_ARCH(page, asid, t)          vhpt_compare((page), (asid), (t))
52
#define HT_SLOT_EMPTY_ARCH(t)       1
53
#define HT_SLOT_EMPTY_ARCH(t)               ((t)->present.tag.tag_info.ti)
53
#define HT_INVALIDATE_SLOT_ARCH(t)
54
#define HT_INVALIDATE_SLOT_ARCH(t)          (t)->present.tag.tag_info.ti = true
54
#define HT_GET_NEXT_ARCH(t)     0
55
#define HT_GET_NEXT_ARCH(t)             (t)->present.next
55
#define HT_SET_NEXT_ARCH(t, s)
56
#define HT_SET_NEXT_ARCH(t, s)              (t)->present.next = (s)
56
#define HT_SET_RECORD_ARCH(t, page, asid, frame, flags)
57
#define HT_SET_RECORD_ARCH(t, page, asid, frame, flags) vhpt_set_record(t, page, asid, frame, flags)
-
 
58
 
-
 
59
#define PPN_SHIFT           12
57
 
60
 
58
#define VRN_SHIFT           61
61
#define VRN_SHIFT           61
59
#define VRN_MASK            (7LL << VRN_SHIFT)
62
#define VRN_MASK            (7LL << VRN_SHIFT)
60
 
63
 
61
#define VRN_KERNEL          0
64
#define VRN_KERNEL          0
62
#define VRN_WORK            1LL
-
 
63
#define REGION_REGISTERS        8
65
#define REGION_REGISTERS        8
64
 
66
 
65
#define VHPT_WIDTH          20          /* 1M */
67
#define VHPT_WIDTH          20          /* 1M */
66
#define VHPT_SIZE           (1<<VHPT_WIDTH)
68
#define VHPT_SIZE           (1<<VHPT_WIDTH)
67
 
69
 
68
#define VHPT_BASE           page_ht     /* Must be aligned to VHPT_SIZE */
70
#define VHPT_BASE           page_ht     /* Must be aligned to VHPT_SIZE */
69
 
71
 
-
 
72
/** Memory Attributes. */
-
 
73
#define MA_WRITEBACK    0x0
-
 
74
#define MA_UNCACHEABLE  0x4
-
 
75
 
-
 
76
/** Privilege Levels. Only the most and the least privileged ones are ever used. */
-
 
77
#define PL_KERNEL   0x0
-
 
78
#define PL_USER     0x3
-
 
79
 
-
 
80
/* Access Rigths. Only certain combinations are used by the kernel. */
-
 
81
#define AR_READ     0x0
-
 
82
#define AR_EXECUTE  0x1
-
 
83
#define AR_WRITE    0x2
-
 
84
 
70
struct vhpt_tag_info {
85
struct vhpt_tag_info {
71
    unsigned long long tag : 63;
86
    unsigned long long tag : 63;
72
    unsigned ti : 1;
87
    unsigned ti : 1;
73
} __attribute__ ((packed));
88
} __attribute__ ((packed));
74
 
89
 
Line 99... Line 114...
99
   
114
   
100
    /* Word 2 */
115
    /* Word 2 */
101
    union vhpt_tag tag;
116
    union vhpt_tag tag;
102
   
117
   
103
    /* Word 3 */                                                   
118
    /* Word 3 */                                                   
104
    unsigned long long next : 64;   /**< Collision chain next pointer. */
119
    pte_t *next;            /**< Collision chain next pointer. */
105
} __attribute__ ((packed));
120
} __attribute__ ((packed));
106
 
121
 
107
struct vhpt_entry_not_present {
122
struct vhpt_entry_not_present {
108
    /* Word 0 */
123
    /* Word 0 */
109
    unsigned p : 1;
124
    unsigned p : 1;
Line 117... Line 132...
117
 
132
 
118
    /* Word 2 */
133
    /* Word 2 */
119
    union vhpt_tag tag;
134
    union vhpt_tag tag;
120
   
135
   
121
    /* Word 3 */                                                   
136
    /* Word 3 */                                                   
122
    unsigned long long next : 64;   /**< Collision chain next pointer. */
137
    pte_t *next;            /**< Collision chain next pointer. */
123
   
138
   
124
} __attribute__ ((packed));
139
} __attribute__ ((packed));
125
 
140
 
126
typedef union vhpt_entry {
141
typedef union vhpt_entry {
127
    struct vhpt_entry_present present;
142
    struct vhpt_entry_present present;
128
    struct vhpt_entry_not_present not_present;
143
    struct vhpt_entry_not_present not_present;
-
 
144
    __u64 word[4];
129
} vhpt_entry;
145
} vhpt_entry;
130
 
146
 
131
struct region_register_map {
147
struct region_register_map {
132
    unsigned ve : 1;
148
    unsigned ve : 1;
133
    unsigned : 1;
149
    unsigned : 1;
Line 241... Line 257...
241
    __asm__ volatile ("mov cr.pta = %0\n" : : "r" (v));
257
    __asm__ volatile ("mov cr.pta = %0\n" : : "r" (v));
242
}
258
}
243
 
259
 
244
extern void page_arch_init(void);
260
extern void page_arch_init(void);
245
extern pte_t *vhpt_hash(__address page, asid_t asid);
261
extern pte_t *vhpt_hash(__address page, asid_t asid);
-
 
262
extern bool vhpt_compare(__address page, asid_t asid, pte_t *t);
-
 
263
extern void vhpt_set_record(pte_t *t, __address page, asid_t asid, __address frame, int flags);
246
 
264
 
247
#endif
265
#endif