source: mainline/kernel/generic/include/mm/frame.h@ 0d8a304

lfn serial ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since 0d8a304 was 8d308b9, checked in by Jakub Jermar <jakub@…>, 14 years ago

Start tracking reservable memory after zones are created and possibly
merged. The initial amount of reservable memory is the number of free
frames at the time of call to reserve_init().

  • Property mode set to 100644
File size: 6.1 KB
Line 
1/*
2 * Copyright (c) 2005 Jakub Jermar
3 * Copyright (c) 2005 Sergey Bondari
4 * All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:
9 *
10 * - Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * - Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
15 * - The name of the author may not be used to endorse or promote products
16 * derived from this software without specific prior written permission.
17 *
18 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
19 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
20 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
21 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
22 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
23 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
27 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28 */
29
30/** @addtogroup genericmm
31 * @{
32 */
33/** @file
34 */
35
36#ifndef KERN_FRAME_H_
37#define KERN_FRAME_H_
38
39#include <typedefs.h>
40#include <trace.h>
41#include <adt/list.h>
42#include <mm/buddy.h>
43#include <synch/spinlock.h>
44#include <arch/mm/page.h>
45#include <arch/mm/frame.h>
46
47#define ONE_FRAME 0
48#define TWO_FRAMES 1
49#define FOUR_FRAMES 2
50
51
52#ifdef ARCH_STACK_FRAMES
53 #define STACK_FRAMES ARCH_STACK_FRAMES
54#else
55 #define STACK_FRAMES ONE_FRAME
56#endif
57
58/** Maximum number of zones in the system. */
59#define ZONES_MAX 32
60
61typedef uint8_t frame_flags_t;
62
63/** Convert the frame address to kernel VA. */
64#define FRAME_KA 0x1
65/** Do not panic and do not sleep on failure. */
66#define FRAME_ATOMIC 0x2
67/** Do not start reclaiming when no free memory. */
68#define FRAME_NO_RECLAIM 0x4
69/** Do not reserve / unreserve memory. */
70#define FRAME_NO_RESERVE 0x8
71
72typedef uint8_t zone_flags_t;
73
74/** Available zone (free for allocation) */
75#define ZONE_AVAILABLE 0x0
76/** Zone is reserved (not available for allocation) */
77#define ZONE_RESERVED 0x8
78/** Zone is used by firmware (not available for allocation) */
79#define ZONE_FIRMWARE 0x10
80
81/** Currently there is no equivalent zone flags
82 for frame flags */
83#define FRAME_TO_ZONE_FLAGS(frame_flags) 0
84
85typedef struct {
86 size_t refcount; /**< Tracking of shared frames */
87 uint8_t buddy_order; /**< Buddy system block order */
88 link_t buddy_link; /**< Link to the next free block inside
89 one order */
90 void *parent; /**< If allocated by slab, this points there */
91} frame_t;
92
93typedef struct {
94 pfn_t base; /**< Frame_no of the first frame
95 in the frames array */
96 size_t count; /**< Size of zone */
97 size_t free_count; /**< Number of free frame_t
98 structures */
99 size_t busy_count; /**< Number of busy frame_t
100 structures */
101 zone_flags_t flags; /**< Type of the zone */
102
103 frame_t *frames; /**< Array of frame_t structures
104 in this zone */
105 buddy_system_t *buddy_system; /**< Buddy system for the zone */
106} zone_t;
107
108/*
109 * The zoneinfo.lock must be locked when accessing zoneinfo structure.
110 * Some of the attributes in zone_t structures are 'read-only'
111 */
112typedef struct {
113 IRQ_SPINLOCK_DECLARE(lock);
114 size_t count;
115 zone_t info[ZONES_MAX];
116} zones_t;
117
118extern zones_t zones;
119
120NO_TRACE static inline uintptr_t PFN2ADDR(pfn_t frame)
121{
122 return (uintptr_t) (frame << FRAME_WIDTH);
123}
124
125NO_TRACE static inline pfn_t ADDR2PFN(uintptr_t addr)
126{
127 return (pfn_t) (addr >> FRAME_WIDTH);
128}
129
130NO_TRACE static inline size_t SIZE2FRAMES(size_t size)
131{
132 if (!size)
133 return 0;
134 return (size_t) ((size - 1) >> FRAME_WIDTH) + 1;
135}
136
137NO_TRACE static inline size_t FRAMES2SIZE(size_t frames)
138{
139 return (size_t) (frames << FRAME_WIDTH);
140}
141
142NO_TRACE static inline bool zone_flags_available(zone_flags_t flags)
143{
144 return ((flags & (ZONE_RESERVED | ZONE_FIRMWARE)) == 0);
145}
146
147#define IS_BUDDY_ORDER_OK(index, order) \
148 ((~(((sysarg_t) -1) << (order)) & (index)) == 0)
149#define IS_BUDDY_LEFT_BLOCK(zone, frame) \
150 (((frame_index((zone), (frame)) >> (frame)->buddy_order) & 0x1) == 0)
151#define IS_BUDDY_RIGHT_BLOCK(zone, frame) \
152 (((frame_index((zone), (frame)) >> (frame)->buddy_order) & 0x1) == 1)
153#define IS_BUDDY_LEFT_BLOCK_ABS(zone, frame) \
154 (((frame_index_abs((zone), (frame)) >> (frame)->buddy_order) & 0x1) == 0)
155#define IS_BUDDY_RIGHT_BLOCK_ABS(zone, frame) \
156 (((frame_index_abs((zone), (frame)) >> (frame)->buddy_order) & 0x1) == 1)
157
158extern void frame_init(void);
159extern void *frame_alloc_generic(uint8_t, frame_flags_t, size_t *);
160extern void *frame_alloc(uint8_t, frame_flags_t);
161extern void *frame_alloc_noreserve(uint8_t, frame_flags_t);
162extern void frame_free_generic(uintptr_t, frame_flags_t);
163extern void frame_free(uintptr_t);
164extern void frame_free_noreserve(uintptr_t);
165extern void frame_reference_add(pfn_t);
166extern size_t frame_total_free_get(void);
167
168extern size_t find_zone(pfn_t, size_t, size_t);
169extern size_t zone_create(pfn_t, size_t, pfn_t, zone_flags_t);
170extern void *frame_get_parent(pfn_t, size_t);
171extern void frame_set_parent(pfn_t, void *, size_t);
172extern void frame_mark_unavailable(pfn_t, size_t);
173extern size_t zone_conf_size(size_t);
174extern bool zone_merge(size_t, size_t);
175extern void zone_merge_all(void);
176extern uint64_t zones_total_size(void);
177extern void zones_stats(uint64_t *, uint64_t *, uint64_t *, uint64_t *);
178
179/*
180 * Console functions
181 */
182extern void zones_print_list(void);
183extern void zone_print_one(size_t);
184
185#endif
186
187/** @}
188 */
Note: See TracBrowser for help on using the repository browser.