Subversion Repositories HelenOS-historic

Compare Revisions

Ignore whitespace Rev 792 → Rev 786

/kernel/trunk/arch/ia64/src/mm/page.c
42,7 → 42,7
#include <arch/barrier.h>
#include <memstr.h>
 
static void set_environment(void);
static void set_vhpt_environment(void);
 
/** Initialize ia64 virtual address translation subsystem. */
void page_arch_init(void)
49,11 → 49,11
{
page_operations = &page_ht_operations;
pk_disable();
set_environment();
set_vhpt_environment();
}
 
/** Initialize VHPT and region registers. */
void set_environment(void)
void set_vhpt_environment(void)
{
region_register rr;
pta_register pta;
87,6 → 87,13
}
 
/*
* Allocate VHPT and invalidate all its entries.
*/
page_ht = (pte_t *) frame_alloc(VHPT_WIDTH - FRAME_WIDTH, FRAME_KA);
memsetb((__address) page_ht, VHPT_SIZE, 0);
ht_invalidate_all();
/*
* Set up PTA register.
*/
pta.word = pta_read();
93,7 → 100,7
pta.map.ve = 0; /* disable VHPT walker */
pta.map.vf = 1; /* large entry format */
pta.map.size = VHPT_WIDTH;
pta.map.base = VHPT_BASE >> PTA_BASE_SHIFT;
pta.map.base = ((__address) page_ht) >> PTA_BASE_SHIFT;
pta_write(pta.word);
srlz_i();
srlz_d();
106,14 → 113,14
* @param page Address of virtual page including VRN bits.
* @param asid Address space identifier.
*
* @return VHPT entry address.
* @return Head of VHPT collision chain for page and asid.
*/
vhpt_entry_t *vhpt_hash(__address page, asid_t asid)
pte_t *vhpt_hash(__address page, asid_t asid)
{
region_register rr_save, rr;
index_t vrn;
rid_t rid;
vhpt_entry_t *v;
pte_t *t;
 
vrn = page >> VRN_SHIFT;
rid = ASID2RID(asid, vrn);
123,8 → 130,8
/*
* The RID is already in place, compute thash and return.
*/
v = (vhpt_entry_t *) thash(page);
return v;
t = (pte_t *) thash(page);
return t;
}
/*
135,12 → 142,12
rr.map.rid = rid;
rr_write(vrn, rr.word);
srlz_i();
v = (vhpt_entry_t *) thash(page);
t = (pte_t *) thash(page);
rr_write(vrn, rr_save.word);
srlz_i();
srlz_d();
 
return v;
return t;
}
 
/** Compare ASID and VPN against PTE.
152,7 → 159,7
*
* @return True if page and asid match the page and asid of t, false otherwise.
*/
bool vhpt_compare(__address page, asid_t asid, vhpt_entry_t *v)
bool vhpt_compare(__address page, asid_t asid, pte_t *t)
{
region_register rr_save, rr;
index_t vrn;
159,7 → 166,7
rid_t rid;
bool match;
 
ASSERT(v);
ASSERT(t);
 
vrn = page >> VRN_SHIFT;
rid = ASID2RID(asid, vrn);
169,7 → 176,7
/*
* The RID is already in place, compare ttag with t and return.
*/
return ttag(page) == v->present.tag.tag_word;
return ttag(page) == t->present.tag.tag_word;
}
/*
180,7 → 187,7
rr.map.rid = rid;
rr_write(vrn, rr.word);
srlz_i();
match = (ttag(page) == v->present.tag.tag_word);
match = (ttag(page) == t->present.tag.tag_word);
rr_write(vrn, rr_save.word);
srlz_i();
srlz_d();
196,7 → 203,7
* @param frame Physical address of the frame to wich page is mapped.
* @param flags Different flags for the mapping.
*/
void vhpt_set_record(vhpt_entry_t *v, __address page, asid_t asid, __address frame, int flags)
void vhpt_set_record(pte_t *t, __address page, asid_t asid, __address frame, int flags)
{
region_register rr_save, rr;
index_t vrn;
203,7 → 210,7
rid_t rid;
__u64 tag;
 
ASSERT(v);
ASSERT(t);
 
vrn = page >> VRN_SHIFT;
rid = ASID2RID(asid, vrn);
224,21 → 231,22
/*
* Clear the entry.
*/
v->word[0] = 0;
v->word[1] = 0;
v->word[2] = 0;
v->word[3] = 0;
t->word[0] = 0;
t->word[1] = 0;
t->word[2] = 0;
t->word[3] = 0;
v->present.p = true;
v->present.ma = (flags & PAGE_CACHEABLE) ? MA_WRITEBACK : MA_UNCACHEABLE;
v->present.a = false; /* not accessed */
v->present.d = false; /* not dirty */
v->present.pl = (flags & PAGE_USER) ? PL_USER : PL_KERNEL;
v->present.ar = (flags & PAGE_WRITE) ? AR_WRITE : AR_READ;
v->present.ar |= (flags & PAGE_EXEC) ? AR_EXECUTE : 0;
v->present.ppn = frame >> PPN_SHIFT;
v->present.ed = false; /* exception not deffered */
v->present.ps = PAGE_WIDTH;
v->present.key = 0;
v->present.tag.tag_word = tag;
t->present.p = true;
t->present.ma = (flags & PAGE_CACHEABLE) ? MA_WRITEBACK : MA_UNCACHEABLE;
t->present.a = false; /* not accessed */
t->present.d = false; /* not dirty */
t->present.pl = (flags & PAGE_USER) ? PL_USER : PL_KERNEL;
t->present.ar = (flags & PAGE_WRITE) ? AR_WRITE : AR_READ;
t->present.ar |= (flags & PAGE_EXEC) ? AR_EXECUTE : 0;
t->present.ppn = frame >> PPN_SHIFT;
t->present.ed = false; /* exception not deffered */
t->present.ps = PAGE_WIDTH;
t->present.key = 0;
t->present.tag.tag_word = tag;
t->present.next = NULL;
}
/kernel/trunk/arch/ia64/include/mm/page.h
45,6 → 45,16
 
#define SET_PTL0_ADDRESS_ARCH(x) /**< To be removed as situation permits. */
 
/** Implementation of page hash table interface. */
#define HT_WIDTH_ARCH 20 /* 1M */
#define HT_HASH_ARCH(page, asid) vhpt_hash((page), (asid))
#define HT_COMPARE_ARCH(page, asid, t) vhpt_compare((page), (asid), (t))
#define HT_SLOT_EMPTY_ARCH(t) ((t)->present.tag.tag_info.ti)
#define HT_INVALIDATE_SLOT_ARCH(t) (t)->present.tag.tag_info.ti = true
#define HT_GET_NEXT_ARCH(t) (t)->present.next
#define HT_SET_NEXT_ARCH(t, s) (t)->present.next = (s)
#define HT_SET_RECORD_ARCH(t, page, asid, frame, flags) vhpt_set_record(t, page, asid, frame, flags)
 
#define PPN_SHIFT 12
 
#define VRN_SHIFT 61
53,8 → 63,8
#define REGION_REGISTERS 8
 
#define VHPT_WIDTH 20 /* 1M */
#define VHPT_SIZE (1 << VHPT_WIDTH)
#define VHPT_BASE 0 /* Must be aligned to VHPT_SIZE */
#define VHPT_SIZE (1<<VHPT_WIDTH)
#define VHPT_BASE page_ht /* Must be aligned to VHPT_SIZE */
 
#define PTA_BASE_SHIFT 15
 
105,7 → 115,7
union vhpt_tag tag;
/* Word 3 */
__u64 ig3 : 64;
pte_t *next; /**< Collision chain next pointer. */
} __attribute__ ((packed));
 
struct vhpt_entry_not_present {
123,7 → 133,8
union vhpt_tag tag;
/* Word 3 */
__u64 ig3 : 64;
pte_t *next; /**< Collision chain next pointer. */
} __attribute__ ((packed));
 
typedef union vhpt_entry {
130,7 → 141,7
struct vhpt_entry_present present;
struct vhpt_entry_not_present not_present;
__u64 word[4];
} vhpt_entry_t;
} vhpt_entry;
 
struct region_register_map {
unsigned ve : 1;
246,9 → 257,8
}
 
extern void page_arch_init(void);
extern pte_t *vhpt_hash(__address page, asid_t asid);
extern bool vhpt_compare(__address page, asid_t asid, pte_t *t);
extern void vhpt_set_record(pte_t *t, __address page, asid_t asid, __address frame, int flags);
 
extern vhpt_entry_t *vhpt_hash(__address page, asid_t asid);
extern bool vhpt_compare(__address page, asid_t asid, vhpt_entry_t *v);
extern void vhpt_set_record(vhpt_entry_t *v, __address page, asid_t asid, __address frame, int flags);
 
#endif
/kernel/trunk/arch/ia64/include/types.h
47,6 → 47,6
 
typedef __u64 __native;
 
typedef struct pte pte_t;
typedef union vhpt_entry pte_t;
 
#endif
/kernel/trunk/arch/sparc64/include/mm/page.h
41,6 → 41,16
 
#define SET_PTL0_ADDRESS_ARCH(x) /**< To be removed as situation permits. */
 
/** Implementation of page hash table interface. */
#define HT_WIDTH_ARCH 20 /* 1M */
#define HT_HASH_ARCH(page, asid) 0
#define HT_COMPARE_ARCH(page, asid, t) 0
#define HT_SLOT_EMPTY_ARCH(t) 1
#define HT_INVALIDATE_SLOT_ARCH(t)
#define HT_GET_NEXT_ARCH(t) 0
#define HT_SET_NEXT_ARCH(t, s)
#define HT_SET_RECORD_ARCH(t, page, asid, frame, flags)
 
union page_address {
__address address;
struct {
/kernel/trunk/arch/sparc64/include/types.h
44,7 → 44,7
 
typedef __u64 __native;
 
typedef struct pte pte_t;
typedef __u64 pte_t;
 
typedef __u8 asi_t;
 
/kernel/trunk/arch/sparc64/src/mm/frame.c
32,11 → 32,5
 
void frame_arch_init(void)
{
/*
* Workaround to prevent slab allocator from allocating fram 0,
* which is not, at that time, mapped.
*/
frame_region_not_free(0, FRAME_SIZE);
zone_create_in_region(0, config.memory_size & ~(FRAME_SIZE - 1));
}