Subversion Repositories HelenOS-historic

Rev

Rev 1702 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 1702 Rev 1780
Line 121... Line 121...
121
    btree_t pagemap;    /**< B+tree containing complete map of anonymous pages of the shared area. */
121
    btree_t pagemap;    /**< B+tree containing complete map of anonymous pages of the shared area. */
122
} share_info_t;
122
} share_info_t;
123
 
123
 
124
/** Address space area backend structure. */
124
/** Address space area backend structure. */
125
typedef struct {
125
typedef struct {
126
    int (* page_fault)(as_area_t *area, __address addr, pf_access_t access);
126
    int (* page_fault)(as_area_t *area, uintptr_t addr, pf_access_t access);
127
    void (* frame_free)(as_area_t *area, __address page, __address frame);
127
    void (* frame_free)(as_area_t *area, uintptr_t page, uintptr_t frame);
128
    void (* share)(as_area_t *area);
128
    void (* share)(as_area_t *area);
129
} mem_backend_t;
129
} mem_backend_t;
130
 
130
 
131
/** Backend data stored in address space area. */
131
/** Backend data stored in address space area. */
132
typedef union {
132
typedef union {
133
    struct {    /**< elf_backend members */
133
    struct {    /**< elf_backend members */
134
        elf_header_t *elf;
134
        elf_header_t *elf;
135
        elf_segment_header_t *segment;
135
        elf_segment_header_t *segment;
136
    };
136
    };
137
    struct {    /**< phys_backend members */
137
    struct {    /**< phys_backend members */
138
        __address base;
138
        uintptr_t base;
139
        count_t frames;
139
        count_t frames;
140
    };
140
    };
141
} mem_backend_data_t;
141
} mem_backend_data_t;
142
 
142
 
143
/** Address space area structure.
143
/** Address space area structure.
Line 149... Line 149...
149
    mutex_t lock;
149
    mutex_t lock;
150
    as_t *as;       /**< Containing address space. */
150
    as_t *as;       /**< Containing address space. */
151
    int flags;      /**< Flags related to the memory represented by the address space area. */
151
    int flags;      /**< Flags related to the memory represented by the address space area. */
152
    int attributes;     /**< Attributes related to the address space area itself. */
152
    int attributes;     /**< Attributes related to the address space area itself. */
153
    count_t pages;      /**< Size of this area in multiples of PAGE_SIZE. */
153
    count_t pages;      /**< Size of this area in multiples of PAGE_SIZE. */
154
    __address base;     /**< Base address of this area. */
154
    uintptr_t base;     /**< Base address of this area. */
155
    btree_t used_space; /**< Map of used space. */
155
    btree_t used_space; /**< Map of used space. */
156
    share_info_t *sh_info;  /**< If the address space area has been shared, this pointer will
156
    share_info_t *sh_info;  /**< If the address space area has been shared, this pointer will
157
                         reference the share info structure. */
157
                         reference the share info structure. */
158
    mem_backend_t *backend; /**< Memory backend backing this address space area. */
158
    mem_backend_t *backend; /**< Memory backend backing this address space area. */
159
 
159
 
Line 170... Line 170...
170
extern void as_init(void);
170
extern void as_init(void);
171
 
171
 
172
extern as_t *as_create(int flags);
172
extern as_t *as_create(int flags);
173
extern void as_destroy(as_t *as);
173
extern void as_destroy(as_t *as);
174
extern void as_switch(as_t *old, as_t *new);
174
extern void as_switch(as_t *old, as_t *new);
175
extern int as_page_fault(__address page, pf_access_t access, istate_t *istate);
175
extern int as_page_fault(uintptr_t page, pf_access_t access, istate_t *istate);
176
 
176
 
177
extern as_area_t *as_area_create(as_t *as, int flags, size_t size, __address base, int attrs,
177
extern as_area_t *as_area_create(as_t *as, int flags, size_t size, uintptr_t base, int attrs,
178
    mem_backend_t *backend, mem_backend_data_t *backend_data);
178
    mem_backend_t *backend, mem_backend_data_t *backend_data);
179
extern int as_area_destroy(as_t *as, __address address);   
179
extern int as_area_destroy(as_t *as, uintptr_t address);   
180
extern int as_area_resize(as_t *as, __address address, size_t size, int flags);
180
extern int as_area_resize(as_t *as, uintptr_t address, size_t size, int flags);
181
int as_area_share(as_t *src_as, __address src_base, size_t acc_size,
181
int as_area_share(as_t *src_as, uintptr_t src_base, size_t acc_size,
182
          as_t *dst_as, __address dst_base, int dst_flags_mask);
182
          as_t *dst_as, uintptr_t dst_base, int dst_flags_mask);
183
 
183
 
184
extern int as_area_get_flags(as_area_t *area);
184
extern int as_area_get_flags(as_area_t *area);
185
extern bool as_area_check_access(as_area_t *area, pf_access_t access);
185
extern bool as_area_check_access(as_area_t *area, pf_access_t access);
186
extern size_t as_get_size(__address base);
186
extern size_t as_get_size(uintptr_t base);
187
extern int used_space_insert(as_area_t *a, __address page, count_t count);
187
extern int used_space_insert(as_area_t *a, uintptr_t page, count_t count);
188
extern int used_space_remove(as_area_t *a, __address page, count_t count);
188
extern int used_space_remove(as_area_t *a, uintptr_t page, count_t count);
189
 
189
 
190
/* Interface to be implemented by architectures. */
190
/* Interface to be implemented by architectures. */
191
#ifndef as_install_arch
191
#ifndef as_install_arch
192
extern void as_install_arch(as_t *as);
192
extern void as_install_arch(as_t *as);
193
#endif /* !def as_install_arch */
193
#endif /* !def as_install_arch */
Line 196... Line 196...
196
extern mem_backend_t anon_backend;
196
extern mem_backend_t anon_backend;
197
extern mem_backend_t elf_backend;
197
extern mem_backend_t elf_backend;
198
extern mem_backend_t phys_backend;
198
extern mem_backend_t phys_backend;
199
 
199
 
200
/* Address space area related syscalls. */
200
/* Address space area related syscalls. */
201
extern __native sys_as_area_create(__address address, size_t size, int flags);
201
extern unative_t sys_as_area_create(uintptr_t address, size_t size, int flags);
202
extern __native sys_as_area_resize(__address address, size_t size, int flags);
202
extern unative_t sys_as_area_resize(uintptr_t address, size_t size, int flags);
203
extern __native sys_as_area_destroy(__address address);
203
extern unative_t sys_as_area_destroy(uintptr_t address);
204
 
204
 
205
#endif /* KERNEL */
205
#endif /* KERNEL */
206
 
206
 
207
#endif
207
#endif
208
 
208