Subversion Repositories HelenOS-historic

Rev

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

Rev 1423 Rev 1424
Line 28... Line 28...
28
 
28
 
29
#ifndef __AS_H__
29
#ifndef __AS_H__
30
#define __AS_H__
30
#define __AS_H__
31
 
31
 
32
/** Address space area flags. */
32
/** Address space area flags. */
33
#define AS_AREA_READ    1
33
#define AS_AREA_READ        1
34
#define AS_AREA_WRITE   2
34
#define AS_AREA_WRITE       2
35
#define AS_AREA_EXEC    4
35
#define AS_AREA_EXEC        4
36
#define AS_AREA_DEVICE  8
36
#define AS_AREA_CACHEABLE   8
37
#define AS_AREA_ANON    16
-
 
38
 
37
 
39
#ifdef KERNEL
38
#ifdef KERNEL
40
 
39
 
41
#include <arch/mm/page.h>
40
#include <arch/mm/page.h>
42
#include <arch/mm/as.h>
41
#include <arch/mm/as.h>
Line 102... Line 101...
102
#define AS_PF_FAULT     0   /**< The page fault was not resolved by as_page_fault(). */
101
#define AS_PF_FAULT     0   /**< The page fault was not resolved by as_page_fault(). */
103
#define AS_PF_OK        1   /**< The page fault was resolved by as_page_fault(). */
102
#define AS_PF_OK        1   /**< The page fault was resolved by as_page_fault(). */
104
#define AS_PF_DEFER     2   /**< The page fault was caused by memcpy_from_uspace()
103
#define AS_PF_DEFER     2   /**< The page fault was caused by memcpy_from_uspace()
105
                         or memcpy_to_uspace(). */
104
                         or memcpy_to_uspace(). */
106
 
105
 
-
 
106
/** This structure contains information associated with the shared address space area. */
-
 
107
typedef struct {
-
 
108
    mutex_t lock;       /**< This lock must be acquired only when the as_area lock is held. */
-
 
109
    count_t refcount;   /**< This structure can be deallocated if refcount drops to 0. */
-
 
110
    btree_t pagemap;    /**< B+tree containing complete map of anonymous pages of the shared area. */
-
 
111
} share_info_t;
-
 
112
 
-
 
113
/** Address space area backend structure. */
-
 
114
typedef struct {
-
 
115
    int (* page_fault)(as_area_t *area, __address addr, pf_access_t access);
-
 
116
    void (* frame_free)(as_area_t *area, __address page, __address frame);
107
typedef struct share_info share_info_t;
117
    void (* share)(as_area_t *area);
-
 
118
} mem_backend_t;
-
 
119
 
-
 
120
/** Backend data stored in address space area. */
108
typedef struct mem_backend mem_backend_t;
121
typedef struct backend_data {
-
 
122
    __native d1;
-
 
123
    __native d2;
-
 
124
} mem_backend_data_t;
109
 
125
 
110
/** Address space area structure.
126
/** Address space area structure.
111
 *
127
 *
112
 * Each as_area_t structure describes one contiguous area of virtual memory.
128
 * Each as_area_t structure describes one contiguous area of virtual memory.
113
 * In the future, it should not be difficult to support shared areas.
129
 * In the future, it should not be difficult to support shared areas.
114
 */
130
 */
115
struct as_area {
131
struct as_area {
116
    mutex_t lock;
132
    mutex_t lock;
-
 
133
    as_t *as;       /**< Containing address space. */
117
    int flags;      /**< Flags related to the memory represented by the address space area. */
134
    int flags;      /**< Flags related to the memory represented by the address space area. */
118
    int attributes;     /**< Attributes related to the address space area itself. */
135
    int attributes;     /**< Attributes related to the address space area itself. */
119
    count_t pages;      /**< Size of this area in multiples of PAGE_SIZE. */
136
    count_t pages;      /**< Size of this area in multiples of PAGE_SIZE. */
120
    __address base;     /**< Base address of this area. */
137
    __address base;     /**< Base address of this area. */
121
    btree_t used_space; /**< Map of used space. */
138
    btree_t used_space; /**< Map of used space. */
122
    share_info_t *sh_info;  /**< If the address space area has been shared, this pointer will
139
    share_info_t *sh_info;  /**< If the address space area has been shared, this pointer will
123
                     reference the share info structure. */
140
                         reference the share info structure. */
124
    mem_backend_t *backend; /**< Memory backend backing this address space area. */
141
    mem_backend_t *backend; /**< Memory backend backing this address space area. */
125
    void *backend_data[2];  /**< Data to be used by the backend. */
-
 
126
};
-
 
127
 
142
 
128
/** Address space area backend structure. */
143
    /** Data to be used by the backend. */
129
struct mem_backend {
144
    mem_backend_data_t backend_data;
130
    int (* backend_page_fault)(as_area_t *area, __address addr, pf_access_t access);
-
 
131
    void (* backend_frame_free)(as_area_t *area, __address page, __address frame);
-
 
132
};
145
};
133
 
146
 
134
extern as_t *AS_KERNEL;
147
extern as_t *AS_KERNEL;
135
extern as_operations_t *as_operations;
148
extern as_operations_t *as_operations;
136
 
149
 
Line 138... Line 151...
138
extern link_t inactive_as_with_asid_head;
151
extern link_t inactive_as_with_asid_head;
139
 
152
 
140
extern void as_init(void);
153
extern void as_init(void);
141
extern as_t *as_create(int flags);
154
extern as_t *as_create(int flags);
142
extern as_area_t *as_area_create(as_t *as, int flags, size_t size, __address base, int attrs,
155
extern as_area_t *as_area_create(as_t *as, int flags, size_t size, __address base, int attrs,
143
    mem_backend_t *backend, void **backend_data);
156
    mem_backend_t *backend, mem_backend_data_t *backend_data);
144
extern int as_area_resize(as_t *as, __address address, size_t size, int flags);
157
extern int as_area_resize(as_t *as, __address address, size_t size, int flags);
145
extern int as_area_destroy(as_t *as, __address address);
158
extern int as_area_destroy(as_t *as, __address address);
146
extern int as_area_get_flags(as_area_t *area);
159
extern int as_area_get_flags(as_area_t *area);
147
extern void as_set_mapping(as_t *as, __address page, __address frame);
-
 
148
extern bool as_area_check_access(as_area_t *area, pf_access_t access);
160
extern bool as_area_check_access(as_area_t *area, pf_access_t access);
149
extern int as_page_fault(__address page, pf_access_t access, istate_t *istate);
161
extern int as_page_fault(__address page, pf_access_t access, istate_t *istate);
150
extern void as_switch(as_t *old, as_t *new);
162
extern void as_switch(as_t *old, as_t *new);
151
extern void as_free(as_t *as);
163
extern void as_free(as_t *as);
152
extern int as_area_share(as_t *src_as, __address src_base, size_t acc_size,
164
extern int as_area_share(as_t *src_as, __address src_base, size_t acc_size,
Line 161... Line 173...
161
#endif /* !def as_install_arch */
173
#endif /* !def as_install_arch */
162
 
174
 
163
/* Backend declarations. */
175
/* Backend declarations. */
164
extern mem_backend_t anon_backend;
176
extern mem_backend_t anon_backend;
165
extern mem_backend_t elf_backend;
177
extern mem_backend_t elf_backend;
-
 
178
extern mem_backend_t phys_backend;
166
 
179
 
167
/* Address space area related syscalls. */
180
/* Address space area related syscalls. */
168
extern __native sys_as_area_create(__address address, size_t size, int flags);
181
extern __native sys_as_area_create(__address address, size_t size, int flags);
169
extern __native sys_as_area_resize(__address address, size_t size, int flags);
182
extern __native sys_as_area_resize(__address address, size_t size, int flags);
170
extern __native sys_as_area_destroy(__address address);
183
extern __native sys_as_area_destroy(__address address);