Ignore:
File:
1 edited

Legend:

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

    r5df1963 raaceebc4  
    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
     65/** Allocate a frame which needs to be from DMA zone. */
     66#define FRAME_DMA         0x40
    6367
    6468typedef uint8_t zone_flags_t;
    6569
    66 #define ZONE_NONE       0x00
     70#define ZONE_NONE       0x0
    6771/** Available zone (free for allocation) */
    68 #define ZONE_AVAILABLE  0x01
     72#define ZONE_AVAILABLE  0x1
    6973/** Zone is reserved (not available for allocation) */
    70 #define ZONE_RESERVED   0x02
     74#define ZONE_RESERVED   0x2
    7175/** Zone is used by firmware (not available for allocation) */
    72 #define ZONE_FIRMWARE   0x04
     76#define ZONE_FIRMWARE   0x4
    7377/** Zone contains memory that can be identity-mapped */
    74 #define ZONE_LOWMEM     0x08
     78#define ZONE_LOWMEM     0x8
    7579/** Zone contains memory that cannot be identity-mapped */
    76 #define ZONE_HIGHMEM    0x10
     80#define ZONE_HIGHMEM    0x10
     81/** Zone contains memory suitable for old ISA DMA */
     82#define ZONE_DMA        0x20
    7783
    7884/** Mask of zone bits that must be matched exactly. */
    79 #define ZONE_EF_MASK  0x07
     85#define ZONE_EF_MASK    0x7
    8086
    81 #define FRAME_TO_ZONE_FLAGS(ff) \
    82         ((((ff) & FRAME_LOWMEM) ? ZONE_LOWMEM : \
     87#define FRAME_TO_ZONE_FLAGS(ff) \
     88        ((((ff) & FRAME_DMA) ? ZONE_DMA : \
     89            (((ff) & FRAME_LOWMEM) ? ZONE_LOWMEM : \
    8390            (((ff) & FRAME_HIGHMEM) ? ZONE_HIGHMEM : \
    84             ZONE_LOWMEM /* | ZONE_HIGHMEM */)) | \
     91            ZONE_LOWMEM /* | ZONE_HIGHMEM */))) | \
    8592            ZONE_AVAILABLE)
    8693
     
    9097
    9198typedef struct {
    92         size_t refcount;  /**< Tracking of shared frames */
    93         void *parent;     /**< If allocated by slab, this points there */
     99        size_t refcount;      /**< Tracking of shared frames */
     100        link_t buddy_link;    /**< Link to the next free block inside
     101                                   one order */
     102        void *parent;         /**< If allocated by slab, this points there */
     103        uint8_t buddy_order;  /**< Buddy system block order */
    94104} frame_t;
    95105
    96106typedef struct {
    97         /** Frame_no of the first frame in the frames array */
    98         pfn_t base;
     107        pfn_t base;                    /**< Frame_no of the first frame
     108                                            in the frames array */
     109        size_t count;                  /**< Size of zone */
     110        size_t free_count;             /**< Number of free frame_t
     111                                            structures */
     112        size_t busy_count;             /**< Number of busy frame_t
     113                                            structures */
     114        zone_flags_t flags;            /**< Type of the zone */
    99115       
    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;
     116        frame_t *frames;               /**< Array of frame_t structures
     117                                            in this zone */
     118        buddy_system_t *buddy_system;  /**< Buddy system for the zone */
    117119} zone_t;
    118120
     
    129131extern zones_t zones;
    130132
     133NO_TRACE static inline uintptr_t PFN2ADDR(pfn_t frame)
     134{
     135        return (uintptr_t) (frame << FRAME_WIDTH);
     136}
     137
     138NO_TRACE static inline pfn_t ADDR2PFN(uintptr_t addr)
     139{
     140        return (pfn_t) (addr >> FRAME_WIDTH);
     141}
     142
     143NO_TRACE static inline size_t SIZE2FRAMES(size_t size)
     144{
     145        if (!size)
     146                return 0;
     147        return (size_t) ((size - 1) >> FRAME_WIDTH) + 1;
     148}
     149
     150NO_TRACE static inline size_t FRAMES2SIZE(size_t frames)
     151{
     152        return (size_t) (frames << FRAME_WIDTH);
     153}
     154
     155#define IS_BUDDY_ORDER_OK(index, order) \
     156    ((~(((sysarg_t) -1) << (order)) & (index)) == 0)
     157#define IS_BUDDY_LEFT_BLOCK(zone, frame) \
     158    (((frame_index((zone), (frame)) >> (frame)->buddy_order) & 0x1) == 0)
     159#define IS_BUDDY_RIGHT_BLOCK(zone, frame) \
     160    (((frame_index((zone), (frame)) >> (frame)->buddy_order) & 0x1) == 1)
     161#define IS_BUDDY_LEFT_BLOCK_ABS(zone, frame) \
     162    (((frame_index_abs((zone), (frame)) >> (frame)->buddy_order) & 0x1) == 0)
     163#define IS_BUDDY_RIGHT_BLOCK_ABS(zone, frame) \
     164    (((frame_index_abs((zone), (frame)) >> (frame)->buddy_order) & 0x1) == 1)
     165
    131166extern void frame_init(void);
    132167extern bool frame_adjust_zone_bounds(bool, uintptr_t *, size_t *);
    133 extern uintptr_t frame_alloc_generic(size_t, frame_flags_t, uintptr_t, size_t *);
    134 extern uintptr_t frame_alloc(size_t, frame_flags_t, uintptr_t);
    135 extern uintptr_t frame_alloc_noreserve(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);
     168extern void *frame_alloc_generic(uint8_t, frame_flags_t, size_t *);
     169extern void *frame_alloc(uint8_t, frame_flags_t);
     170extern void *frame_alloc_noreserve(uint8_t, frame_flags_t);
     171extern void frame_free_generic(uintptr_t, frame_flags_t);
     172extern void frame_free(uintptr_t);
     173extern void frame_free_noreserve(uintptr_t);
    139174extern void frame_reference_add(pfn_t);
    140175extern size_t frame_total_free_get(void);
Note: See TracChangeset for help on using the changeset viewer.