Subversion Repositories HelenOS-historic

Rev

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

Rev 119 Rev 120
Line 28... Line 28...
28
 
28
 
29
#ifndef __PAGE_H__
29
#ifndef __PAGE_H__
30
#define __PAGE_H__
30
#define __PAGE_H__
31
 
31
 
32
#include <arch/types.h>
32
#include <arch/types.h>
33
#include <arch/mm/page.h>
-
 
34
#include <typedefs.h>
33
#include <typedefs.h>
35
 
34
 
-
 
35
#define PAGE_CACHEABLE_SHIFT        0
-
 
36
#define PAGE_NOT_CACHEABLE_SHIFT    PAGE_CACHEABLE_SHIFT
-
 
37
#define PAGE_PRESENT_SHIFT      1
-
 
38
#define PAGE_NOT_PRESENT_SHIFT      PAGE_PRESENT_SHIFT
-
 
39
#define PAGE_USER_SHIFT         2
-
 
40
#define PAGE_KERNEL_SHIFT       PAGE_USER_SHIFT
-
 
41
#define PAGE_READ_SHIFT         3
-
 
42
#define PAGE_WRITE_SHIFT        4
-
 
43
#define PAGE_EXEC_SHIFT         5
-
 
44
 
36
#define PAGE_NOT_CACHEABLE      (0<<0)
45
#define PAGE_NOT_CACHEABLE      (0<<PAGE_CACHEABLE_SHIFT)
37
#define PAGE_CACHEABLE          (1<<0)
46
#define PAGE_CACHEABLE          (1<<PAGE_CACHEABLE_SHIFT)
38
 
47
 
39
#define PAGE_PRESENT            (0<<1)
48
#define PAGE_PRESENT            (0<<PAGE_PRESENT_SHIFT)
40
#define PAGE_NOT_PRESENT        (1<<1)
49
#define PAGE_NOT_PRESENT        (1<<PAGE_PRESENT_SHIFT)
41
 
50
 
42
#define PAGE_USER               (1<<2)
51
#define PAGE_USER               (1<<PAGE_USER_SHIFT)
43
#define PAGE_KERNEL             (0<<2)
52
#define PAGE_KERNEL             (0<<PAGE_USER_SHIFT)
44
 
53
 
45
#define PAGE_READ       (1<<3)
54
#define PAGE_READ       (1<<PAGE_READ_SHIFT)
46
#define PAGE_WRITE      (1<<4)
55
#define PAGE_WRITE      (1<<PAGE_WRITE_SHIFT)
47
#define PAGE_EXEC       (1<<5)
56
#define PAGE_EXEC       (1<<PAGE_EXEC_SHIFT)
48
 
57
 
49
/*
58
/*
50
 * This is the generic 4-level page table interface.
59
 * This is the generic 4-level page table interface.
51
 * Architectures are supposed to implement *_ARCH macros.
60
 * Architectures are supposed to implement *_ARCH macros.
52
 */
61
 */
Line 58... Line 67...
58
#define PTL0_INDEX(vaddr)       PTL0_INDEX_ARCH(vaddr)
67
#define PTL0_INDEX(vaddr)       PTL0_INDEX_ARCH(vaddr)
59
#define PTL1_INDEX(vaddr)       PTL1_INDEX_ARCH(vaddr)
68
#define PTL1_INDEX(vaddr)       PTL1_INDEX_ARCH(vaddr)
60
#define PTL2_INDEX(vaddr)       PTL2_INDEX_ARCH(vaddr)
69
#define PTL2_INDEX(vaddr)       PTL2_INDEX_ARCH(vaddr)
61
#define PTL3_INDEX(vaddr)       PTL3_INDEX_ARCH(vaddr)
70
#define PTL3_INDEX(vaddr)       PTL3_INDEX_ARCH(vaddr)
62
 
71
 
-
 
72
#define GET_PTL0_ADDRESS()      GET_PTL0_ADDRESS_ARCH()
-
 
73
#define SET_PTL0_ADDRESS(ptl0)      SET_PTL0_ADDRESS_ARCH(ptl0)
-
 
74
 
63
/*
75
/*
64
 * These macros traverse the 4-level tree of page tables,
76
 * These macros traverse the 4-level tree of page tables,
65
 * each descending by one level.
77
 * each descending by one level.
66
 */
78
 */
-
 
79
#define GET_PTL0_ADDRESS()      GET_PTL0_ADDRESS_ARCH()
67
#define GET_PTL1_ADDRESS(ptl0, i)   GET_PTL1_ADDRESS_ARCH(ptl0, i)
80
#define GET_PTL1_ADDRESS(ptl0, i)   GET_PTL1_ADDRESS_ARCH(ptl0, i)
68
#define GET_PTL2_ADDRESS(ptl1, i)   GET_PTL2_ADDRESS_ARCH(ptl1, i)
81
#define GET_PTL2_ADDRESS(ptl1, i)   GET_PTL2_ADDRESS_ARCH(ptl1, i)
69
#define GET_PTL3_ADDRESS(ptl2, i)   GET_PTL3_ADDRESS_ARCH(ptl2, i)
82
#define GET_PTL3_ADDRESS(ptl2, i)   GET_PTL3_ADDRESS_ARCH(ptl2, i)
70
#define GET_FRAME_ADDRESS(ptl3, i)  GET_FRAME_ADDRESS_ARCH(ptl3, i)
83
#define GET_FRAME_ADDRESS(ptl3, i)  GET_FRAME_ADDRESS_ARCH(ptl3, i)
71
 
84
 
72
/*
85
/*
73
 * These macros are provided to change shape of the 4-level
86
 * These macros are provided to change shape of the 4-level
74
 * tree of page tables on respective level.
87
 * tree of page tables on respective level.
75
 */
88
 */
-
 
89
#define SET_PTL0_ADDRESS(ptl0)      SET_PTL0_ADDRESS_ARCH(ptl0)
76
#define SET_PTL1_ADDRESS(ptl0, i, a)    SET_PTL1_ADDRESS_ARCH(ptl0, i, a)
90
#define SET_PTL1_ADDRESS(ptl0, i, a)    SET_PTL1_ADDRESS_ARCH(ptl0, i, a)
77
#define SET_PTL2_ADDRESS(ptl1, i, a)    SET_PTL2_ADDRESS_ARCH(ptl1, i, a)
91
#define SET_PTL2_ADDRESS(ptl1, i, a)    SET_PTL2_ADDRESS_ARCH(ptl1, i, a)
78
#define SET_PTL3_ADDRESS(ptl2, i, a)    SET_PTL3_ADDRESS_ARCH(ptl2, i, a)
92
#define SET_PTL3_ADDRESS(ptl2, i, a)    SET_PTL3_ADDRESS_ARCH(ptl2, i, a)
79
#define SET_FRAME_ADDRESS(ptl3, i, a)   SET_FRAME_ADDRESS_ARCH(ptl3, i, a)
93
#define SET_FRAME_ADDRESS(ptl3, i, a)   SET_FRAME_ADDRESS_ARCH(ptl3, i, a)
80
 
94
 
81
/*
95
/*
-
 
96
 * These macros are provided to query various flags within the page tables.
-
 
97
 */
-
 
98
#define GET_PTL1_FLAGS(ptl0, i)     GET_PTL1_FLAGS_ARCH(ptl0, i)
-
 
99
#define GET_PTL2_FLAGS(ptl1, i)     GET_PTL2_FLAGS_ARCH(ptl1, i)
-
 
100
#define GET_PTL3_FLAGS(ptl2, i)     GET_PTL3_FLAGS_ARCH(ptl2, i)
-
 
101
#define GET_FRAME_FLAGS(ptl3, i)    GET_FRAME_FLAGS_ARCH(ptl3, i)
-
 
102
 
-
 
103
/*
82
 * These macros are provided to set/clear various flags within the page tables.
104
 * These macros are provided to set/clear various flags within the page tables.
83
 */
105
 */
84
#define SET_PTL1_FLAGS(ptl0, i, x)  SET_PTL1_FLAGS_ARCH(ptl0, i, x)
106
#define SET_PTL1_FLAGS(ptl0, i, x)  SET_PTL1_FLAGS_ARCH(ptl0, i, x)
85
#define SET_PTL2_FLAGS(ptl1, i, x)  SET_PTL2_FLAGS_ARCH(ptl1, i, x)
107
#define SET_PTL2_FLAGS(ptl1, i, x)  SET_PTL2_FLAGS_ARCH(ptl1, i, x)
86
#define SET_PTL3_FLAGS(ptl2, i, x)  SET_PTL3_FLAGS_ARCH(ptl2, i, x)
108
#define SET_PTL3_FLAGS(ptl2, i, x)  SET_PTL3_FLAGS_ARCH(ptl2, i, x)
87
#define SET_FRAME_FLAGS(ptl3, i, x) SET_FRAME_FLAGS_ARCH(ptl3, i, x)
109
#define SET_FRAME_FLAGS(ptl3, i, x) SET_FRAME_FLAGS_ARCH(ptl3, i, x)
88
 
110
 
-
 
111
#include <arch/mm/page.h>
89
 
112
 
90
extern void page_init(void);
113
extern void page_init(void);
91
extern void map_page_to_frame(__address page, __address frame, int flags, __address root);
114
extern void map_page_to_frame(__address page, __address frame, int flags, __address root);
92
extern void map_structure(__address s, size_t size);
115
extern void map_structure(__address s, size_t size);
93
 
116