Rev 3972 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 3972 | Rev 3973 | ||
---|---|---|---|
Line 37... | Line 37... | ||
37 | #define KERN_FRAME_H_ |
37 | #define KERN_FRAME_H_ |
38 | 38 | ||
39 | #include <arch/types.h> |
39 | #include <arch/types.h> |
40 | #include <adt/list.h> |
40 | #include <adt/list.h> |
41 | #include <mm/buddy.h> |
41 | #include <mm/buddy.h> |
- | 42 | #include <synch/spinlock.h> |
|
42 | #include <arch/mm/page.h> |
43 | #include <arch/mm/page.h> |
43 | #include <arch/mm/frame.h> |
44 | #include <arch/mm/frame.h> |
44 | 45 | ||
45 | #define ONE_FRAME 0 |
46 | #define ONE_FRAME 0 |
46 | #define TWO_FRAMES 1 |
47 | #define TWO_FRAMES 1 |
Line 65... | Line 66... | ||
65 | /** Do not start reclaiming when no free memory. */ |
66 | /** Do not start reclaiming when no free memory. */ |
66 | #define FRAME_NO_RECLAIM 0x04 |
67 | #define FRAME_NO_RECLAIM 0x04 |
67 | 68 | ||
68 | typedef uint8_t zone_flags_t; |
69 | typedef uint8_t zone_flags_t; |
69 | 70 | ||
- | 71 | /** Available zone (free for allocation) */ |
|
- | 72 | #define ZONE_AVAILABLE 0x00 |
|
70 | /** Zone is reserved (not available for allocation) */ |
73 | /** Zone is reserved (not available for allocation) */ |
71 | #define ZONE_RESERVED 0x08 |
74 | #define ZONE_RESERVED 0x08 |
72 | /** Zone is used by firmware (not available for allocation) */ |
75 | /** Zone is used by firmware (not available for allocation) */ |
73 | #define ZONE_FIRMWARE 0x10 |
76 | #define ZONE_FIRMWARE 0x10 |
74 | 77 | ||
75 | /** Currently there is no equivalent zone flags |
78 | /** Currently there is no equivalent zone flags |
76 | for frame flags */ |
79 | for frame flags */ |
77 | #define FRAME_TO_ZONE_FLAGS(frame_flags) 0 |
80 | #define FRAME_TO_ZONE_FLAGS(frame_flags) 0 |
78 | 81 | ||
- | 82 | typedef struct { |
|
- | 83 | count_t refcount; /**< Tracking of shared frames */ |
|
- | 84 | uint8_t buddy_order; /**< Buddy system block order */ |
|
- | 85 | link_t buddy_link; /**< Link to the next free block inside |
|
- | 86 | one order */ |
|
- | 87 | void *parent; /**< If allocated by slab, this points there */ |
|
- | 88 | } frame_t; |
|
- | 89 | ||
- | 90 | typedef struct { |
|
- | 91 | pfn_t base; /**< Frame_no of the first frame |
|
- | 92 | in the frames array */ |
|
- | 93 | count_t count; /**< Size of zone */ |
|
- | 94 | count_t free_count; /**< Number of free frame_t |
|
- | 95 | structures */ |
|
- | 96 | count_t busy_count; /**< Number of busy frame_t |
|
- | 97 | structures */ |
|
- | 98 | zone_flags_t flags; /**< Type of the zone */ |
|
- | 99 | ||
- | 100 | frame_t *frames; /**< Array of frame_t structures |
|
- | 101 | in this zone */ |
|
- | 102 | buddy_system_t *buddy_system; /**< Buddy system for the zone */ |
|
- | 103 | } zone_t; |
|
- | 104 | ||
- | 105 | /* |
|
- | 106 | * The zoneinfo.lock must be locked when accessing zoneinfo structure. |
|
- | 107 | * Some of the attributes in zone_t structures are 'read-only' |
|
- | 108 | */ |
|
- | 109 | typedef struct { |
|
- | 110 | SPINLOCK_DECLARE(lock); |
|
- | 111 | count_t count; |
|
- | 112 | zone_t info[ZONES_MAX]; |
|
- | 113 | } zones_t; |
|
- | 114 | ||
- | 115 | extern zones_t zones; |
|
- | 116 | ||
79 | static inline uintptr_t PFN2ADDR(pfn_t frame) |
117 | static inline uintptr_t PFN2ADDR(pfn_t frame) |
80 | { |
118 | { |
81 | return (uintptr_t) (frame << FRAME_WIDTH); |
119 | return (uintptr_t) (frame << FRAME_WIDTH); |
82 | } |
120 | } |
83 | 121 | ||
Line 96... | Line 134... | ||
96 | static inline size_t FRAMES2SIZE(count_t frames) |
134 | static inline size_t FRAMES2SIZE(count_t frames) |
97 | { |
135 | { |
98 | return (size_t) (frames << FRAME_WIDTH); |
136 | return (size_t) (frames << FRAME_WIDTH); |
99 | } |
137 | } |
100 | 138 | ||
- | 139 | static inline bool zone_flags_available(zone_flags_t flags) |
|
- | 140 | { |
|
- | 141 | return ((flags & (ZONE_RESERVED | ZONE_FIRMWARE)) == 0); |
|
- | 142 | } |
|
- | 143 | ||
101 | #define IS_BUDDY_ORDER_OK(index, order) \ |
144 | #define IS_BUDDY_ORDER_OK(index, order) \ |
102 | ((~(((unative_t) -1) << (order)) & (index)) == 0) |
145 | ((~(((unative_t) -1) << (order)) & (index)) == 0) |
103 | #define IS_BUDDY_LEFT_BLOCK(zone, frame) \ |
146 | #define IS_BUDDY_LEFT_BLOCK(zone, frame) \ |
104 | (((frame_index((zone), (frame)) >> (frame)->buddy_order) & 0x01) == 0) |
147 | (((frame_index((zone), (frame)) >> (frame)->buddy_order) & 0x01) == 0) |
105 | #define IS_BUDDY_RIGHT_BLOCK(zone, frame) \ |
148 | #define IS_BUDDY_RIGHT_BLOCK(zone, frame) \ |
Line 115... | Line 158... | ||
115 | extern void frame_init(void); |
158 | extern void frame_init(void); |
116 | extern void *frame_alloc_generic(uint8_t, frame_flags_t, count_t *); |
159 | extern void *frame_alloc_generic(uint8_t, frame_flags_t, count_t *); |
117 | extern void frame_free(uintptr_t); |
160 | extern void frame_free(uintptr_t); |
118 | extern void frame_reference_add(pfn_t); |
161 | extern void frame_reference_add(pfn_t); |
119 | 162 | ||
- | 163 | extern count_t find_zone(pfn_t frame, count_t count, count_t hint); |
|
120 | extern count_t zone_create(pfn_t, count_t, pfn_t, zone_flags_t); |
164 | extern count_t zone_create(pfn_t, count_t, pfn_t, zone_flags_t); |
121 | extern void *frame_get_parent(pfn_t, count_t); |
165 | extern void *frame_get_parent(pfn_t, count_t); |
122 | extern void frame_set_parent(pfn_t, void *, count_t); |
166 | extern void frame_set_parent(pfn_t, void *, count_t); |
123 | extern void frame_mark_unavailable(pfn_t, count_t); |
167 | extern void frame_mark_unavailable(pfn_t, count_t); |
124 | extern uintptr_t zone_conf_size(count_t); |
168 | extern uintptr_t zone_conf_size(count_t); |