Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • kernel/generic/include/mm/frame.h

    rf72906c r9d58539  
    3939#include <typedefs.h>
    4040#include <trace.h>
    41 #include <adt/bitmap.h>
    4241#include <adt/list.h>
     42#include <mm/buddy.h>
    4343#include <synch/spinlock.h>
    4444#include <arch/mm/page.h>
     
    5050typedef uint8_t frame_flags_t;
    5151
    52 #define FRAME_NONE        0x00
     52#define FRAME_NONE        0x0
     53/** Convert the frame address to kernel VA. */
     54#define FRAME_KA          0x1
    5355/** Do not panic and do not sleep on failure. */
    54 #define FRAME_ATOMIC      0x01
     56#define FRAME_ATOMIC      0x2
    5557/** Do not start reclaiming when no free memory. */
    56 #define FRAME_NO_RECLAIM  0x02
     58#define FRAME_NO_RECLAIM  0x4
    5759/** Do not reserve / unreserve memory. */
    58 #define FRAME_NO_RESERVE  0x04
     60#define FRAME_NO_RESERVE  0x8
    5961/** Allocate a frame which can be identity-mapped. */
    60 #define FRAME_LOWMEM      0x08
     62#define FRAME_LOWMEM      0x10
    6163/** Allocate a frame which cannot be identity-mapped. */
    62 #define FRAME_HIGHMEM     0x10
     64#define FRAME_HIGHMEM     0x20
    6365
    6466typedef uint8_t zone_flags_t;
    6567
    66 #define ZONE_NONE       0x00
     68#define ZONE_NONE       0x0
    6769/** Available zone (free for allocation) */
    68 #define ZONE_AVAILABLE  0x01
     70#define ZONE_AVAILABLE  0x1
    6971/** Zone is reserved (not available for allocation) */
    70 #define ZONE_RESERVED   0x02
     72#define ZONE_RESERVED   0x2
    7173/** Zone is used by firmware (not available for allocation) */
    72 #define ZONE_FIRMWARE   0x04
     74#define ZONE_FIRMWARE   0x4
    7375/** Zone contains memory that can be identity-mapped */
    74 #define ZONE_LOWMEM     0x08
     76#define ZONE_LOWMEM     0x8
    7577/** Zone contains memory that cannot be identity-mapped */
    76 #define ZONE_HIGHMEM    0x10
     78#define ZONE_HIGHMEM    0x10
    7779
    7880/** Mask of zone bits that must be matched exactly. */
    79 #define ZONE_EF_MASK  0x07
     81#define ZONE_EF_MASK    0x7
    8082
    81 #define FRAME_TO_ZONE_FLAGS(ff) \
     83#define FRAME_TO_ZONE_FLAGS(ff) \
    8284        ((((ff) & FRAME_LOWMEM) ? ZONE_LOWMEM : \
    8385            (((ff) & FRAME_HIGHMEM) ? ZONE_HIGHMEM : \
    8486            ZONE_LOWMEM /* | ZONE_HIGHMEM */)) | \
    85             ZONE_AVAILABLE)
     87            ZONE_AVAILABLE) 
    8688
    8789#define ZONE_FLAGS_MATCH(zf, f) \
     
    9092
    9193typedef struct {
    92         size_t refcount;  /**< Tracking of shared frames */
    93         void *parent;     /**< If allocated by slab, this points there */
     94        size_t refcount;      /**< Tracking of shared frames */
     95        link_t buddy_link;    /**< Link to the next free block inside
     96                                   one order */
     97        void *parent;         /**< If allocated by slab, this points there */
     98        uint8_t buddy_order;  /**< Buddy system block order */
    9499} frame_t;
    95100
    96101typedef struct {
    97         /** Frame_no of the first frame in the frames array */
    98         pfn_t base;
     102        pfn_t base;                    /**< Frame_no of the first frame
     103                                            in the frames array */
     104        size_t count;                  /**< Size of zone */
     105        size_t free_count;             /**< Number of free frame_t
     106                                            structures */
     107        size_t busy_count;             /**< Number of busy frame_t
     108                                            structures */
     109        zone_flags_t flags;            /**< Type of the zone */
    99110       
    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;
     111        frame_t *frames;               /**< Array of frame_t structures
     112                                            in this zone */
     113        buddy_system_t *buddy_system;  /**< Buddy system for the zone */
    117114} zone_t;
    118115
     
    129126extern zones_t zones;
    130127
     128NO_TRACE static inline uintptr_t PFN2ADDR(pfn_t frame)
     129{
     130        return (uintptr_t) (frame << FRAME_WIDTH);
     131}
     132
     133NO_TRACE static inline pfn_t ADDR2PFN(uintptr_t addr)
     134{
     135        return (pfn_t) (addr >> FRAME_WIDTH);
     136}
     137
     138NO_TRACE static inline size_t SIZE2FRAMES(size_t size)
     139{
     140        if (!size)
     141                return 0;
     142        return (size_t) ((size - 1) >> FRAME_WIDTH) + 1;
     143}
     144
     145NO_TRACE static inline size_t FRAMES2SIZE(size_t frames)
     146{
     147        return (size_t) (frames << FRAME_WIDTH);
     148}
     149
     150#define IS_BUDDY_ORDER_OK(index, order) \
     151    ((~(((sysarg_t) -1) << (order)) & (index)) == 0)
     152#define IS_BUDDY_LEFT_BLOCK(zone, frame) \
     153    (((frame_index((zone), (frame)) >> (frame)->buddy_order) & 0x1) == 0)
     154#define IS_BUDDY_RIGHT_BLOCK(zone, frame) \
     155    (((frame_index((zone), (frame)) >> (frame)->buddy_order) & 0x1) == 1)
     156#define IS_BUDDY_LEFT_BLOCK_ABS(zone, frame) \
     157    (((frame_index_abs((zone), (frame)) >> (frame)->buddy_order) & 0x1) == 0)
     158#define IS_BUDDY_RIGHT_BLOCK_ABS(zone, frame) \
     159    (((frame_index_abs((zone), (frame)) >> (frame)->buddy_order) & 0x1) == 1)
     160
    131161extern void frame_init(void);
    132162extern bool frame_adjust_zone_bounds(bool, uintptr_t *, size_t *);
    133 extern uintptr_t frame_alloc_generic(size_t, frame_flags_t, uintptr_t,
    134     size_t *);
    135 extern uintptr_t frame_alloc(size_t, frame_flags_t, uintptr_t);
    136 extern void frame_free_generic(uintptr_t, size_t, frame_flags_t);
    137 extern void frame_free(uintptr_t, size_t);
    138 extern void frame_free_noreserve(uintptr_t, size_t);
     163extern void *frame_alloc_generic(uint8_t, frame_flags_t, size_t *);
     164extern void *frame_alloc(uint8_t, frame_flags_t);
     165extern void *frame_alloc_noreserve(uint8_t, frame_flags_t);
     166extern void frame_free_generic(uintptr_t, frame_flags_t);
     167extern void frame_free(uintptr_t);
     168extern void frame_free_noreserve(uintptr_t);
    139169extern void frame_reference_add(pfn_t);
    140170extern size_t frame_total_free_get(void);
Note: See TracChangeset for help on using the changeset viewer.