Changeset 99c2c69e in mainline for kernel/generic/include/mm/frame.h
- Timestamp:
- 2013-09-13T00:36:30Z (11 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 67fbd5e
- Parents:
- 7f84430 (diff), 11d41be5 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)
links above to see all the changes relative to each parent. - File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/generic/include/mm/frame.h
r7f84430 r99c2c69e 39 39 #include <typedefs.h> 40 40 #include <trace.h> 41 #include <adt/bitmap.h> 41 42 #include <adt/list.h> 42 #include <mm/buddy.h>43 43 #include <synch/spinlock.h> 44 44 #include <arch/mm/page.h> … … 50 50 typedef uint8_t frame_flags_t; 51 51 52 #define FRAME_NONE 0x0 53 /** Convert the frame address to kernel VA. */ 54 #define FRAME_KA 0x1 52 #define FRAME_NONE 0x00 55 53 /** Do not panic and do not sleep on failure. */ 56 #define FRAME_ATOMIC 0x 254 #define FRAME_ATOMIC 0x01 57 55 /** Do not start reclaiming when no free memory. */ 58 #define FRAME_NO_RECLAIM 0x 456 #define FRAME_NO_RECLAIM 0x02 59 57 /** Do not reserve / unreserve memory. */ 60 #define FRAME_NO_RESERVE 0x 858 #define FRAME_NO_RESERVE 0x04 61 59 /** Allocate a frame which can be identity-mapped. */ 62 #define FRAME_LOWMEM 0x1060 #define FRAME_LOWMEM 0x08 63 61 /** Allocate a frame which cannot be identity-mapped. */ 64 #define FRAME_HIGHMEM 0x20 65 /** Allocate a frame which needs to be from DMA zone. */ 66 #define FRAME_DMA 0x40 62 #define FRAME_HIGHMEM 0x10 67 63 68 64 typedef uint8_t zone_flags_t; 69 65 70 #define ZONE_NONE 0x066 #define ZONE_NONE 0x00 71 67 /** Available zone (free for allocation) */ 72 #define ZONE_AVAILABLE 0x 168 #define ZONE_AVAILABLE 0x01 73 69 /** Zone is reserved (not available for allocation) */ 74 #define ZONE_RESERVED 0x 270 #define ZONE_RESERVED 0x02 75 71 /** Zone is used by firmware (not available for allocation) */ 76 #define ZONE_FIRMWARE 0x 472 #define ZONE_FIRMWARE 0x04 77 73 /** Zone contains memory that can be identity-mapped */ 78 #define ZONE_LOWMEM 0x874 #define ZONE_LOWMEM 0x08 79 75 /** Zone contains memory that cannot be identity-mapped */ 80 #define ZONE_HIGHMEM 0x10 81 /** Zone contains memory suitable for old ISA DMA */ 82 #define ZONE_DMA 0x20 76 #define ZONE_HIGHMEM 0x10 83 77 84 78 /** Mask of zone bits that must be matched exactly. */ 85 #define ZONE_EF_MASK 0x779 #define ZONE_EF_MASK 0x07 86 80 87 #define FRAME_TO_ZONE_FLAGS(ff) \ 88 ((((ff) & FRAME_DMA) ? ZONE_DMA : \ 89 (((ff) & FRAME_LOWMEM) ? ZONE_LOWMEM : \ 81 #define FRAME_TO_ZONE_FLAGS(ff) \ 82 ((((ff) & FRAME_LOWMEM) ? ZONE_LOWMEM : \ 90 83 (((ff) & FRAME_HIGHMEM) ? ZONE_HIGHMEM : \ 91 ZONE_LOWMEM /* | ZONE_HIGHMEM */)) )| \84 ZONE_LOWMEM /* | ZONE_HIGHMEM */)) | \ 92 85 ZONE_AVAILABLE) 93 86 … … 97 90 98 91 typedef struct { 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 */ 92 size_t refcount; /**< Tracking of shared frames */ 93 void *parent; /**< If allocated by slab, this points there */ 104 94 } frame_t; 105 95 106 96 typedef struct { 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 */ 97 /** Frame_no of the first frame in the frames array */ 98 pfn_t base; 115 99 116 frame_t *frames; /**< Array of frame_t structures 117 in this zone */ 118 buddy_system_t *buddy_system; /**< Buddy system for the zone */ 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; 119 117 } zone_t; 120 118 … … 131 129 extern zones_t zones; 132 130 133 NO_TRACE static inline uintptr_t PFN2ADDR(pfn_t frame)134 {135 return (uintptr_t) (frame << FRAME_WIDTH);136 }137 138 NO_TRACE static inline pfn_t ADDR2PFN(uintptr_t addr)139 {140 return (pfn_t) (addr >> FRAME_WIDTH);141 }142 143 NO_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 150 NO_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 166 131 extern void frame_init(void); 167 132 extern bool frame_adjust_zone_bounds(bool, uintptr_t *, size_t *); 168 extern void *frame_alloc_generic(uint8_t, frame_flags_t, size_t *);169 extern void *frame_alloc(uint8_t, frame_flags_t);170 extern void *frame_alloc_noreserve(uint8_t, frame_flags_t);171 extern void frame_free_generic(uintptr_t, frame_flags_t);172 extern void frame_free(uintptr_t );173 extern void frame_free_noreserve(uintptr_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); 174 139 extern void frame_reference_add(pfn_t); 175 140 extern size_t frame_total_free_get(void);
Note:
See TracChangeset
for help on using the changeset viewer.