Changeset 8b863a62 in mainline for kernel/generic/include
- Timestamp:
- 2014-04-16T17:14:06Z (12 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- f857e8b
- Parents:
- dba3e2c (diff), 70b570c (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. - Location:
- kernel/generic/include
- Files:
-
- 1 added
- 1 deleted
- 12 edited
-
adt/bitmap.h (modified) (1 diff)
-
adt/list.h (modified) (5 diffs)
-
config.h (modified) (3 diffs)
-
console/chardev.h (modified) (4 diffs)
-
console/console.h (modified) (2 diffs)
-
debug.h (modified) (1 diff)
-
log.h (added)
-
macros.h (modified) (1 diff)
-
mm/as.h (modified) (3 diffs)
-
mm/buddy.h (deleted)
-
mm/frame.h (modified) (4 diffs)
-
mm/page.h (modified) (1 diff)
-
mm/slab.h (modified) (3 diffs)
-
synch/spinlock.h (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
kernel/generic/include/adt/bitmap.h
rdba3e2c r8b863a62 38 38 #include <typedefs.h> 39 39 40 #define BITS2BYTES(bits) (bits ? ((((bits)-1)>>3)+1) : 0) 40 #define BITMAP_ELEMENT 8 41 #define BITMAP_REMAINER 7 41 42 42 43 typedef struct { 43 uint8_t *map; 44 size_t bits; 44 size_t elements; 45 uint8_t *bits; 46 size_t next_fit; 45 47 } bitmap_t; 46 48 47 extern void bitmap_initialize(bitmap_t *bitmap, uint8_t *map, size_t bits); 48 extern void bitmap_set_range(bitmap_t *bitmap, size_t start, size_t bits); 49 extern void bitmap_clear_range(bitmap_t *bitmap, size_t start, size_t bits); 50 extern void bitmap_copy(bitmap_t *dst, bitmap_t *src, size_t bits); 49 static inline void bitmap_set(bitmap_t *bitmap, size_t element, 50 unsigned int value) 51 { 52 if (element >= bitmap->elements) 53 return; 54 55 size_t byte = element / BITMAP_ELEMENT; 56 uint8_t mask = 1 << (element & BITMAP_REMAINER); 57 58 if (value) { 59 bitmap->bits[byte] |= mask; 60 } else { 61 bitmap->bits[byte] &= ~mask; 62 bitmap->next_fit = byte; 63 } 64 } 51 65 52 static inline int bitmap_get(bitmap_t *bitmap, size_t bit)66 static inline unsigned int bitmap_get(bitmap_t *bitmap, size_t element) 53 67 { 54 if (bit >= bitmap->bits)68 if (element >= bitmap->elements) 55 69 return 0; 56 70 57 return !! ((bitmap->map)[bit/8] & (1 << (bit & 7))); 71 size_t byte = element / BITMAP_ELEMENT; 72 uint8_t mask = 1 << (element & BITMAP_REMAINER); 73 74 return !!((bitmap->bits)[byte] & mask); 58 75 } 59 76 77 extern size_t bitmap_size(size_t); 78 extern void bitmap_initialize(bitmap_t *, size_t, void *); 79 80 extern void bitmap_set_range(bitmap_t *, size_t, size_t); 81 extern void bitmap_clear_range(bitmap_t *, size_t, size_t); 82 83 extern int bitmap_allocate_range(bitmap_t *, size_t, size_t, size_t, size_t, 84 size_t *); 85 extern void bitmap_copy(bitmap_t *, bitmap_t *, size_t); 60 86 61 87 #endif -
kernel/generic/include/adt/list.h
rdba3e2c r8b863a62 1 1 /* 2 2 * Copyright (c) 2001-2004 Jakub Jermar 3 * Copyright (c) 201 1Jiri Svoboda3 * Copyright (c) 2013 Jiri Svoboda 4 4 * All rights reserved. 5 5 * … … 37 37 #define KERN_LIST_H_ 38 38 39 #include <debug.h> 39 40 #include <typedefs.h> 40 41 #include <trace.h> … … 65 66 66 67 #define list_get_instance(link, type, member) \ 67 ((type *) (((void *)(link)) - ((void *) &(((type *) NULL)->member)))) 68 69 #define list_foreach(list, iterator) \ 70 for (link_t *iterator = (list).head.next; \ 71 iterator != &(list).head; iterator = iterator->next) 68 ((type *) (((void *)(link)) - list_link_to_void(&(((type *) NULL)->member)))) 69 70 #define list_foreach(list, member, itype, iterator) \ 71 for (itype *iterator = NULL; iterator == NULL; iterator = (itype *) 1) \ 72 for (link_t *_link = (list).head.next; \ 73 iterator = list_get_instance(_link, itype, member), \ 74 _link != &(list).head; _link = _link->next) 75 76 #define list_foreach_rev(list, member, itype, iterator) \ 77 for (itype *iterator = NULL; iterator == NULL; iterator = (itype *) 1) \ 78 for (link_t *_link = (list).head.prev; \ 79 iterator = list_get_instance(_link, itype, member), \ 80 _link != &(list).head; _link = _link->prev) 72 81 73 82 #define assert_link_not_used(link) \ 74 ASSERT( ((link)->prev == NULL) && ((link)->next == NULL))83 ASSERT(!link_used(link)) 75 84 76 85 /** Initialize doubly-linked circular list link … … 204 213 } 205 214 215 /** Get next item in list. 216 * 217 * @param link Current item link 218 * @param list List containing @a link 219 * 220 * @return Next item or NULL if @a link is the last item. 221 */ 222 static inline link_t *list_next(link_t *link, const list_t *list) 223 { 224 return (link->next == &list->head) ? NULL : link->next; 225 } 226 227 /** Get previous item in list. 228 * 229 * @param link Current item link 230 * @param list List containing @a link 231 * 232 * @return Previous item or NULL if @a link is the first item. 233 */ 234 static inline link_t *list_prev(link_t *link, const list_t *list) 235 { 236 return (link->prev == &list->head) ? NULL : link->prev; 237 } 238 206 239 /** Split or concatenate headless doubly-linked circular list 207 240 * … … 270 303 { 271 304 unsigned int cnt = 0; 272 273 list_foreach(*list, link) { 305 link_t *link; 306 307 link = list_first(list); 308 while (link != NULL) { 274 309 if (cnt == n) 275 310 return link; 276 311 277 312 cnt++; 313 link = list_next(link, list); 278 314 } 279 315 280 316 return NULL; 317 } 318 319 /** Verify that argument type is a pointer to link_t (at compile time). 320 * 321 * This can be used to check argument type in a macro. 322 */ 323 static inline const void *list_link_to_void(const link_t *link) 324 { 325 return link; 326 } 327 328 /** Determine if link is used. 329 * 330 * @param link Link 331 * @return @c true if link is used, @c false if not. 332 */ 333 static inline bool link_used(link_t *link) 334 { 335 if (link->prev == NULL && link->next == NULL) 336 return false; 337 338 ASSERT(link->prev != NULL && link->next != NULL); 339 return true; 281 340 } 282 341 -
kernel/generic/include/config.h
rdba3e2c r8b863a62 37 37 38 38 #include <arch/mm/page.h> 39 #include <macros.h> 39 40 40 #define ONE_FRAME 0 41 #define TWO_FRAMES 1 42 #define FOUR_FRAMES 2 41 #define STACK_FRAMES 2 42 #define STACK_SIZE FRAMES2SIZE(STACK_FRAMES) 43 43 44 #define STACK_FRAMES TWO_FRAMES 45 #define STACK_SIZE ((1 << STACK_FRAMES) << PAGE_WIDTH) 46 47 #define STACK_SIZE_USER (1 * 1024 * 1024) 44 #define STACK_SIZE_USER (1 * 1024 * 1024) 48 45 49 46 #define CONFIG_INIT_TASKS 32 50 47 #define CONFIG_TASK_NAME_BUFLEN 32 51 48 #define CONFIG_TASK_ARGUMENTS_BUFLEN 64 52 53 /**54 * Maximum buffer size allowed for IPC_M_DATA_WRITE and IPC_M_DATA_READ55 * requests.56 */57 #define DATA_XFER_LIMIT (64 * 1024)58 49 59 50 #ifndef __ASM__ … … 97 88 /** Size of initial stack. */ 98 89 size_t stack_size; 99 90 100 91 bool identity_configured; 101 92 /** Base address of the kernel identity mapped memory. */ … … 103 94 /** Size of the kernel identity mapped memory. */ 104 95 size_t identity_size; 105 106 bool non_identity_configured; 107 96 97 bool non_identity_configured; 98 108 99 /** End of physical memory. */ 109 100 uint64_t physmem_end; -
kernel/generic/include/console/chardev.h
rdba3e2c r8b863a62 43 43 #define INDEV_BUFLEN 512 44 44 45 /** Input character device out-of-band signal type. */ 46 typedef enum { 47 INDEV_SIGNAL_SCROLL_UP = 0, 48 INDEV_SIGNAL_SCROLL_DOWN 49 } indev_signal_t; 50 45 51 struct indev; 46 52 47 /* Input character device operations interface. */53 /** Input character device operations interface. */ 48 54 typedef struct { 49 55 /** Read character directly from device, assume interrupts disabled. */ 50 56 wchar_t (* poll)(struct indev *); 57 58 /** Signal out-of-band condition. */ 59 void (* signal)(struct indev *, indev_signal_t); 51 60 } indev_operations_t; 52 61 … … 67 76 } indev_t; 68 77 69 70 78 struct outdev; 71 79 72 /* Output character device operations interface. */80 /** Output character device operations interface. */ 73 81 typedef struct { 74 82 /** Write character to output. */ … … 77 85 /** Redraw any previously cached characters. */ 78 86 void (* redraw)(struct outdev *); 87 88 /** Scroll up in the device cache. */ 89 void (* scroll_up)(struct outdev *); 90 91 /** Scroll down in the device cache. */ 92 void (* scroll_down)(struct outdev *); 79 93 } outdev_operations_t; 80 94 … … 99 113 extern void indev_push_character(indev_t *, wchar_t); 100 114 extern wchar_t indev_pop_character(indev_t *); 115 extern void indev_signal(indev_t *, indev_signal_t); 101 116 102 117 extern void outdev_initialize(const char *, outdev_t *, -
kernel/generic/include/console/console.h
rdba3e2c r8b863a62 39 39 #include <print.h> 40 40 #include <console/chardev.h> 41 #include <synch/spinlock.h> 41 42 42 43 #define PAGING(counter, increment, before, after) \ … … 62 63 extern void console_init(void); 63 64 64 extern void klog_init(void); 65 extern void klog_update(void *); 65 extern void kio_init(void); 66 extern void kio_update(void *); 67 extern void kio_flush(void); 68 extern void kio_push_char(const wchar_t); 69 SPINLOCK_EXTERN(kio_lock); 66 70 67 71 extern wchar_t getc(indev_t *indev); 68 72 extern size_t gets(indev_t *indev, char *buf, size_t buflen); 69 extern sysarg_t sys_k log(int cmd, const void *buf, size_t size);73 extern sysarg_t sys_kio(int cmd, const void *buf, size_t size); 70 74 71 75 extern void grab_console(void); -
kernel/generic/include/debug.h
rdba3e2c r8b863a62 107 107 #define LOG(format, ...) \ 108 108 do { \ 109 printf("%s() from %s at %s:%u: " format "\n", __func__, \ 109 log(LF_OTHER, LVL_DEBUG, \ 110 "%s() from %s at %s:%u: " format,__func__, \ 110 111 symtab_fmt_name_lookup(CALLER), __FILE__, __LINE__, \ 111 112 ##__VA_ARGS__); \ -
kernel/generic/include/macros.h
rdba3e2c r8b863a62 117 117 overlaps(KA2PA((x)), (szx), KA2PA((y)), (szy)) 118 118 119 #define PFN2ADDR(frame) ((frame) << FRAME_WIDTH) 120 #define ADDR2PFN(addr) ((addr) >> FRAME_WIDTH) 121 122 #define FRAMES2SIZE(frames) ((frames) << FRAME_WIDTH) 123 #define SIZE2FRAMES(size) \ 124 (((size) == 0) ? 0 : ((((size) - 1) >> FRAME_WIDTH) + 1)) 125 119 126 #define KiB2SIZE(kb) ((kb) << 10) 120 127 #define MiB2SIZE(mb) ((mb) << 20) -
kernel/generic/include/mm/as.h
rdba3e2c r8b863a62 140 140 /** This structure can be deallocated if refcount drops to 0. */ 141 141 size_t refcount; 142 142 /** True if the area has been ever shared. */ 143 bool shared; 144 143 145 /** 144 146 * B+tree containing complete map of anonymous pages of the shared area. 145 147 */ 146 148 btree_t pagemap; 149 150 /** Address space area backend. */ 151 struct mem_backend *backend; 152 /** Address space area shared data. */ 153 void *backend_shared_data; 147 154 } share_info_t; 148 155 … … 169 176 uintptr_t base; 170 177 size_t frames; 178 bool anonymous; 171 179 }; 172 180 } mem_backend_data_t; … … 226 234 int (* page_fault)(as_area_t *, uintptr_t, pf_access_t); 227 235 void (* frame_free)(as_area_t *, uintptr_t, uintptr_t); 236 237 bool (* create_shared_data)(as_area_t *); 238 void (* destroy_shared_data)(void *); 228 239 } mem_backend_t; 229 240 -
kernel/generic/include/mm/frame.h
rdba3e2c r8b863a62 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 0x2062 #define FRAME_HIGHMEM 0x10 65 63 66 64 typedef uint8_t zone_flags_t; 67 65 68 #define ZONE_NONE 0x066 #define ZONE_NONE 0x00 69 67 /** Available zone (free for allocation) */ 70 #define ZONE_AVAILABLE 0x 168 #define ZONE_AVAILABLE 0x01 71 69 /** Zone is reserved (not available for allocation) */ 72 #define ZONE_RESERVED 0x 270 #define ZONE_RESERVED 0x02 73 71 /** Zone is used by firmware (not available for allocation) */ 74 #define ZONE_FIRMWARE 0x 472 #define ZONE_FIRMWARE 0x04 75 73 /** Zone contains memory that can be identity-mapped */ 76 #define ZONE_LOWMEM 0x874 #define ZONE_LOWMEM 0x08 77 75 /** Zone contains memory that cannot be identity-mapped */ 78 #define ZONE_HIGHMEM 0x1076 #define ZONE_HIGHMEM 0x10 79 77 80 78 /** Mask of zone bits that must be matched exactly. */ 81 #define ZONE_EF_MASK 0x779 #define ZONE_EF_MASK 0x07 82 80 83 #define FRAME_TO_ZONE_FLAGS(ff) \81 #define FRAME_TO_ZONE_FLAGS(ff) \ 84 82 ((((ff) & FRAME_LOWMEM) ? ZONE_LOWMEM : \ 85 83 (((ff) & FRAME_HIGHMEM) ? ZONE_HIGHMEM : \ 86 84 ZONE_LOWMEM /* | ZONE_HIGHMEM */)) | \ 87 ZONE_AVAILABLE) 85 ZONE_AVAILABLE) 88 86 89 87 #define ZONE_FLAGS_MATCH(zf, f) \ … … 92 90 93 91 typedef struct { 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 */ 92 size_t refcount; /**< Tracking of shared frames */ 93 void *parent; /**< If allocated by slab, this points there */ 99 94 } frame_t; 100 95 101 96 typedef struct { 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 */ 97 /** Frame_no of the first frame in the frames array */ 98 pfn_t base; 110 99 111 frame_t *frames; /**< Array of frame_t structures 112 in this zone */ 113 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; 114 117 } zone_t; 115 118 … … 126 129 extern zones_t zones; 127 130 128 NO_TRACE static inline uintptr_t PFN2ADDR(pfn_t frame)129 {130 return (uintptr_t) (frame << FRAME_WIDTH);131 }132 133 NO_TRACE static inline pfn_t ADDR2PFN(uintptr_t addr)134 {135 return (pfn_t) (addr >> FRAME_WIDTH);136 }137 138 NO_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 145 NO_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 161 131 extern void frame_init(void); 162 132 extern bool frame_adjust_zone_bounds(bool, uintptr_t *, size_t *); 163 extern void *frame_alloc_generic(uint8_t, frame_flags_t, size_t *);164 extern void *frame_alloc(uint8_t, frame_flags_t);165 extern void *frame_alloc_noreserve(uint8_t, frame_flags_t);166 extern void frame_free_generic(uintptr_t, frame_flags_t);167 extern void frame_free(uintptr_t );168 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); 169 139 extern void frame_reference_add(pfn_t); 170 140 extern size_t frame_total_free_get(void); -
kernel/generic/include/mm/page.h
rdba3e2c r8b863a62 65 65 extern void page_table_destroy(pte_t *); 66 66 67 extern int page_find_mapping(uintptr_t, void **);68 extern sysarg_t sys_page_find_mapping(uintptr_t, void*);67 extern int page_find_mapping(uintptr_t, uintptr_t *); 68 extern sysarg_t sys_page_find_mapping(uintptr_t, uintptr_t *); 69 69 70 70 #endif -
kernel/generic/include/mm/slab.h
rdba3e2c r8b863a62 55 55 /** Maximum wasted space we allow for cache */ 56 56 #define SLAB_MAX_BADNESS(cache) \ 57 ( ((unsigned int) PAGE_SIZE << (cache)->order) >> 2)57 (FRAMES2SIZE((cache)->frames) >> 2) 58 58 59 59 /* slab_reclaim constants */ … … 90 90 91 91 /* Configuration */ 92 92 93 /** Size of slab position - align_up(sizeof(obj)) */ 93 94 size_t size; … … 100 101 101 102 /* Computed values */ 102 uint8_t order; /**< Order of frames to be allocated */103 size_t frames; /**< Number of frames to be allocated */ 103 104 size_t objects; /**< Number of objects that fit in */ 104 105 -
kernel/generic/include/synch/spinlock.h
rdba3e2c r8b863a62 137 137 #ifdef CONFIG_DEBUG_SPINLOCK 138 138 139 #include < print.h>139 #include <log.h> 140 140 141 141 #define DEADLOCK_THRESHOLD 100000000 … … 146 146 if ((pname)++ > (value)) { \ 147 147 (pname) = 0; \ 148 printf("Deadlock probe %s: exceeded threshold %u\n" \ 148 log(LF_OTHER, LVL_WARN, \ 149 "Deadlock probe %s: exceeded threshold %u\n" \ 149 150 "cpu%u: function=%s, line=%u\n", \ 150 151 #pname, (value), CPU->id, __func__, __LINE__); \
Note:
See TracChangeset
for help on using the changeset viewer.
