Subversion Repositories HelenOS-historic

Rev

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

Rev 623 Rev 703
Line 24... Line 24...
24
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
25
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26
 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26
 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27
 */
27
 */
28
 
28
 
29
#ifndef __VM_H__
29
#ifndef __AS_H__
30
#define __VM_H__
30
#define __AS_H__
31
 
31
 
32
#include <arch/mm/page.h>
32
#include <arch/mm/page.h>
33
#include <arch/mm/vm.h>
33
#include <arch/mm/as.h>
34
#include <arch/mm/asid.h>
34
#include <arch/mm/asid.h>
35
#include <arch/types.h>
35
#include <arch/types.h>
36
#include <typedefs.h>
36
#include <typedefs.h>
37
#include <synch/spinlock.h>
37
#include <synch/spinlock.h>
38
#include <list.h>
38
#include <list.h>
Line 46... Line 46...
46
 
46
 
47
#define UTEXT_ADDRESS   UTEXT_ADDRESS_ARCH
47
#define UTEXT_ADDRESS   UTEXT_ADDRESS_ARCH
48
#define USTACK_ADDRESS  USTACK_ADDRESS_ARCH
48
#define USTACK_ADDRESS  USTACK_ADDRESS_ARCH
49
#define UDATA_ADDRESS   UDATA_ADDRESS_ARCH
49
#define UDATA_ADDRESS   UDATA_ADDRESS_ARCH
50
 
50
 
51
enum vm_type {
51
enum as_area_type {
52
    VMA_TEXT = 1, VMA_DATA, VMA_STACK
52
    AS_AREA_TEXT = 1, AS_AREA_DATA, AS_AREA_STACK
53
};
53
};
54
 
54
 
-
 
55
/** Address space area structure.
55
/*
56
 *
56
 * Each vm_area_t structure describes one continuous area of virtual memory.
57
 * Each as_area_t structure describes one contiguous area of virtual memory.
57
 * In the future, it should not be difficult to support shared areas of vm.
58
 * In the future, it should not be difficult to support shared areas.
58
 */
59
 */
59
struct vm_area {
60
struct as_area {
60
    SPINLOCK_DECLARE(lock);
61
    SPINLOCK_DECLARE(lock);
61
    link_t link;
62
    link_t link;
62
    vm_type_t type;
63
    as_area_type_t type;
63
    int size;
64
    size_t size;        /**< Size of this area. */
64
    __address address;
65
    __address base;     /**< Base address of this area. */
65
    __address *mapping;
66
    index_t *mapping;   /**< Map of physical frame numbers mapped to virtual page numbers in this area. */
66
};
67
};
67
 
68
 
-
 
69
/** Address space structure.
68
/*
70
 *
69
 * vm_t contains the list of vm_areas of userspace accessible
71
 * as_t contains the list of as_areas of userspace accessible
70
 * pages for one or more tasks. Ranges of kernel memory pages are not
72
 * pages for one or more tasks. Ranges of kernel memory pages are not
71
 * supposed to figure in the list as they are shared by all tasks and
73
 * supposed to figure in the list as they are shared by all tasks and
72
 * set up during system initialization.
74
 * set up during system initialization.
73
 */
75
 */
74
struct vm {
76
struct as {
75
    SPINLOCK_DECLARE(lock);
77
    SPINLOCK_DECLARE(lock);
76
    link_t vm_area_head;
78
    link_t as_area_head;
77
    pte_t *ptl0;
79
    pte_t *ptl0;
78
    asid_t asid;
80
    asid_t asid;            /**< Address space identifier. */
79
};
81
};
80
 
82
 
81
extern vm_t * vm_create(pte_t *ptl0);
83
extern as_t * as_create(pte_t *ptl0);
-
 
84
extern as_area_t *as_area_create(as_t *as, as_area_type_t type, size_t size, __address base);
82
extern void vm_destroy(vm_t *m);
85
extern void as_area_load_mapping(as_area_t *a, index_t *pfn);
83
 
-
 
84
extern vm_area_t *vm_area_create(vm_t *m, vm_type_t type, size_t size, __address addr);
86
extern int as_page_fault(__address page);
85
extern void vm_area_destroy(vm_area_t *a);
87
extern void as_install(as_t *m);
86
 
88
 
-
 
89
/*
-
 
90
 * Each architecture should implement this function.
-
 
91
 * Its main purpose is to do TLB purges according
87
extern void vm_area_map(vm_area_t *a, vm_t *m);
92
 * to architecture's requirements. Note that
-
 
93
 * some architectures invalidate their TLB automatically
88
extern void vm_area_unmap(vm_area_t *a, vm_t *m);
94
 * on hardware address space switch (e.g. ia32 and
-
 
95
 * amd64).
89
 
96
 */
-
 
97
#ifndef as_install_arch
90
extern void vm_install(vm_t *m);
98
extern void as_install_arch(as_t *as);
91
extern void vm_uninstall(vm_t *m);
99
#endif /* !def as_install_arch */
92
 
100
 
93
#endif
101
#endif