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

lfn serial ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since c5396c1 was 5df1963, checked in by Martin Decky <martin@…>, 12 years ago

bitmap frame allocator does not keep track of the size of the allocated frame blocks
to avoid memory leaks the number of allocated frames needs to be passed explicitly during deallocation

  • Property mode set to 100644
File size: 5.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/bitmap.h>
42#include <adt/list.h>
43#include <synch/spinlock.h>
44#include <arch/mm/page.h>
45#include <arch/mm/frame.h>
46
47/** Maximum number of zones in the system. */
48#define ZONES_MAX 32
49
50typedef uint8_t frame_flags_t;
51
52#define FRAME_NONE 0x00
53/** Do not panic and do not sleep on failure. */
54#define FRAME_ATOMIC 0x01
55/** Do not start reclaiming when no free memory. */
56#define FRAME_NO_RECLAIM 0x02
57/** Do not reserve / unreserve memory. */
58#define FRAME_NO_RESERVE 0x04
59/** Allocate a frame which can be identity-mapped. */
60#define FRAME_LOWMEM 0x08
61/** Allocate a frame which cannot be identity-mapped. */
62#define FRAME_HIGHMEM 0x10
63
64typedef uint8_t zone_flags_t;
65
66#define ZONE_NONE 0x00
67/** Available zone (free for allocation) */
68#define ZONE_AVAILABLE 0x01
69/** Zone is reserved (not available for allocation) */
70#define ZONE_RESERVED 0x02
71/** Zone is used by firmware (not available for allocation) */
72#define ZONE_FIRMWARE 0x04
73/** Zone contains memory that can be identity-mapped */
74#define ZONE_LOWMEM 0x08
75/** Zone contains memory that cannot be identity-mapped */
76#define ZONE_HIGHMEM 0x10
77
78/** Mask of zone bits that must be matched exactly. */
79#define ZONE_EF_MASK 0x07
80
81#define FRAME_TO_ZONE_FLAGS(ff) \
82 ((((ff) & FRAME_LOWMEM) ? ZONE_LOWMEM : \
83 (((ff) & FRAME_HIGHMEM) ? ZONE_HIGHMEM : \
84 ZONE_LOWMEM /* | ZONE_HIGHMEM */)) | \
85 ZONE_AVAILABLE)
86
87#define ZONE_FLAGS_MATCH(zf, f) \
88 (((((zf) & ZONE_EF_MASK)) == ((f) & ZONE_EF_MASK)) && \
89 (((zf) & ~ZONE_EF_MASK) & (f)))
90
91typedef struct {
92 size_t refcount; /**< Tracking of shared frames */
93 void *parent; /**< If allocated by slab, this points there */
94} frame_t;
95
96typedef struct {
97 /** Frame_no of the first frame in the frames array */
98 pfn_t base;
99
100 /** Size of zone */
101 size_t count;
102
103 /** Number of free frame_t structures */
104 size_t free_count;
105
106 /** Number of busy frame_t structures */
107 size_t busy_count;
108
109 /** Type of the zone */
110 zone_flags_t flags;
111
112 /** Frame bitmap */
113 bitmap_t bitmap;
114
115 /** Array of frame_t structures in this zone */
116 frame_t *frames;
117} zone_t;
118
119/*
120 * The zoneinfo.lock must be locked when accessing zoneinfo structure.
121 * Some of the attributes in zone_t structures are 'read-only'
122 */
123typedef struct {
124 IRQ_SPINLOCK_DECLARE(lock);
125 size_t count;
126 zone_t info[ZONES_MAX];
127} zones_t;
128
129extern zones_t zones;
130
131extern void frame_init(void);
132extern bool frame_adjust_zone_bounds(bool, uintptr_t *, size_t *);
133extern uintptr_t frame_alloc_generic(size_t, frame_flags_t, uintptr_t, size_t *);
134extern uintptr_t frame_alloc(size_t, frame_flags_t, uintptr_t);
135extern uintptr_t frame_alloc_noreserve(size_t, frame_flags_t, uintptr_t);
136extern void frame_free_generic(uintptr_t, size_t, frame_flags_t);
137extern void frame_free(uintptr_t, size_t);
138extern void frame_free_noreserve(uintptr_t, size_t);
139extern void frame_reference_add(pfn_t);
140extern size_t frame_total_free_get(void);
141
142extern size_t find_zone(pfn_t, size_t, size_t);
143extern size_t zone_create(pfn_t, size_t, pfn_t, zone_flags_t);
144extern void *frame_get_parent(pfn_t, size_t);
145extern void frame_set_parent(pfn_t, void *, size_t);
146extern void frame_mark_unavailable(pfn_t, size_t);
147extern size_t zone_conf_size(size_t);
148extern pfn_t zone_external_conf_alloc(size_t);
149extern bool zone_merge(size_t, size_t);
150extern void zone_merge_all(void);
151extern uint64_t zones_total_size(void);
152extern void zones_stats(uint64_t *, uint64_t *, uint64_t *, uint64_t *);
153
154/*
155 * Console functions
156 */
157extern void zones_print_list(void);
158extern void zone_print_one(size_t);
159
160#endif
161
162/** @}
163 */
Note: See TracBrowser for help on using the repository browser.