Rev 2071 | Rev 3766 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 2071 | Rev 2089 | ||
---|---|---|---|
Line 30... | Line 30... | ||
30 | * @{ |
30 | * @{ |
31 | */ |
31 | */ |
32 | /** @file |
32 | /** @file |
33 | */ |
33 | */ |
34 | 34 | ||
- | 35 | #include <memstr.h> |
|
35 | #include <arch/mm/vhpt.h> |
36 | #include <arch/mm/vhpt.h> |
36 | #include <mm/frame.h> |
37 | #include <mm/frame.h> |
37 | #include <print.h> |
38 | #include <print.h> |
38 | 39 | ||
39 | static vhpt_entry_t* vhpt_base; |
40 | static vhpt_entry_t* vhpt_base; |
40 | 41 | ||
41 | uintptr_t vhpt_set_up(void) |
42 | uintptr_t vhpt_set_up(void) |
42 | { |
43 | { |
43 | vhpt_base = frame_alloc(VHPT_WIDTH-FRAME_WIDTH,FRAME_KA | FRAME_ATOMIC); |
44 | vhpt_base = frame_alloc(VHPT_WIDTH - FRAME_WIDTH, FRAME_KA | FRAME_ATOMIC); |
44 | if(!vhpt_base) |
45 | if (!vhpt_base) |
45 | panic("Kernel configured with VHPT but no memory for table."); |
46 | panic("Kernel configured with VHPT but no memory for table."); |
46 | vhpt_invalidate_all(); |
47 | vhpt_invalidate_all(); |
47 | return (uintptr_t) vhpt_base; |
48 | return (uintptr_t) vhpt_base; |
48 | } |
49 | } |
49 | 50 | ||
Line 59... | Line 60... | ||
59 | 60 | ||
60 | 61 | ||
61 | vrn = va >> VRN_SHIFT; |
62 | vrn = va >> VRN_SHIFT; |
62 | rid = ASID2RID(asid, vrn); |
63 | rid = ASID2RID(asid, vrn); |
63 | 64 | ||
64 | rr_save.word = rr_read(vrn); |
65 | rr_save.word = rr_read(vrn); |
65 | rr.word = rr_save.word; |
66 | rr.word = rr_save.word; |
66 | rr.map.rid = rid; |
67 | rr.map.rid = rid; |
67 | rr_write(vrn, rr.word); |
68 | rr_write(vrn, rr.word); |
68 | srlz_i(); |
69 | srlz_i(); |
69 | 70 | ||
70 | ventry = (vhpt_entry_t *) thash(va); |
71 | ventry = (vhpt_entry_t *) thash(va); |
71 | tag = ttag(va); |
72 | tag = ttag(va); |
72 | rr_write(vrn, rr_save.word); |
73 | rr_write(vrn, rr_save.word); |
73 | srlz_i(); |
74 | srlz_i(); |
74 | srlz_d(); |
75 | srlz_d(); |
75 | 76 | ||
76 | ventry->word[0]=entry.word[0]; |
77 | ventry->word[0] = entry.word[0]; |
77 | ventry->word[1]=entry.word[1]; |
78 | ventry->word[1] = entry.word[1]; |
78 | ventry->present.tag.tag_word = tag; |
79 | ventry->present.tag.tag_word = tag; |
79 | - | ||
80 | - | ||
81 | } |
80 | } |
82 | 81 | ||
83 | void vhpt_invalidate_all() |
82 | void vhpt_invalidate_all() |
84 | { |
83 | { |
85 | memsetb((uintptr_t)vhpt_base,1<<VHPT_WIDTH,0); |
84 | memsetb((uintptr_t) vhpt_base, 1 << VHPT_WIDTH, 0); |
86 | } |
85 | } |
87 | 86 | ||
88 | void vhpt_invalidate_asid(asid_t asid) |
87 | void vhpt_invalidate_asid(asid_t asid) |
89 | { |
88 | { |
90 | vhpt_invalidate_all(); |
89 | vhpt_invalidate_all(); |