Subversion Repositories HelenOS

Rev

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

Rev 3862 Rev 4129
Line 70... Line 70...
70
    else
70
    else
71
        cnt = pages;
71
        cnt = pages;
72
   
72
   
73
    for (i = 0; i < cnt; i++) {
73
    for (i = 0; i < cnt; i++) {
74
        ((tsb_entry_t *) as->arch.tsb_description.tsb_base)[
74
        ((tsb_entry_t *) as->arch.tsb_description.tsb_base)[
75
            (i0 + i) & (TSB_ENTRY_COUNT - 1)].tag.invalid = true;
75
            (i0 + i) & (TSB_ENTRY_COUNT - 1)].data.v = false;
76
    }
76
    }
77
}
77
}
78
 
78
 
79
/** Copy software PTE to ITSB.
79
/** Copy software PTE to ITSB.
80
 *
80
 *
81
 * @param t     Software PTE.
81
 * @param t     Software PTE.
82
 * @param index Zero if lower 8K-subpage, one if higher 8K subpage.
-
 
83
 */
82
 */
84
void itsb_pte_copy(pte_t *t, index_t index)
83
void itsb_pte_copy(pte_t *t)
85
{
84
{
86
    #if 0
-
 
87
    as_t *as;
85
    as_t *as;
88
    tsb_entry_t *tsb;
86
    tsb_entry_t *tsb;
89
    index_t entry;
87
    index_t entry;
90
 
88
 
91
    ASSERT(index <= 1);
-
 
92
   
-
 
93
    as = t->as;
89
    as = t->as;
94
    entry = ((t->page >> MMU_PAGE_WIDTH) + index) & TSB_INDEX_MASK;
90
    entry = (t->page >> MMU_PAGE_WIDTH) & TSB_INDEX_MASK;
95
    ASSERT(entry < ITSB_ENTRY_COUNT);
91
    ASSERT(entry < TSB_ENTRY_COUNT);
96
    tsb = &as->arch.itsb[entry];
92
    tsb = &((tsb_entry_t *) as->arch.tsb_description.tsb_base)[entry];
97
 
93
 
98
    /*
94
    /*
99
     * We use write barriers to make sure that the TSB load
95
     * We use write barriers to make sure that the TSB load
100
     * won't use inconsistent data or that the fault will
96
     * won't use inconsistent data or that the fault will
101
     * be repeated.
97
     * be repeated.
102
     */
98
     */
103
 
99
 
104
    tsb->tag.invalid = true;    /* invalidate the entry
-
 
105
                     * (tag target has this
100
    tsb->data.v = false;
106
                     * set to 0) */
-
 
107
 
101
 
108
    write_barrier();
102
    write_barrier();
109
 
103
 
110
    tsb->tag.context = as->asid;
104
    tsb->tag.context = as->asid;
111
    /* the shift is bigger than PAGE_WIDTH, do not bother with index  */
-
 
112
    tsb->tag.va_tag = t->page >> VA_TAG_PAGE_SHIFT;
105
    tsb->tag.va_tag = t->page >> VA_TAG_PAGE_SHIFT;
-
 
106
 
113
    tsb->data.value = 0;
107
    tsb->data.value = 0;
114
    tsb->data.size = PAGESIZE_8K;
108
    tsb->data.nfo = false;
115
    tsb->data.pfn = (t->frame >> MMU_FRAME_WIDTH) + index;
109
    tsb->data.ra = t->frame >> MMU_FRAME_WIDTH;
-
 
110
    tsb->data.ie = false;
-
 
111
    tsb->data.e = false;
116
    tsb->data.cp = t->c;    /* cp as cache in phys.-idxed, c as cacheable */
112
    tsb->data.cp = t->c;    /* cp as cache in phys.-idxed, c as cacheable */
-
 
113
    tsb->data.cv = false;
117
    tsb->data.p = t->k; /* p as privileged, k as kernel */
114
    tsb->data.p = t->k; /* p as privileged, k as kernel */
-
 
115
    tsb->data.x = true;
-
 
116
    tsb->data.w = false;
118
    tsb->data.v = t->p; /* v as valid, p as present */
117
    tsb->data.size = PAGESIZE_8K;
119
   
118
   
120
    write_barrier();
119
    write_barrier();
121
   
120
   
122
    tsb->tag.invalid = false;   /* mark the entry as valid */
121
    tsb->data.v = t->p; /* v as valid, p as present */
123
    #endif
-
 
124
}
122
}
125
 
123
 
126
/** Copy software PTE to DTSB.
124
/** Copy software PTE to DTSB.
127
 *
125
 *
128
 * @param t Software PTE.
126
 * @param t Software PTE.
129
 * @param index Zero if lower 8K-subpage, one if higher 8K-subpage.
-
 
130
 * @param ro    If true, the mapping is copied read-only.
127
 * @param ro    If true, the mapping is copied read-only.
131
 */
128
 */
132
void dtsb_pte_copy(pte_t *t, index_t index, bool ro)
129
void dtsb_pte_copy(pte_t *t, bool ro)
133
{
130
{
134
    #if 0
-
 
135
    as_t *as;
131
    as_t *as;
136
    tsb_entry_t *tsb;
132
    tsb_entry_t *tsb;
137
    index_t entry;
133
    index_t entry;
138
   
-
 
139
    ASSERT(index <= 1);
-
 
140
 
134
 
141
    as = t->as;
135
    as = t->as;
142
    entry = ((t->page >> MMU_PAGE_WIDTH) + index) & TSB_INDEX_MASK;
136
    entry = (t->page >> MMU_PAGE_WIDTH) & TSB_INDEX_MASK;
143
    ASSERT(entry < DTSB_ENTRY_COUNT);
137
    ASSERT(entry < TSB_ENTRY_COUNT);
144
    tsb = &as->arch.dtsb[entry];
138
    tsb = &((tsb_entry_t *) as->arch.tsb_description.tsb_base)[entry];
145
 
139
 
146
    /*
140
    /*
147
     * We use write barriers to make sure that the TSB load
141
     * We use write barriers to make sure that the TSB load
148
     * won't use inconsistent data or that the fault will
142
     * won't use inconsistent data or that the fault will
149
     * be repeated.
143
     * be repeated.
150
     */
144
     */
151
 
145
 
152
    tsb->tag.invalid = true;    /* invalidate the entry
-
 
153
                     * (tag target has this
146
    tsb->data.v = false;
154
                     * set to 0) */
-
 
155
 
147
 
156
    write_barrier();
148
    write_barrier();
157
 
149
 
158
    tsb->tag.context = as->asid;
150
    tsb->tag.context = as->asid;
159
    /* the shift is bigger than PAGE_WIDTH, do not bother with index */
-
 
160
    tsb->tag.va_tag = t->page >> VA_TAG_PAGE_SHIFT;
151
    tsb->tag.va_tag = t->page >> VA_TAG_PAGE_SHIFT;
-
 
152
 
161
    tsb->data.value = 0;
153
    tsb->data.value = 0;
162
    tsb->data.size = PAGESIZE_8K;
154
    tsb->data.nfo = false;
163
    tsb->data.pfn = (t->frame >> MMU_FRAME_WIDTH) + index;
155
    tsb->data.ra = t->frame >> MMU_FRAME_WIDTH;
164
    tsb->data.cp = t->c;
156
    tsb->data.ie = false;
-
 
157
    tsb->data.e = false;
-
 
158
    tsb->data.cp = t->c;    /* cp as cache in phys.-idxed, c as cacheable */
165
#ifdef CONFIG_VIRT_IDX_DCACHE
159
#ifdef CONFIG_VIRT_IDX_DCACHE
166
    tsb->data.cv = t->c;
160
    tsb->data.cv = t->c;
167
#endif /* CONFIG_VIRT_IDX_DCACHE */
161
#endif /* CONFIG_VIRT_IDX_DCACHE */
168
    tsb->data.p = t->k;     /* p as privileged */
162
    tsb->data.p = t->k; /* p as privileged, k as kernel */
-
 
163
    tsb->data.x = true;
169
    tsb->data.w = ro ? false : t->w;
164
    tsb->data.w = ro ? false : t->w;
170
    tsb->data.v = t->p;
165
    tsb->data.size = PAGESIZE_8K;
171
   
166
   
172
    write_barrier();
167
    write_barrier();
173
   
168
   
174
    tsb->tag.invalid = false;   /* mark the entry as valid */
169
    tsb->data.v = t->p; /* v as valid, p as present */
175
    #endif
-
 
176
}
170
}
177
 
171
 
178
/** @}
172
/** @}
179
 */
173
 */
180
 
174