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

lfn serial ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since cdc4334 was a35b458, checked in by Jiří Zárevúcky <zarevucky.jiri@…>, 8 years ago

style: Remove trailing whitespace on _all_ lines, including empty ones, for particular file types.

Command used: tools/srepl '\s\+$' '' -- *.c *.h *.py *.sh *.s *.S *.ag

Currently, whitespace on empty lines is very inconsistent.
There are two basic choices: Either remove the whitespace, or keep empty lines
indented to the level of surrounding code. The former is AFAICT more common,
and also much easier to do automatically.

Alternatively, we could write script for automatic indentation, and use that
instead. However, if such a script exists, it's possible to use the indented
style locally, by having the editor apply relevant conversions on load/save,
without affecting remote repository. IMO, it makes more sense to adopt
the simpler rule.

  • Property mode set to 100644
File size: 5.0 KB
RevLine 
[f761f1eb]1/*
[df4ed85]2 * Copyright (c) 2005 Jakub Jermar
3 * Copyright (c) 2005 Sergey Bondari
[f761f1eb]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
[32fffef0]30/** @addtogroup genericmm
[b45c443]31 * @{
32 */
33/** @file
34 */
35
[32fffef0]36#ifndef KERN_FRAME_H_
37#define KERN_FRAME_H_
[f761f1eb]38
[d99c1d2]39#include <typedefs.h>
[7a0359b]40#include <trace.h>
[b0c2075]41#include <adt/bitmap.h>
[5c9a08b]42#include <adt/list.h>
[e49e234]43#include <synch/spinlock.h>
[085d973]44#include <arch/mm/page.h>
[a82500ce]45#include <arch/mm/frame.h>
[f761f1eb]46
[5f0f29ce]47/** Maximum number of zones in the system. */
48#define ZONES_MAX 32
[085d973]49
[5f0f29ce]50typedef uint8_t frame_flags_t;
51
[8cbf1c3]52#define FRAME_NONE 0x00
[b43eaba0]53/** Do not panic and do not sleep on failure. */
[8cbf1c3]54#define FRAME_ATOMIC 0x01
[b43eaba0]55/** Do not start reclaiming when no free memory. */
[8cbf1c3]56#define FRAME_NO_RECLAIM 0x02
[1433f93e]57/** Do not reserve / unreserve memory. */
[8cbf1c3]58#define FRAME_NO_RESERVE 0x04
[95e882d]59/** Allocate a frame which can be identity-mapped. */
[8cbf1c3]60#define FRAME_LOWMEM 0x08
[e6c4b94]61/** Allocate a frame which cannot be identity-mapped. */
[8cbf1c3]62#define FRAME_HIGHMEM 0x10
[5f0f29ce]63
64typedef uint8_t zone_flags_t;
65
[8cbf1c3]66#define ZONE_NONE 0x00
[e49e234]67/** Available zone (free for allocation) */
[8cbf1c3]68#define ZONE_AVAILABLE 0x01
[5f0f29ce]69/** Zone is reserved (not available for allocation) */
[8cbf1c3]70#define ZONE_RESERVED 0x02
[5f0f29ce]71/** Zone is used by firmware (not available for allocation) */
[8cbf1c3]72#define ZONE_FIRMWARE 0x04
[95e882d]73/** Zone contains memory that can be identity-mapped */
[8cbf1c3]74#define ZONE_LOWMEM 0x08
[e6c4b94]75/** Zone contains memory that cannot be identity-mapped */
[8cbf1c3]76#define ZONE_HIGHMEM 0x10
[5f0f29ce]77
[e6c4b94]78/** Mask of zone bits that must be matched exactly. */
[8cbf1c3]79#define ZONE_EF_MASK 0x07
[e6c4b94]80
[3772af6]81#define FRAME_TO_ZONE_FLAGS(ff) \
82 ((((ff) & FRAME_LOWMEM) ? ZONE_LOWMEM : \
[1a313f7]83 (((ff) & FRAME_HIGHMEM) ? ZONE_HIGHMEM : \
[3772af6]84 ZONE_LOWMEM /* | ZONE_HIGHMEM */)) | \
[aaceebc4]85 ZONE_AVAILABLE)
[e6c4b94]86
87#define ZONE_FLAGS_MATCH(zf, f) \
88 (((((zf) & ZONE_EF_MASK)) == ((f) & ZONE_EF_MASK)) && \
89 (((zf) & ~ZONE_EF_MASK) & (f)))
[f275cb3]90
[e49e234]91typedef struct {
[b0c2075]92 size_t refcount; /**< Tracking of shared frames */
93 void *parent; /**< If allocated by slab, this points there */
[e49e234]94} frame_t;
95
96typedef struct {
[b0c2075]97 /** Frame_no of the first frame in the frames array */
98 pfn_t base;
[a35b458]99
[b0c2075]100 /** Size of zone */
101 size_t count;
[a35b458]102
[b0c2075]103 /** Number of free frame_t structures */
104 size_t free_count;
[a35b458]105
[b0c2075]106 /** Number of busy frame_t structures */
107 size_t busy_count;
[a35b458]108
[b0c2075]109 /** Type of the zone */
110 zone_flags_t flags;
[a35b458]111
[b0c2075]112 /** Frame bitmap */
113 bitmap_t bitmap;
[a35b458]114
[b0c2075]115 /** Array of frame_t structures in this zone */
116 frame_t *frames;
[e49e234]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 {
[da1bafb]124 IRQ_SPINLOCK_DECLARE(lock);
[98000fb]125 size_t count;
[e49e234]126 zone_t info[ZONES_MAX];
127} zones_t;
128
129extern zones_t zones;
130
[f761f1eb]131extern void frame_init(void);
[ad12b5ea]132extern bool frame_adjust_zone_bounds(bool, uintptr_t *, size_t *);
[f72906c]133extern uintptr_t frame_alloc_generic(size_t, frame_flags_t, uintptr_t,
134 size_t *);
[b0c2075]135extern uintptr_t frame_alloc(size_t, frame_flags_t, uintptr_t);
[5df1963]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);
[5f7a0ef]139extern void frame_reference_add(pfn_t);
[8d308b9]140extern size_t frame_total_free_get(void);
[5f7a0ef]141
[5d853bd]142extern size_t find_zone(pfn_t, size_t, size_t);
[98000fb]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);
[bbfdf62]147extern size_t zone_conf_size(size_t);
[8bdcffa]148extern pfn_t zone_external_conf_alloc(size_t);
[98000fb]149extern bool zone_merge(size_t, size_t);
[71eef11]150extern void zone_merge_all(void);
[9dae191e]151extern uint64_t zones_total_size(void);
152extern void zones_stats(uint64_t *, uint64_t *, uint64_t *, uint64_t *);
[dfd9186]153
154/*
155 * Console functions
156 */
[9dae191e]157extern void zones_print_list(void);
[98000fb]158extern void zone_print_one(size_t);
[dfd9186]159
[f761f1eb]160#endif
[b45c443]161
[32fffef0]162/** @}
[b45c443]163 */
Note: See TracBrowser for help on using the repository browser.