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

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

Introduce FRAME_LOW_16_GiB slab/frame allocator flag. When specified, the
allocators will not allocate memory above 16 GiB. Each architecture needs to
make sure not to merge zones from below and above 16 GiB. Allocations that
require memory below 16 GiB need to be altered to use this flag.

  • Property mode set to 100644
File size: 3.9 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
39#include <arch/types.h>
[5c9a08b]40#include <adt/list.h>
[7b43e11]41#include <synch/spinlock.h>
[6e8b3c8]42#include <mm/buddy.h>
[085d973]43#include <arch/mm/page.h>
[a82500ce]44#include <arch/mm/frame.h>
[f761f1eb]45
[d43d2f7]46#define ONE_FRAME 0
[a82500ce]47#define TWO_FRAMES 1
[6b781c0]48#define FOUR_FRAMES 2
49
[a82500ce]50
51#ifdef ARCH_STACK_FRAMES
52#define STACK_FRAMES ARCH_STACK_FRAMES
53#else
54#define STACK_FRAMES ONE_FRAME
55#endif
56
[b43eaba0]57/** Maximum number of zones in system. */
58#define ZONES_MAX 16
[085d973]59
[b43eaba0]60/** Convert the frame address to kernel va. */
61#define FRAME_KA 0x1
62/** Do not panic and do not sleep on failure. */
[5f7a0ef]63#define FRAME_ATOMIC 0x2
[b43eaba0]64/** Do not start reclaiming when no free memory. */
[5f7a0ef]65#define FRAME_NO_RECLAIM 0x4
66/** Do not allocate above 16GiB. */
67#define FRAME_LOW_16_GiB 0x8
[f275cb3]68
[7f1c620]69static inline uintptr_t PFN2ADDR(pfn_t frame)
[085d973]70{
[b43eaba0]71 return (uintptr_t) (frame << FRAME_WIDTH);
[085d973]72}
73
[7f1c620]74static inline pfn_t ADDR2PFN(uintptr_t addr)
[085d973]75{
[b43eaba0]76 return (pfn_t) (addr >> FRAME_WIDTH);
[085d973]77}
78
[42744880]79static inline count_t SIZE2FRAMES(size_t size)
[085d973]80{
81 if (!size)
82 return 0;
[b43eaba0]83 return (count_t) ((size - 1) >> FRAME_WIDTH) + 1;
[085d973]84}
85
[71eef11]86static inline size_t FRAMES2SIZE(count_t frames)
87{
88 return (size_t) (frames << FRAME_WIDTH);
89}
90
[b43eaba0]91#define IS_BUDDY_ORDER_OK(index, order) \
[5f7a0ef]92 ((~(((unative_t) -1) << (order)) & (index)) == 0)
[b43eaba0]93#define IS_BUDDY_LEFT_BLOCK(zone, frame) \
[5f7a0ef]94 (((frame_index((zone), (frame)) >> (frame)->buddy_order) & 0x1) == 0)
[b43eaba0]95#define IS_BUDDY_RIGHT_BLOCK(zone, frame) \
[5f7a0ef]96 (((frame_index((zone), (frame)) >> (frame)->buddy_order) & 0x1) == 1)
[b43eaba0]97#define IS_BUDDY_LEFT_BLOCK_ABS(zone, frame) \
[5f7a0ef]98 (((frame_index_abs((zone), (frame)) >> (frame)->buddy_order) & 0x1) == 0)
[b43eaba0]99#define IS_BUDDY_RIGHT_BLOCK_ABS(zone, frame) \
[5f7a0ef]100 (((frame_index_abs((zone), (frame)) >> (frame)->buddy_order) & 0x1) == 1)
[30187eb]101
[b43eaba0]102#define frame_alloc(order, flags) \
[5f7a0ef]103 frame_alloc_generic(order, flags, NULL)
[9b9e385]104
[f761f1eb]105extern void frame_init(void);
[5f7a0ef]106extern void *frame_alloc_generic(uint8_t, int, unsigned int *);
107extern void frame_free(uintptr_t);
108extern void frame_reference_add(pfn_t);
109
110extern int zone_create(pfn_t, count_t, pfn_t, int);
111extern void *frame_get_parent(pfn_t, unsigned int);
112extern void frame_set_parent(pfn_t, void *, unsigned int);
113extern void frame_mark_unavailable(pfn_t, count_t);
114extern uintptr_t zone_conf_size(count_t);
115extern void zone_merge(unsigned int, unsigned int);
[71eef11]116extern void zone_merge_all(void);
117extern uint64_t zone_total_size(void);
[dfd9186]118
119/*
120 * Console functions
121 */
122extern void zone_print_list(void);
[5f7a0ef]123extern void zone_print_one(unsigned int);
[dfd9186]124
[f761f1eb]125#endif
[b45c443]126
[32fffef0]127/** @}
[b45c443]128 */
Note: See TracBrowser for help on using the repository browser.