Subversion Repositories HelenOS

Rev

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);