Subversion Repositories HelenOS-historic

Rev

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

Rev 1461 Rev 1468
Line 119... Line 119...
119
    if (flags & FLAG_AS_KERNEL)
119
    if (flags & FLAG_AS_KERNEL)
120
        as->asid = ASID_KERNEL;
120
        as->asid = ASID_KERNEL;
121
    else
121
    else
122
        as->asid = ASID_INVALID;
122
        as->asid = ASID_INVALID;
123
   
123
   
-
 
124
    as->refcount = 0;
124
    as->cpu_refcount = 0;
125
    as->cpu_refcount = 0;
125
    as->page_table = page_table_create(flags);
126
    as->page_table = page_table_create(flags);
126
 
127
 
127
    return as;
128
    return as;
128
}
129
}
129
 
130
 
130
/** Free Adress space */
131
/** Destroy adress space.
-
 
132
 *
-
 
133
 * When there are no tasks referencing this address space (i.e. its refcount is zero),
-
 
134
 * the address space can be destroyed.
-
 
135
 */
131
void as_free(as_t *as)
136
void as_destroy(as_t *as)
132
{
137
{
-
 
138
    ipl_t ipl;
-
 
139
    bool cond;
-
 
140
 
133
    ASSERT(as->cpu_refcount == 0);
141
    ASSERT(as->refcount == 0);
-
 
142
   
-
 
143
    /*
-
 
144
     * Since there is no reference to this area,
-
 
145
     * it is safe not to lock its mutex.
-
 
146
     */
-
 
147
     
-
 
148
    ipl = interrupts_disable();
-
 
149
    spinlock_lock(&inactive_as_with_asid_lock);
-
 
150
    if (as->asid != ASID_INVALID && as->asid != ASID_KERNEL) {
-
 
151
        list_remove(&as->inactive_as_with_asid_link);
-
 
152
        asid_put(as->asid);
-
 
153
    }
-
 
154
    spinlock_unlock(&inactive_as_with_asid_lock);
-
 
155
 
-
 
156
    /*
-
 
157
     * Destroy address space areas of the address space.
-
 
158
     */
-
 
159
    for (cond = true; cond; ) {
-
 
160
        btree_node_t *node;
-
 
161
       
-
 
162
        ASSERT(!list_empty(&as->as_area_btree.leaf_head));
-
 
163
        node = list_get_instance(&as->as_area_btree.leaf_head.next, btree_node_t, leaf_link);
-
 
164
        if ((cond = node->keys)) {
-
 
165
            as_area_destroy(as, node->key[0]);
-
 
166
            btree_remove(&as->as_area_btree, node->key[0], node);
-
 
167
        }
-
 
168
    }
-
 
169
   
-
 
170
    page_table_destroy(as->page_table);
134
 
171
 
135
    /* TODO: free as_areas and other resources held by as */
-
 
136
    /* TODO: free page table */
172
    interrupts_restore(ipl);
-
 
173
   
137
    free(as);
174
    free(as);
138
}
175
}
139
 
176
 
140
/** Create address space area of common attributes.
177
/** Create address space area of common attributes.
141
 *
178
 *
Line 838... Line 875...
838
        ASSERT(as_operations->page_table_create);
875
        ASSERT(as_operations->page_table_create);
839
 
876
 
840
        return as_operations->page_table_create(flags);
877
        return as_operations->page_table_create(flags);
841
}
878
}
842
 
879
 
-
 
880
/** Destroy page table.
-
 
881
 *
-
 
882
 * Destroy page table in architecture specific way.
-
 
883
 *
-
 
884
 * @param page_table Physical address of PTL0.
-
 
885
 */
-
 
886
void page_table_destroy(pte_t *page_table)
-
 
887
{
-
 
888
        ASSERT(as_operations);
-
 
889
        ASSERT(as_operations->page_table_destroy);
-
 
890
 
-
 
891
        as_operations->page_table_destroy(page_table);
-
 
892
}
-
 
893
 
843
/** Lock page table.
894
/** Lock page table.
844
 *
895
 *
845
 * This function should be called before any page_mapping_insert(),
896
 * This function should be called before any page_mapping_insert(),
846
 * page_mapping_remove() and page_mapping_find().
897
 * page_mapping_remove() and page_mapping_find().
847
 *
898
 *