Changeset 9d47440 in mainline for kernel/generic
- Timestamp:
- 2011-05-21T16:23:17Z (15 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 0ff03f3
- Parents:
- 8d308b9 (diff), 13f2461 (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
- Files:
-
- 36 edited
-
include/adt/list.h (modified) (11 diffs)
-
include/arch.h (modified) (3 diffs)
-
include/config.h (modified) (2 diffs)
-
include/cpu.h (modified) (1 diff)
-
include/ipc/event.h (modified) (2 diffs)
-
include/ipc/event_types.h (modified) (1 diff)
-
include/mm/as.h (modified) (1 diff)
-
include/mm/frame.h (modified) (1 diff)
-
include/mm/page.h (modified) (1 diff)
-
include/proc/task.h (modified) (1 diff)
-
include/proc/thread.h (modified) (1 diff)
-
include/proc/uarg.h (modified) (1 diff)
-
include/synch/waitq.h (modified) (1 diff)
-
include/syscall/syscall.h (modified) (1 diff)
-
include/typedefs.h (modified) (1 diff)
-
src/adt/list.c (modified) (1 diff)
-
src/console/cmd.c (modified) (1 diff)
-
src/console/console.c (modified) (8 diffs)
-
src/ddi/ddi.c (modified) (1 diff)
-
src/debug/panic.c (modified) (1 diff)
-
src/interrupt/interrupt.c (modified) (1 diff)
-
src/ipc/event.c (modified) (3 diffs)
-
src/lib/elf.c (modified) (1 diff)
-
src/main/main.c (modified) (4 diffs)
-
src/main/uinit.c (modified) (6 diffs)
-
src/mm/as.c (modified) (51 diffs)
-
src/mm/backend_anon.c (modified) (1 diff)
-
src/printf/vprintf.c (modified) (2 diffs)
-
src/proc/program.c (modified) (2 diffs)
-
src/proc/scheduler.c (modified) (1 diff)
-
src/proc/task.c (modified) (7 diffs)
-
src/proc/the.c (modified) (2 diffs)
-
src/proc/thread.c (modified) (7 diffs)
-
src/security/cap.c (modified) (2 diffs)
-
src/synch/spinlock.c (modified) (1 diff)
-
src/syscall/syscall.c (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
kernel/generic/include/adt/list.h
r8d308b9 r9d47440 41 41 /** Doubly linked list head and link type. */ 42 42 typedef struct link { 43 struct link *prev; /**< Pointer to the previous item in the list. */44 struct link *next; /**< Pointer to the next item in the list. */43 struct link *prev; /**< Pointer to the previous item in the list. */ 44 struct link *next; /**< Pointer to the next item in the list. */ 45 45 } link_t; 46 46 … … 48 48 * 49 49 * @param name Name of the new statically allocated list. 50 * 50 51 */ 51 52 #define LIST_INITIALIZE(name) \ 52 link_t name = { .prev = &name, .next = &name } 53 link_t name = { \ 54 .prev = &name, \ 55 .next = &name \ 56 } 57 58 #define list_get_instance(link, type, member) \ 59 ((type *) (((void *)(link)) - ((void *) &(((type *) NULL)->member)))) 60 61 #define list_foreach(list, iterator) \ 62 for (link_t *iterator = (list).next; \ 63 iterator != &(list); iterator = iterator->next) 53 64 54 65 /** Initialize doubly-linked circular list link … … 57 68 * 58 69 * @param link Pointer to link_t structure to be initialized. 70 * 59 71 */ 60 72 NO_TRACE static inline void link_initialize(link_t *link) … … 68 80 * Initialize doubly-linked circular list. 69 81 * 70 * @param head Pointer to link_t structure representing head of the list. 71 */ 72 NO_TRACE static inline void list_initialize(link_t *head) 73 { 74 head->prev = head; 75 head->next = head; 82 * @param list Pointer to link_t structure representing the list. 83 * 84 */ 85 NO_TRACE static inline void list_initialize(link_t *list) 86 { 87 list->prev = list; 88 list->next = list; 76 89 } 77 90 … … 81 94 * 82 95 * @param link Pointer to link_t structure to be added. 83 * @param head Pointer to link_t structure representing head of the list. 84 */ 85 NO_TRACE static inline void list_prepend(link_t *link, link_t *head) 86 { 87 link->next = head->next; 88 link->prev = head; 89 head->next->prev = link; 90 head->next = link; 96 * @param list Pointer to link_t structure representing the list. 97 * 98 */ 99 NO_TRACE static inline void list_prepend(link_t *link, link_t *list) 100 { 101 link->next = list->next; 102 link->prev = list; 103 list->next->prev = link; 104 list->next = link; 91 105 } 92 106 … … 96 110 * 97 111 * @param link Pointer to link_t structure to be added. 98 * @param head Pointer to link_t structure representing head of the list. 99 */ 100 NO_TRACE static inline void list_append(link_t *link, link_t *head) 101 { 102 link->prev = head->prev; 103 link->next = head; 104 head->prev->next = link; 105 head->prev = link; 112 * @param list Pointer to link_t structure representing the list. 113 * 114 */ 115 NO_TRACE static inline void list_append(link_t *link, link_t *list) 116 { 117 link->prev = list->prev; 118 link->next = list; 119 list->prev->next = link; 120 list->prev = link; 121 } 122 123 /** Insert item before another item in doubly-linked circular list. 124 * 125 */ 126 static inline void list_insert_before(link_t *link, link_t *list) 127 { 128 list_append(link, list); 129 } 130 131 /** Insert item after another item in doubly-linked circular list. 132 * 133 */ 134 static inline void list_insert_after(link_t *link, link_t *list) 135 { 136 list_prepend(list, link); 106 137 } 107 138 … … 110 141 * Remove item from doubly-linked circular list. 111 142 * 112 * @param link Pointer to link_t structure to be removed from the list it is 113 * contained in. 143 * @param link Pointer to link_t structure to be removed from the list 144 * it is contained in. 145 * 114 146 */ 115 147 NO_TRACE static inline void list_remove(link_t *link) … … 124 156 * Query emptiness of doubly-linked circular list. 125 157 * 126 * @param head Pointer to link_t structure representing head of the list. 127 */ 128 NO_TRACE static inline bool list_empty(link_t *head) 129 { 130 return head->next == head ? true : false; 131 } 132 158 * @param list Pointer to link_t structure representing the list. 159 * 160 */ 161 NO_TRACE static inline int list_empty(link_t *list) 162 { 163 return (list->next == list); 164 } 165 166 /** Get head item of a list. 167 * 168 * @param list Pointer to link_t structure representing the list. 169 * 170 * @return Head item of the list. 171 * @return NULL if the list is empty. 172 * 173 */ 174 static inline link_t *list_head(link_t *list) 175 { 176 return ((list->next == list) ? NULL : list->next); 177 } 133 178 134 179 /** Split or concatenate headless doubly-linked circular list … … 139 184 * concatenates splitted lists and splits concatenated lists. 140 185 * 141 * @param part1 Pointer to link_t structure leading the first (half of the 142 * headless) list. 143 * @param part2 Pointer to link_t structure leading the second (half of the 144 * headless) list. 186 * @param part1 Pointer to link_t structure leading the first 187 * (half of the headless) list. 188 * @param part2 Pointer to link_t structure leading the second 189 * (half of the headless) list. 190 * 145 191 */ 146 192 NO_TRACE static inline void headless_list_split_or_concat(link_t *part1, link_t *part2) 147 193 { 148 link_t *hlp;149 150 194 part1->prev->next = part2; 151 part2->prev->next = part1; 152 hlp = part1->prev; 195 part2->prev->next = part1; 196 197 link_t *hlp = part1->prev; 198 153 199 part1->prev = part2->prev; 154 200 part2->prev = hlp; 155 201 } 156 202 157 158 203 /** Split headless doubly-linked circular list 159 204 * 160 205 * Split headless doubly-linked circular list. 161 206 * 162 * @param part1 Pointer to link_t structure leading the first half of the 163 * headless list. 164 * @param part2 Pointer to link_t structure leading the second half of the 165 * headless list. 207 * @param part1 Pointer to link_t structure leading 208 * the first half of the headless list. 209 * @param part2 Pointer to link_t structure leading 210 * the second half of the headless list. 211 * 166 212 */ 167 213 NO_TRACE static inline void headless_list_split(link_t *part1, link_t *part2) … … 174 220 * Concatenate two headless doubly-linked circular lists. 175 221 * 176 * @param part1 Pointer to link_t structure leading the first headless list. 177 * @param part2 Pointer to link_t structure leading the second headless list. 222 * @param part1 Pointer to link_t structure leading 223 * the first headless list. 224 * @param part2 Pointer to link_t structure leading 225 * the second headless list. 226 * 178 227 */ 179 228 NO_TRACE static inline void headless_list_concat(link_t *part1, link_t *part2) … … 182 231 } 183 232 184 #define list_get_instance(link, type, member) \ 185 ((type *)(((uint8_t *)(link)) - ((uint8_t *)&(((type *)NULL)->member)))) 186 187 extern bool list_member(const link_t *link, const link_t *head); 188 extern void list_concat(link_t *head1, link_t *head2); 233 /** Get n-th item of a list. 234 * 235 * @param list Pointer to link_t structure representing the list. 236 * @param n Item number (indexed from zero). 237 * 238 * @return n-th item of the list. 239 * @return NULL if no n-th item found. 240 * 241 */ 242 static inline link_t *list_nth(link_t *list, unsigned int n) 243 { 244 unsigned int cnt = 0; 245 246 list_foreach(*list, link) { 247 if (cnt == n) 248 return link; 249 250 cnt++; 251 } 252 253 return NULL; 254 } 255 256 extern int list_member(const link_t *, const link_t *); 257 extern void list_concat(link_t *, link_t *); 258 extern unsigned int list_count(const link_t *); 189 259 190 260 #endif -
kernel/generic/include/arch.h
r8d308b9 r9d47440 41 41 #include <mm/as.h> 42 42 43 #define DEFAULT_CONTEXT 0 43 /* 44 * THE is not an abbreviation, but the English definite article written in 45 * capital letters. It means the current pointer to something, e.g. thread, 46 * processor or address space. Kind reader of this comment shall appreciate 47 * the wit of constructs like THE->thread and similar. 48 */ 49 #define THE ((the_t * )(get_stack_base())) 44 50 45 51 #define CPU THE->cpu … … 47 53 #define TASK THE->task 48 54 #define AS THE->as 49 #define CONTEXT (THE->task ? THE->task->context : DEFAULT_CONTEXT)50 55 #define PREEMPTION_DISABLED THE->preemption_disabled 56 #define MAGIC UINT32_C(0xfacefeed) 51 57 52 #define context_check(ctx1, ctx2) ((ctx1) == (ctx2)) 58 #define container_check(ctn1, ctn2) ((ctn1) == (ctn2)) 59 60 #define DEFAULT_CONTAINER 0 61 #define CONTAINER \ 62 ((THE->task) ? (THE->task->container) : (DEFAULT_CONTAINER)) 53 63 54 64 /** … … 63 73 cpu_t *cpu; /**< Executing cpu. */ 64 74 as_t *as; /**< Current address space. */ 75 uint32_t magic; /**< Magic value */ 65 76 } the_t; 66 67 /*68 * THE is not an abbreviation, but the English definite article written in69 * capital letters. It means the current pointer to something, e.g. thread,70 * processor or address space. Kind reader of this comment shall appreciate71 * the wit of constructs like THE->thread and similar.72 */73 #define THE ((the_t * )(get_stack_base()))74 77 75 78 extern void the_initialize(the_t *); -
kernel/generic/include/config.h
r8d308b9 r9d47440 36 36 #define KERN_CONFIG_H_ 37 37 38 #include <typedefs.h>39 38 #include <arch/mm/page.h> 40 39 41 #define STACK_SIZE PAGE_SIZE 40 #define ONE_FRAME 0 41 #define TWO_FRAMES 1 42 #define FOUR_FRAMES 2 43 44 #define STACK_FRAMES TWO_FRAMES 45 #define STACK_SIZE ((1 << STACK_FRAMES) << PAGE_WIDTH) 42 46 43 47 #define CONFIG_INIT_TASKS 32 44 48 #define CONFIG_TASK_NAME_BUFLEN 32 49 50 #ifndef __ASM__ 51 52 #include <typedefs.h> 45 53 46 54 typedef struct { … … 80 88 extern ballocs_t ballocs; 81 89 90 #endif /* __ASM__ */ 91 82 92 #endif 83 93 -
kernel/generic/include/cpu.h
r8d308b9 r9d47440 41 41 #include <arch/cpu.h> 42 42 #include <arch/context.h> 43 44 #define CPU_STACK_SIZE STACK_SIZE45 43 46 44 /** CPU structure. -
kernel/generic/include/ipc/event.h
r8d308b9 r9d47440 41 41 #include <ipc/ipc.h> 42 42 43 typedef void (*event_callback_t)(void); 44 43 45 /** Event notification structure. */ 44 46 typedef struct { … … 51 53 /** Counter. */ 52 54 size_t counter; 55 56 /** Masked flag. */ 57 bool masked; 58 /** Unmask callback. */ 59 event_callback_t unmask_callback; 53 60 } event_t; 54 61 55 62 extern void event_init(void); 63 extern void event_cleanup_answerbox(answerbox_t *); 64 extern void event_set_unmask_callback(event_type_t, event_callback_t); 65 66 #define event_notify_0(e, m) \ 67 event_notify((e), (m), 0, 0, 0, 0, 0) 68 #define event_notify_1(e, m, a1) \ 69 event_notify((e), (m), (a1), 0, 0, 0, 0) 70 #define event_notify_2(e, m, a1, a2) \ 71 event_notify((e), (m), (a1), (a2), 0, 0, 0) 72 #define event_notify_3(e, m, a1, a2, a3) \ 73 event_notify((e), (m), (a1), (a2), (a3), 0, 0) 74 #define event_notify_4(e, m, a1, a2, a3, a4) \ 75 event_notify((e), (m), (a1), (a2), (a3), (a4), 0) 76 #define event_notify_5(e, m, a1, a2, a3, a4, a5) \ 77 event_notify((e), (m), (a1), (a2), (a3), (a4), (a5)) 78 79 extern int event_notify(event_type_t, bool, sysarg_t, sysarg_t, sysarg_t, 80 sysarg_t, sysarg_t); 81 56 82 extern sysarg_t sys_event_subscribe(sysarg_t, sysarg_t); 57 extern bool event_is_subscribed(event_type_t); 58 extern void event_cleanup_answerbox(answerbox_t *); 59 60 #define event_notify_0(e) \ 61 event_notify((e), 0, 0, 0, 0, 0) 62 #define event_notify_1(e, a1) \ 63 event_notify((e), (a1), 0, 0, 0, 0) 64 #define event_notify_2(e, a1, a2) \ 65 event_notify((e), (a1), (a2), 0, 0, 0) 66 #define event_notify_3(e, a1, a2, a3) \ 67 event_notify((e), (a1), (a2), (a3), 0, 0) 68 #define event_notify_4(e, a1, a2, a3, a4) \ 69 event_notify((e), (a1), (a2), (a3), (a4), 0) 70 #define event_notify_5(e, a1, a2, a3, a4, a5) \ 71 event_notify((e), (a1), (a2), (a3), (a4), (a5)) 72 73 extern void event_notify(event_type_t, sysarg_t, sysarg_t, sysarg_t, 74 sysarg_t, sysarg_t); 83 extern sysarg_t sys_event_unmask(sysarg_t); 75 84 76 85 #endif -
kernel/generic/include/ipc/event_types.h
r8d308b9 r9d47440 39 39 /** New data available in kernel log */ 40 40 EVENT_KLOG = 0, 41 /** Returning from kernel console to us erspace */41 /** Returning from kernel console to uspace */ 42 42 EVENT_KCONSOLE, 43 43 /** A task/thread has faulted and will be terminated */ -
kernel/generic/include/mm/as.h
r8d308b9 r9d47440 84 84 #define USER_ADDRESS_SPACE_END USER_ADDRESS_SPACE_END_ARCH 85 85 86 #define USTACK_ADDRESS USTACK_ADDRESS_ARCH 86 #ifdef USTACK_ADDRESS_ARCH 87 #define USTACK_ADDRESS USTACK_ADDRESS_ARCH 88 #else 89 #define USTACK_ADDRESS (USER_ADDRESS_SPACE_END - (STACK_SIZE - 1)) 90 #endif 87 91 88 92 /** Kernel address space. */ -
kernel/generic/include/mm/frame.h
r8d308b9 r9d47440 44 44 #include <arch/mm/page.h> 45 45 #include <arch/mm/frame.h> 46 47 #define ONE_FRAME 048 #define TWO_FRAMES 149 #define FOUR_FRAMES 250 51 52 #ifdef ARCH_STACK_FRAMES53 #define STACK_FRAMES ARCH_STACK_FRAMES54 #else55 #define STACK_FRAMES ONE_FRAME56 #endif57 46 58 47 /** Maximum number of zones in the system. */ -
kernel/generic/include/mm/page.h
r8d308b9 r9d47440 38 38 #include <typedefs.h> 39 39 #include <mm/as.h> 40 #include <memstr.h> 40 #include <arch/mm/page.h> 41 42 #define P2SZ(pages) \ 43 ((pages) << PAGE_WIDTH) 41 44 42 45 /** Operations to manipulate page mappings. */ -
kernel/generic/include/proc/task.h
r8d308b9 r9d47440 78 78 /** Unique identity of task. */ 79 79 task_id_t taskid; 80 /** Task security cont ext. */81 cont ext_id_t context;80 /** Task security container. */ 81 container_id_t container; 82 82 83 83 /** Number of references (i.e. threads). */ -
kernel/generic/include/proc/thread.h
r8d308b9 r9d47440 49 49 #include <sysinfo/abi.h> 50 50 51 #define THREAD_STACK_SIZE STACK_SIZE52 51 #define THREAD_NAME_BUFLEN 20 53 52 -
kernel/generic/include/proc/uarg.h
r8d308b9 r9d47440 40 40 void *uspace_entry; 41 41 void *uspace_stack; 42 42 43 43 void (* uspace_thread_function)(); 44 44 void *uspace_thread_arg; -
kernel/generic/include/synch/waitq.h
r8d308b9 r9d47440 62 62 int missed_wakeups; 63 63 64 /** List of sleeping threads for w ich there was no missed_wakeup. */64 /** List of sleeping threads for which there was no missed_wakeup. */ 65 65 link_t head; 66 66 } waitq_t; -
kernel/generic/include/syscall/syscall.h
r8d308b9 r9d47440 75 75 76 76 SYS_EVENT_SUBSCRIBE, 77 SYS_EVENT_UNMASK, 77 78 78 79 SYS_CAP_GRANT, -
kernel/generic/include/typedefs.h
r8d308b9 r9d47440 64 64 typedef uint64_t thread_id_t; 65 65 typedef uint64_t task_id_t; 66 typedef uint32_t cont ext_id_t;66 typedef uint32_t container_id_t; 67 67 68 68 typedef int32_t inr_t; -
kernel/generic/src/adt/list.c
r8d308b9 r9d47440 52 52 * 53 53 */ 54 boollist_member(const link_t *link, const link_t *head)54 int list_member(const link_t *link, const link_t *head) 55 55 { 56 56 bool found = false; -
kernel/generic/src/console/cmd.c
r8d308b9 r9d47440 1107 1107 release_console(); 1108 1108 1109 event_notify_0(EVENT_KCONSOLE );1109 event_notify_0(EVENT_KCONSOLE, false); 1110 1110 indev_pop_character(stdin); 1111 1111 -
kernel/generic/src/console/console.c
r8d308b9 r9d47440 53 53 #include <str.h> 54 54 55 #define KLOG_PAGES 455 #define KLOG_PAGES 8 56 56 #define KLOG_LENGTH (KLOG_PAGES * PAGE_SIZE / sizeof(wchar_t)) 57 #define KLOG_LATENCY 858 57 59 58 /** Kernel log cyclic buffer */ … … 61 60 62 61 /** Kernel log initialized */ 63 static bool klog_inited = false;62 static atomic_t klog_inited = {false}; 64 63 65 64 /** First kernel log characters */ … … 76 75 77 76 /** Kernel log spinlock */ 78 SPINLOCK_STATIC_INITIALIZE_NAME(klog_lock, " *klog_lock");77 SPINLOCK_STATIC_INITIALIZE_NAME(klog_lock, "klog_lock"); 79 78 80 79 /** Physical memory area used for klog buffer */ … … 166 165 sysinfo_set_item_val("klog.pages", NULL, KLOG_PAGES); 167 166 168 spinlock_lock(&klog_lock); 169 klog_inited = true; 170 spinlock_unlock(&klog_lock); 167 event_set_unmask_callback(EVENT_KLOG, klog_update); 168 atomic_set(&klog_inited, true); 171 169 } 172 170 … … 263 261 void klog_update(void) 264 262 { 263 if (!atomic_get(&klog_inited)) 264 return; 265 265 266 spinlock_lock(&klog_lock); 266 267 267 if ((klog_inited) && (event_is_subscribed(EVENT_KLOG)) && (klog_uspace > 0)) { 268 event_notify_3(EVENT_KLOG, klog_start, klog_len, klog_uspace); 269 klog_uspace = 0; 268 if (klog_uspace > 0) { 269 if (event_notify_3(EVENT_KLOG, true, klog_start, klog_len, 270 klog_uspace) == EOK) 271 klog_uspace = 0; 270 272 } 271 273 … … 275 277 void putchar(const wchar_t ch) 276 278 { 279 bool ordy = ((stdout) && (stdout->op->write)); 280 277 281 spinlock_lock(&klog_lock); 278 282 279 if ((klog_stored > 0) && (stdout) && (stdout->op->write)) { 280 /* Print charaters stored in kernel log */ 281 size_t i; 282 for (i = klog_len - klog_stored; i < klog_len; i++) 283 stdout->op->write(stdout, klog[(klog_start + i) % KLOG_LENGTH], silent); 284 klog_stored = 0; 283 /* Print charaters stored in kernel log */ 284 if (ordy) { 285 while (klog_stored > 0) { 286 wchar_t tmp = klog[(klog_start + klog_len - klog_stored) % KLOG_LENGTH]; 287 klog_stored--; 288 289 /* 290 * We need to give up the spinlock for 291 * the physical operation of writting out 292 * the character. 293 */ 294 spinlock_unlock(&klog_lock); 295 stdout->op->write(stdout, tmp, silent); 296 spinlock_lock(&klog_lock); 297 } 285 298 } 286 299 … … 292 305 klog_start = (klog_start + 1) % KLOG_LENGTH; 293 306 294 if ((stdout) && (stdout->op->write)) 307 if (!ordy) { 308 if (klog_stored < klog_len) 309 klog_stored++; 310 } 311 312 /* The character is stored for uspace */ 313 if (klog_uspace < klog_len) 314 klog_uspace++; 315 316 spinlock_unlock(&klog_lock); 317 318 if (ordy) { 319 /* 320 * Output the character. In this case 321 * it should be no longer buffered. 322 */ 295 323 stdout->op->write(stdout, ch, silent); 296 else {324 } else { 297 325 /* 298 326 * No standard output routine defined yet. … … 304 332 * Note that the early_putc() function might be 305 333 * a no-op on certain hardware configurations. 306 *307 334 */ 308 335 early_putchar(ch); 309 310 if (klog_stored < klog_len) 311 klog_stored++; 312 } 313 314 /* The character is stored for uspace */ 315 if (klog_uspace < klog_len) 316 klog_uspace++; 317 318 /* Check notify uspace to update */ 319 bool update; 320 if ((klog_uspace > KLOG_LATENCY) || (ch == '\n')) 321 update = true; 322 else 323 update = false; 324 325 spinlock_unlock(&klog_lock); 326 327 if (update) 336 } 337 338 /* Force notification on newline */ 339 if (ch == '\n') 328 340 klog_update(); 329 341 } -
kernel/generic/src/ddi/ddi.c
r8d308b9 r9d47440 224 224 task_t *task = task_find_by_id(id); 225 225 226 if ((!task) || (!cont ext_check(CONTEXT, task->context))) {226 if ((!task) || (!container_check(CONTAINER, task->container))) { 227 227 /* 228 228 * There is no task with the specified ID -
kernel/generic/src/debug/panic.c
r8d308b9 r9d47440 95 95 printf("\n"); 96 96 97 printf("THE=%p: ", THE); 98 if (THE != NULL) { 99 printf("pe=%" PRIun " thr=%p task=%p cpu=%p as=%p" 100 " magic=%#" PRIx32 "\n", THE->preemption_disabled, 101 THE->thread, THE->task, THE->cpu, THE->as, THE->magic); 102 } else 103 printf("invalid\n"); 104 97 105 if (istate) { 98 106 istate_decode(istate); -
kernel/generic/src/interrupt/interrupt.c
r8d308b9 r9d47440 205 205 * stack. 206 206 */ 207 return (istate_t *) ((uint8_t *) thread->kstack + THREAD_STACK_SIZE -208 sizeof(istate_t));207 return (istate_t *) ((uint8_t *) 208 thread->kstack + STACK_SIZE - sizeof(istate_t)); 209 209 } 210 210 -
kernel/generic/src/ipc/event.c
r8d308b9 r9d47440 48 48 static event_t events[EVENT_END]; 49 49 50 /** Initialize kernel events. */ 50 /** Initialize kernel events. 51 * 52 */ 51 53 void event_init(void) 52 54 { 53 unsigned int i; 54 55 for (i = 0; i < EVENT_END; i++) { 55 for (unsigned int i = 0; i < EVENT_END; i++) { 56 56 spinlock_initialize(&events[i].lock, "event.lock"); 57 57 events[i].answerbox = NULL; 58 58 events[i].counter = 0; 59 59 events[i].imethod = 0; 60 events[i].masked = false; 61 events[i].unmask_callback = NULL; 60 62 } 61 63 } 62 64 65 /** Unsubscribe kernel events associated with an answerbox 66 * 67 * @param answerbox Answerbox to be unsubscribed. 68 * 69 */ 70 void event_cleanup_answerbox(answerbox_t *answerbox) 71 { 72 for (unsigned int i = 0; i < EVENT_END; i++) { 73 spinlock_lock(&events[i].lock); 74 75 if (events[i].answerbox == answerbox) { 76 events[i].answerbox = NULL; 77 events[i].counter = 0; 78 events[i].imethod = 0; 79 events[i].masked = false; 80 } 81 82 spinlock_unlock(&events[i].lock); 83 } 84 } 85 86 /** Define a callback function for the event unmask event. 87 * 88 * @param evno Event type. 89 * @param callback Callback function to be called when 90 * the event is unmasked. 91 * 92 */ 93 void event_set_unmask_callback(event_type_t evno, event_callback_t callback) 94 { 95 ASSERT(evno < EVENT_END); 96 97 spinlock_lock(&events[evno].lock); 98 events[evno].unmask_callback = callback; 99 spinlock_unlock(&events[evno].lock); 100 } 101 102 /** Send kernel notification event 103 * 104 * @param evno Event type. 105 * @param mask Mask further notifications after a successful 106 * sending. 107 * @param a1 First argument. 108 * @param a2 Second argument. 109 * @param a3 Third argument. 110 * @param a4 Fourth argument. 111 * @param a5 Fifth argument. 112 * 113 * @return EOK if notification was successfully sent. 114 * @return ENOMEM if the notification IPC message failed to allocate. 115 * @return EBUSY if the notifications of the given type are 116 * currently masked. 117 * @return ENOENT if the notifications of the given type are 118 * currently not subscribed. 119 * 120 */ 121 int event_notify(event_type_t evno, bool mask, sysarg_t a1, sysarg_t a2, 122 sysarg_t a3, sysarg_t a4, sysarg_t a5) 123 { 124 ASSERT(evno < EVENT_END); 125 126 spinlock_lock(&events[evno].lock); 127 128 int ret; 129 130 if (events[evno].answerbox != NULL) { 131 if (!events[evno].masked) { 132 call_t *call = ipc_call_alloc(FRAME_ATOMIC); 133 134 if (call) { 135 call->flags |= IPC_CALL_NOTIF; 136 call->priv = ++events[evno].counter; 137 138 IPC_SET_IMETHOD(call->data, events[evno].imethod); 139 IPC_SET_ARG1(call->data, a1); 140 IPC_SET_ARG2(call->data, a2); 141 IPC_SET_ARG3(call->data, a3); 142 IPC_SET_ARG4(call->data, a4); 143 IPC_SET_ARG5(call->data, a5); 144 145 irq_spinlock_lock(&events[evno].answerbox->irq_lock, true); 146 list_append(&call->link, &events[evno].answerbox->irq_notifs); 147 irq_spinlock_unlock(&events[evno].answerbox->irq_lock, true); 148 149 waitq_wakeup(&events[evno].answerbox->wq, WAKEUP_FIRST); 150 151 if (mask) 152 events[evno].masked = true; 153 154 ret = EOK; 155 } else 156 ret = ENOMEM; 157 } else 158 ret = EBUSY; 159 } else 160 ret = ENOENT; 161 162 spinlock_unlock(&events[evno].lock); 163 164 return ret; 165 } 166 167 /** Subscribe event notifications 168 * 169 * @param evno Event type. 170 * @param imethod IPC interface and method to be used for 171 * the notifications. 172 * @param answerbox Answerbox to send the notifications to. 173 * 174 * @return EOK if the subscription was successful. 175 * @return EEXISTS if the notifications of the given type are 176 * already subscribed. 177 * 178 */ 63 179 static int event_subscribe(event_type_t evno, sysarg_t imethod, 64 180 answerbox_t *answerbox) 65 181 { 66 if (evno >= EVENT_END) 67 return ELIMIT; 182 ASSERT(evno < EVENT_END); 68 183 69 184 spinlock_lock(&events[evno].lock); … … 75 190 events[evno].imethod = imethod; 76 191 events[evno].counter = 0; 192 events[evno].masked = false; 77 193 res = EOK; 78 194 } else … … 84 200 } 85 201 202 /** Unmask event notifications 203 * 204 * @param evno Event type to unmask. 205 * 206 */ 207 static void event_unmask(event_type_t evno) 208 { 209 ASSERT(evno < EVENT_END); 210 211 spinlock_lock(&events[evno].lock); 212 events[evno].masked = false; 213 event_callback_t callback = events[evno].unmask_callback; 214 spinlock_unlock(&events[evno].lock); 215 216 /* 217 * Check if there is an unmask callback 218 * function defined for this event. 219 */ 220 if (callback != NULL) 221 callback(); 222 } 223 224 /** Event notification syscall wrapper 225 * 226 * @param evno Event type to subscribe. 227 * @param imethod IPC interface and method to be used for 228 * the notifications. 229 * 230 * @return EOK on success. 231 * @return ELIMIT on unknown event type. 232 * @return EEXISTS if the notifications of the given type are 233 * already subscribed. 234 * 235 */ 86 236 sysarg_t sys_event_subscribe(sysarg_t evno, sysarg_t imethod) 87 237 { 238 if (evno >= EVENT_END) 239 return ELIMIT; 240 88 241 return (sysarg_t) event_subscribe((event_type_t) evno, (sysarg_t) 89 242 imethod, &TASK->answerbox); 90 243 } 91 244 92 bool event_is_subscribed(event_type_t evno) 93 { 94 bool res; 95 96 ASSERT(evno < EVENT_END); 97 98 spinlock_lock(&events[evno].lock); 99 res = events[evno].answerbox != NULL; 100 spinlock_unlock(&events[evno].lock); 101 102 return res; 103 } 104 105 106 void event_cleanup_answerbox(answerbox_t *answerbox) 107 { 108 unsigned int i; 109 110 for (i = 0; i < EVENT_END; i++) { 111 spinlock_lock(&events[i].lock); 112 if (events[i].answerbox == answerbox) { 113 events[i].answerbox = NULL; 114 events[i].counter = 0; 115 events[i].imethod = 0; 116 } 117 spinlock_unlock(&events[i].lock); 118 } 119 } 120 121 void event_notify(event_type_t evno, sysarg_t a1, sysarg_t a2, sysarg_t a3, 122 sysarg_t a4, sysarg_t a5) 123 { 124 ASSERT(evno < EVENT_END); 125 126 spinlock_lock(&events[evno].lock); 127 if (events[evno].answerbox != NULL) { 128 call_t *call = ipc_call_alloc(FRAME_ATOMIC); 129 if (call) { 130 call->flags |= IPC_CALL_NOTIF; 131 call->priv = ++events[evno].counter; 132 IPC_SET_IMETHOD(call->data, events[evno].imethod); 133 IPC_SET_ARG1(call->data, a1); 134 IPC_SET_ARG2(call->data, a2); 135 IPC_SET_ARG3(call->data, a3); 136 IPC_SET_ARG4(call->data, a4); 137 IPC_SET_ARG5(call->data, a5); 138 139 irq_spinlock_lock(&events[evno].answerbox->irq_lock, true); 140 list_append(&call->link, &events[evno].answerbox->irq_notifs); 141 irq_spinlock_unlock(&events[evno].answerbox->irq_lock, true); 142 143 waitq_wakeup(&events[evno].answerbox->wq, WAKEUP_FIRST); 144 } 145 } 146 spinlock_unlock(&events[evno].lock); 245 /** Event notification unmask syscall wrapper 246 * 247 * Note that currently no tests are performed whether the calling 248 * task is entitled to unmask the notifications. However, thanks 249 * to the fact that notification masking is only a performance 250 * optimization, this has probably no security implications. 251 * 252 * @param evno Event type to unmask. 253 * 254 * @return EOK on success. 255 * @return ELIMIT on unknown event type. 256 * 257 */ 258 sysarg_t sys_event_unmask(sysarg_t evno) 259 { 260 if (evno >= EVENT_END) 261 return ELIMIT; 262 263 event_unmask((event_type_t) evno); 264 return EOK; 147 265 } 148 266 -
kernel/generic/src/lib/elf.c
r8d308b9 r9d47440 114 114 } 115 115 116 /* Inspect all section headers and proc cess them. */116 /* Inspect all section headers and process them. */ 117 117 for (i = 0; i < header->e_shnum; i++) { 118 118 elf_section_header_t *sechdr = -
kernel/generic/src/main/main.c
r8d308b9 r9d47440 118 118 #endif 119 119 120 #define CONFIG_STACK_SIZE ((1 << STACK_FRAMES) * STACK_SIZE)121 122 120 /** Main kernel routine for bootstrap CPU. 123 121 * … … 139 137 config.kernel_size = ALIGN_UP(hardcoded_ktext_size + 140 138 hardcoded_kdata_size, PAGE_SIZE); 141 config.stack_size = CONFIG_STACK_SIZE;139 config.stack_size = STACK_SIZE; 142 140 143 141 /* Initialy the stack is placed just after the kernel */ … … 165 163 166 164 context_save(&ctx); 167 context_set(&ctx, FADDR(main_bsp_separated_stack), config.stack_base,168 THREAD_STACK_SIZE);165 context_set(&ctx, FADDR(main_bsp_separated_stack), 166 config.stack_base, STACK_SIZE); 169 167 context_restore(&ctx); 170 168 /* not reached */ … … 323 321 context_save(&CPU->saved_context); 324 322 context_set(&CPU->saved_context, FADDR(main_ap_separated_stack), 325 (uintptr_t) CPU->stack, CPU_STACK_SIZE);323 (uintptr_t) CPU->stack, STACK_SIZE); 326 324 context_restore(&CPU->saved_context); 327 325 /* not reached */ -
kernel/generic/src/main/uinit.c
r8d308b9 r9d47440 33 33 /** 34 34 * @file 35 * @brief Userspace bootstrap thread.35 * @brief Userspace bootstrap thread. 36 36 * 37 37 * This file contains uinit kernel thread wich is used to start every … … 40 40 * @see SYS_THREAD_CREATE 41 41 */ 42 42 43 43 #include <main/uinit.h> 44 44 #include <typedefs.h> … … 48 48 #include <arch.h> 49 49 #include <udebug/udebug.h> 50 51 50 52 51 /** Thread used to bring up userspace thread. … … 58 57 { 59 58 uspace_arg_t uarg; 60 59 61 60 /* 62 61 * So far, we don't have a use for joining userspace threads so we … … 68 67 */ 69 68 thread_detach(THREAD); 70 69 71 70 #ifdef CONFIG_UDEBUG 72 71 udebug_stoppable_end(); … … 78 77 uarg.uspace_thread_function = NULL; 79 78 uarg.uspace_thread_arg = NULL; 80 79 81 80 free((uspace_arg_t *) arg); 82 81 -
kernel/generic/src/mm/as.c
r8d308b9 r9d47440 302 302 * We don't want any area to have conflicts with NULL page. 303 303 */ 304 if (overlaps(addr, count << PAGE_WIDTH, (uintptr_t) NULL, PAGE_SIZE))304 if (overlaps(addr, P2SZ(count), (uintptr_t) NULL, PAGE_SIZE)) 305 305 return false; 306 306 … … 329 329 mutex_lock(&area->lock); 330 330 331 if (overlaps(addr, count << PAGE_WIDTH,332 area->base, area->pages << PAGE_WIDTH)) {331 if (overlaps(addr, P2SZ(count), area->base, 332 P2SZ(area->pages))) { 333 333 mutex_unlock(&area->lock); 334 334 return false; … … 346 346 mutex_lock(&area->lock); 347 347 348 if (overlaps(addr, count << PAGE_WIDTH,349 area->base, area->pages << PAGE_WIDTH)) {348 if (overlaps(addr, P2SZ(count), area->base, 349 P2SZ(area->pages))) { 350 350 mutex_unlock(&area->lock); 351 351 return false; … … 366 366 mutex_lock(&area->lock); 367 367 368 if (overlaps(addr, count << PAGE_WIDTH,369 area->base, area->pages << PAGE_WIDTH)) {368 if (overlaps(addr, P2SZ(count), area->base, 369 P2SZ(area->pages))) { 370 370 mutex_unlock(&area->lock); 371 371 return false; … … 380 380 */ 381 381 if (!KERNEL_ADDRESS_SPACE_SHADOWED) { 382 return !overlaps(addr, count << PAGE_WIDTH, 383 KERNEL_ADDRESS_SPACE_START, 382 return !overlaps(addr, P2SZ(count), KERNEL_ADDRESS_SPACE_START, 384 383 KERNEL_ADDRESS_SPACE_END - KERNEL_ADDRESS_SPACE_START); 385 384 } … … 474 473 475 474 btree_node_t *leaf; 476 as_area_t *area = (as_area_t *) btree_search(&as->as_area_btree, va, &leaf); 475 as_area_t *area = (as_area_t *) btree_search(&as->as_area_btree, va, 476 &leaf); 477 477 if (area) { 478 478 /* va is the base address of an address space area */ … … 482 482 483 483 /* 484 * Search the leaf node and the righ most record of its left neighbour484 * Search the leaf node and the rightmost record of its left neighbour 485 485 * to find out whether this is a miss or va belongs to an address 486 486 * space area found there. … … 494 494 495 495 mutex_lock(&area->lock); 496 496 497 497 if ((area->base <= va) && 498 (va < area->base + (area->pages << PAGE_WIDTH)))498 (va <= area->base + (P2SZ(area->pages) - 1))) 499 499 return area; 500 500 … … 506 506 * Because of its position in the B+tree, it must have base < va. 507 507 */ 508 btree_node_t *lnode = btree_leaf_node_left_neighbour(&as->as_area_btree, leaf); 508 btree_node_t *lnode = btree_leaf_node_left_neighbour(&as->as_area_btree, 509 leaf); 509 510 if (lnode) { 510 511 area = (as_area_t *) lnode->value[lnode->keys - 1]; … … 512 513 mutex_lock(&area->lock); 513 514 514 if (va < area->base + (area->pages << PAGE_WIDTH))515 if (va <= area->base + (P2SZ(area->pages) - 1)) 515 516 return area; 516 517 … … 577 578 578 579 if (pages < area->pages) { 579 uintptr_t start_free = area->base + (pages << PAGE_WIDTH);580 uintptr_t start_free = area->base + P2SZ(pages); 580 581 581 582 /* … … 590 591 */ 591 592 ipl_t ipl = tlb_shootdown_start(TLB_INVL_PAGES, as->asid, 592 area->base + (pages << PAGE_WIDTH), area->pages - pages);593 area->base + P2SZ(pages), area->pages - pages); 593 594 594 595 /* … … 613 614 size_t i = 0; 614 615 615 if (overlaps(ptr, size << PAGE_WIDTH, area->base,616 pages << PAGE_WIDTH)) {616 if (overlaps(ptr, P2SZ(size), area->base, 617 P2SZ(pages))) { 617 618 618 if (ptr + (size << PAGE_WIDTH) <= start_free) {619 if (ptr + P2SZ(size) <= start_free) { 619 620 /* 620 621 * The whole interval fits … … 647 648 648 649 for (; i < size; i++) { 649 pte_t *pte = page_mapping_find(as, ptr +650 (i << PAGE_WIDTH));650 pte_t *pte = page_mapping_find(as, 651 ptr + P2SZ(i)); 651 652 652 653 ASSERT(pte); … … 657 658 (area->backend->frame_free)) { 658 659 area->backend->frame_free(area, 659 ptr + (i << PAGE_WIDTH),660 ptr + P2SZ(i), 660 661 PTE_GET_FRAME(pte)); 661 662 } 662 663 663 page_mapping_remove(as, ptr + 664 (i << PAGE_WIDTH)); 664 page_mapping_remove(as, ptr + P2SZ(i)); 665 665 } 666 666 } … … 671 671 */ 672 672 673 tlb_invalidate_pages(as->asid, area->base + (pages << PAGE_WIDTH),673 tlb_invalidate_pages(as->asid, area->base + P2SZ(pages), 674 674 area->pages - pages); 675 675 … … 677 677 * Invalidate software translation caches (e.g. TSB on sparc64). 678 678 */ 679 as_invalidate_translation_cache(as, area->base + 680 (pages << PAGE_WIDTH),area->pages - pages);679 as_invalidate_translation_cache(as, area->base + P2SZ(pages), 680 area->pages - pages); 681 681 tlb_shootdown_finalize(ipl); 682 682 … … 797 797 798 798 for (size = 0; size < (size_t) node->value[i]; size++) { 799 pte_t *pte = 800 page_mapping_find(as, ptr + (size << PAGE_WIDTH));799 pte_t *pte = page_mapping_find(as, 800 ptr + P2SZ(size)); 801 801 802 802 ASSERT(pte); … … 807 807 (area->backend->frame_free)) { 808 808 area->backend->frame_free(area, 809 ptr + (size << PAGE_WIDTH), PTE_GET_FRAME(pte)); 809 ptr + P2SZ(size), 810 PTE_GET_FRAME(pte)); 810 811 } 811 812 812 page_mapping_remove(as, ptr + (size << PAGE_WIDTH));813 page_mapping_remove(as, ptr + P2SZ(size)); 813 814 } 814 815 } … … 897 898 } 898 899 899 size_t src_size = src_area->pages << PAGE_WIDTH;900 size_t src_size = P2SZ(src_area->pages); 900 901 unsigned int src_flags = src_area->flags; 901 902 mem_backend_t *src_backend = src_area->backend; … … 1094 1095 for (cur = area->used_space.leaf_head.next; 1095 1096 cur != &area->used_space.leaf_head; cur = cur->next) { 1096 btree_node_t *node 1097 = list_get_instance(cur, btree_node_t,leaf_link);1097 btree_node_t *node = list_get_instance(cur, btree_node_t, 1098 leaf_link); 1098 1099 btree_key_t i; 1099 1100 … … 1103 1104 1104 1105 for (size = 0; size < (size_t) node->value[i]; size++) { 1105 pte_t *pte = 1106 p age_mapping_find(as, ptr + (size << PAGE_WIDTH));1106 pte_t *pte = page_mapping_find(as, 1107 ptr + P2SZ(size)); 1107 1108 1108 1109 ASSERT(pte); … … 1113 1114 1114 1115 /* Remove old mapping */ 1115 page_mapping_remove(as, ptr + (size << PAGE_WIDTH));1116 page_mapping_remove(as, ptr + P2SZ(size)); 1116 1117 } 1117 1118 } … … 1159 1160 1160 1161 /* Insert the new mapping */ 1161 page_mapping_insert(as, ptr + (size << PAGE_WIDTH),1162 page_mapping_insert(as, ptr + P2SZ(size), 1162 1163 old_frame[frame_idx++], page_flags); 1163 1164 … … 1481 1482 1482 1483 if (src_area) { 1483 size = src_area->pages << PAGE_WIDTH;1484 size = P2SZ(src_area->pages); 1484 1485 mutex_unlock(&src_area->lock); 1485 1486 } else … … 1536 1537 if (page >= right_pg) { 1537 1538 /* Do nothing. */ 1538 } else if (overlaps(page, count << PAGE_WIDTH, left_pg,1539 left_cnt << PAGE_WIDTH)) {1539 } else if (overlaps(page, P2SZ(count), left_pg, 1540 P2SZ(left_cnt))) { 1540 1541 /* The interval intersects with the left interval. */ 1541 1542 return false; 1542 } else if (overlaps(page, count << PAGE_WIDTH, right_pg,1543 right_cnt << PAGE_WIDTH)) {1543 } else if (overlaps(page, P2SZ(count), right_pg, 1544 P2SZ(right_cnt))) { 1544 1545 /* The interval intersects with the right interval. */ 1545 1546 return false; 1546 } else if ((page == left_pg + (left_cnt << PAGE_WIDTH)) &&1547 (page + (count << PAGE_WIDTH) == right_pg)) {1547 } else if ((page == left_pg + P2SZ(left_cnt)) && 1548 (page + P2SZ(count) == right_pg)) { 1548 1549 /* 1549 1550 * The interval can be added by merging the two already … … 1553 1554 btree_remove(&area->used_space, right_pg, leaf); 1554 1555 goto success; 1555 } else if (page == left_pg + (left_cnt << PAGE_WIDTH)) {1556 } else if (page == left_pg + P2SZ(left_cnt)) { 1556 1557 /* 1557 1558 * The interval can be added by simply growing the left … … 1560 1561 node->value[node->keys - 1] += count; 1561 1562 goto success; 1562 } else if (page + (count << PAGE_WIDTH) == right_pg) {1563 } else if (page + P2SZ(count) == right_pg) { 1563 1564 /* 1564 1565 * The interval can be addded by simply moving base of … … 1587 1588 */ 1588 1589 1589 if (overlaps(page, count << PAGE_WIDTH, right_pg, 1590 right_cnt << PAGE_WIDTH)) { 1590 if (overlaps(page, P2SZ(count), right_pg, P2SZ(right_cnt))) { 1591 1591 /* The interval intersects with the right interval. */ 1592 1592 return false; 1593 } else if (page + (count << PAGE_WIDTH) == right_pg) {1593 } else if (page + P2SZ(count) == right_pg) { 1594 1594 /* 1595 1595 * The interval can be added by moving the base of the … … 1626 1626 if (page < left_pg) { 1627 1627 /* Do nothing. */ 1628 } else if (overlaps(page, count << PAGE_WIDTH, left_pg,1629 left_cnt << PAGE_WIDTH)) {1628 } else if (overlaps(page, P2SZ(count), left_pg, 1629 P2SZ(left_cnt))) { 1630 1630 /* The interval intersects with the left interval. */ 1631 1631 return false; 1632 } else if (overlaps(page, count << PAGE_WIDTH, right_pg,1633 right_cnt << PAGE_WIDTH)) {1632 } else if (overlaps(page, P2SZ(count), right_pg, 1633 P2SZ(right_cnt))) { 1634 1634 /* The interval intersects with the right interval. */ 1635 1635 return false; 1636 } else if ((page == left_pg + (left_cnt << PAGE_WIDTH)) &&1637 (page + (count << PAGE_WIDTH) == right_pg)) {1636 } else if ((page == left_pg + P2SZ(left_cnt)) && 1637 (page + P2SZ(count) == right_pg)) { 1638 1638 /* 1639 1639 * The interval can be added by merging the two already … … 1643 1643 btree_remove(&area->used_space, right_pg, node); 1644 1644 goto success; 1645 } else if (page == left_pg + (left_cnt << PAGE_WIDTH)) {1645 } else if (page == left_pg + P2SZ(left_cnt)) { 1646 1646 /* 1647 1647 * The interval can be added by simply growing the left … … 1650 1650 leaf->value[leaf->keys - 1] += count; 1651 1651 goto success; 1652 } else if (page + (count << PAGE_WIDTH) == right_pg) {1652 } else if (page + P2SZ(count) == right_pg) { 1653 1653 /* 1654 1654 * The interval can be addded by simply moving base of … … 1677 1677 */ 1678 1678 1679 if (overlaps(page, count << PAGE_WIDTH, left_pg, 1680 left_cnt << PAGE_WIDTH)) { 1679 if (overlaps(page, P2SZ(count), left_pg, P2SZ(left_cnt))) { 1681 1680 /* The interval intersects with the left interval. */ 1682 1681 return false; 1683 } else if (left_pg + (left_cnt << PAGE_WIDTH) == page) {1682 } else if (left_pg + P2SZ(left_cnt) == page) { 1684 1683 /* 1685 1684 * The interval can be added by growing the left … … 1716 1715 */ 1717 1716 1718 if (overlaps(page, count << PAGE_WIDTH, left_pg,1719 left_cnt << PAGE_WIDTH)) {1717 if (overlaps(page, P2SZ(count), left_pg, 1718 P2SZ(left_cnt))) { 1720 1719 /* 1721 1720 * The interval intersects with the left … … 1723 1722 */ 1724 1723 return false; 1725 } else if (overlaps(page, count << PAGE_WIDTH, right_pg,1726 right_cnt << PAGE_WIDTH)) {1724 } else if (overlaps(page, P2SZ(count), right_pg, 1725 P2SZ(right_cnt))) { 1727 1726 /* 1728 1727 * The interval intersects with the right … … 1730 1729 */ 1731 1730 return false; 1732 } else if ((page == left_pg + (left_cnt << PAGE_WIDTH)) &&1733 (page + (count << PAGE_WIDTH) == right_pg)) {1731 } else if ((page == left_pg + P2SZ(left_cnt)) && 1732 (page + P2SZ(count) == right_pg)) { 1734 1733 /* 1735 1734 * The interval can be added by merging the two … … 1739 1738 btree_remove(&area->used_space, right_pg, leaf); 1740 1739 goto success; 1741 } else if (page == left_pg + (left_cnt << PAGE_WIDTH)) {1740 } else if (page == left_pg + P2SZ(left_cnt)) { 1742 1741 /* 1743 1742 * The interval can be added by simply growing … … 1746 1745 leaf->value[i - 1] += count; 1747 1746 goto success; 1748 } else if (page + (count << PAGE_WIDTH) == right_pg) {1747 } else if (page + P2SZ(count) == right_pg) { 1749 1748 /* 1750 1749 * The interval can be addded by simply moving … … 1812 1811 for (i = 0; i < leaf->keys; i++) { 1813 1812 if (leaf->key[i] == page) { 1814 leaf->key[i] += count << PAGE_WIDTH;1813 leaf->key[i] += P2SZ(count); 1815 1814 leaf->value[i] -= count; 1816 1815 goto success; … … 1822 1821 } 1823 1822 1824 btree_node_t *node = btree_leaf_node_left_neighbour(&area->used_space, leaf); 1823 btree_node_t *node = btree_leaf_node_left_neighbour(&area->used_space, 1824 leaf); 1825 1825 if ((node) && (page < leaf->key[0])) { 1826 1826 uintptr_t left_pg = node->key[node->keys - 1]; 1827 1827 size_t left_cnt = (size_t) node->value[node->keys - 1]; 1828 1828 1829 if (overlaps(left_pg, left_cnt << PAGE_WIDTH, page, 1830 count << PAGE_WIDTH)) { 1831 if (page + (count << PAGE_WIDTH) == 1832 left_pg + (left_cnt << PAGE_WIDTH)) { 1829 if (overlaps(left_pg, P2SZ(left_cnt), page, P2SZ(count))) { 1830 if (page + P2SZ(count) == left_pg + P2SZ(left_cnt)) { 1833 1831 /* 1834 1832 * The interval is contained in the rightmost … … 1839 1837 node->value[node->keys - 1] -= count; 1840 1838 goto success; 1841 } else if (page + (count << PAGE_WIDTH) < 1842 left_pg + (left_cnt << PAGE_WIDTH)) { 1839 } else if (page + P2SZ(count) < 1840 left_pg + P2SZ(left_cnt)) { 1841 size_t new_cnt; 1842 1843 1843 /* 1844 1844 * The interval is contained in the rightmost … … 1848 1848 * new interval. 1849 1849 */ 1850 size_t new_cnt = ((left_pg + (left_cnt << PAGE_WIDTH)) -1851 (page + (count << PAGE_WIDTH))) >> PAGE_WIDTH;1850 new_cnt = ((left_pg + P2SZ(left_cnt)) - 1851 (page + P2SZ(count))) >> PAGE_WIDTH; 1852 1852 node->value[node->keys - 1] -= count + new_cnt; 1853 1853 btree_insert(&area->used_space, page + 1854 (count << PAGE_WIDTH), (void *) new_cnt, leaf);1854 P2SZ(count), (void *) new_cnt, leaf); 1855 1855 goto success; 1856 1856 } … … 1865 1865 size_t left_cnt = (size_t) leaf->value[leaf->keys - 1]; 1866 1866 1867 if (overlaps(left_pg, left_cnt << PAGE_WIDTH, page, 1868 count << PAGE_WIDTH)) { 1869 if (page + (count << PAGE_WIDTH) == 1870 left_pg + (left_cnt << PAGE_WIDTH)) { 1867 if (overlaps(left_pg, P2SZ(left_cnt), page, P2SZ(count))) { 1868 if (page + P2SZ(count) == left_pg + P2SZ(left_cnt)) { 1871 1869 /* 1872 1870 * The interval is contained in the rightmost … … 1876 1874 leaf->value[leaf->keys - 1] -= count; 1877 1875 goto success; 1878 } else if (page + (count << PAGE_WIDTH) < left_pg + 1879 (left_cnt << PAGE_WIDTH)) { 1876 } else if (page + P2SZ(count) < left_pg + 1877 P2SZ(left_cnt)) { 1878 size_t new_cnt; 1879 1880 1880 /* 1881 1881 * The interval is contained in the rightmost … … 1885 1885 * interval. 1886 1886 */ 1887 size_t new_cnt = ((left_pg + (left_cnt << PAGE_WIDTH)) -1888 (page + (count << PAGE_WIDTH))) >> PAGE_WIDTH;1887 new_cnt = ((left_pg + P2SZ(left_cnt)) - 1888 (page + P2SZ(count))) >> PAGE_WIDTH; 1889 1889 leaf->value[leaf->keys - 1] -= count + new_cnt; 1890 1890 btree_insert(&area->used_space, page + 1891 (count << PAGE_WIDTH), (void *) new_cnt, leaf);1891 P2SZ(count), (void *) new_cnt, leaf); 1892 1892 goto success; 1893 1893 } … … 1911 1911 * to (i - 1) and i. 1912 1912 */ 1913 if (overlaps(left_pg, left_cnt << PAGE_WIDTH, page,1914 count << PAGE_WIDTH)) {1915 if (page + (count << PAGE_WIDTH) ==1916 left_pg + (left_cnt << PAGE_WIDTH)) {1913 if (overlaps(left_pg, P2SZ(left_cnt), page, 1914 P2SZ(count))) { 1915 if (page + P2SZ(count) == 1916 left_pg + P2SZ(left_cnt)) { 1917 1917 /* 1918 1918 * The interval is contained in the … … 1923 1923 leaf->value[i - 1] -= count; 1924 1924 goto success; 1925 } else if (page + (count << PAGE_WIDTH) < 1926 left_pg + (left_cnt << PAGE_WIDTH)) { 1925 } else if (page + P2SZ(count) < 1926 left_pg + P2SZ(left_cnt)) { 1927 size_t new_cnt; 1928 1927 1929 /* 1928 1930 * The interval is contained in the … … 1932 1934 * also inserting a new interval. 1933 1935 */ 1934 size_t new_cnt = ((left_pg + 1935 (left_cnt << PAGE_WIDTH)) - 1936 (page + (count << PAGE_WIDTH))) >> 1936 new_cnt = ((left_pg + P2SZ(left_cnt)) - 1937 (page + P2SZ(count))) >> 1937 1938 PAGE_WIDTH; 1938 1939 leaf->value[i - 1] -= count + new_cnt; 1939 1940 btree_insert(&area->used_space, page + 1940 (count << PAGE_WIDTH), (void *) new_cnt,1941 P2SZ(count), (void *) new_cnt, 1941 1942 leaf); 1942 1943 goto success; … … 2034 2035 btree_key_t i; 2035 2036 for (i = 0; (ret == 0) && (i < node->keys); i++) { 2037 uintptr_t addr; 2038 2036 2039 as_area_t *area = (as_area_t *) node->value[i]; 2037 2040 2038 2041 mutex_lock(&area->lock); 2039 2042 2040 uintptr_t addr = 2041 ALIGN_UP(area->base + (area->pages << PAGE_WIDTH), 2043 addr = ALIGN_UP(area->base + P2SZ(area->pages), 2042 2044 PAGE_SIZE); 2043 2045 … … 2098 2100 2099 2101 info[area_idx].start_addr = area->base; 2100 info[area_idx].size = FRAMES2SIZE(area->pages);2102 info[area_idx].size = P2SZ(area->pages); 2101 2103 info[area_idx].flags = area->flags; 2102 2104 ++area_idx; … … 2136 2138 " (%p - %p)\n", area, (void *) area->base, 2137 2139 area->pages, (void *) area->base, 2138 (void *) (area->base + FRAMES2SIZE(area->pages)));2140 (void *) (area->base + P2SZ(area->pages))); 2139 2141 mutex_unlock(&area->lock); 2140 2142 } -
kernel/generic/src/mm/backend_anon.c
r8d308b9 r9d47440 50 50 #include <typedefs.h> 51 51 #include <align.h> 52 #include <memstr.h> 52 53 #include <arch.h> 53 54 -
kernel/generic/src/printf/vprintf.c
r8d308b9 r9d47440 41 41 #include <typedefs.h> 42 42 #include <str.h> 43 44 IRQ_SPINLOCK_STATIC_INITIALIZE_NAME(printf_lock, "*printf_lock");45 43 46 44 static int vprintf_str_write(const char *str, size_t size, void *data) … … 93 91 }; 94 92 95 irq_spinlock_lock(&printf_lock, true); 96 int ret = printf_core(fmt, &ps, ap); 97 irq_spinlock_unlock(&printf_lock, true); 98 99 return ret; 93 return printf_core(fmt, &ps, ap); 100 94 } 101 95 -
kernel/generic/src/proc/program.c
r8d308b9 r9d47440 54 54 #include <proc/program.h> 55 55 56 #ifndef LOADED_PROG_STACK_PAGES_NO57 #define LOADED_PROG_STACK_PAGES_NO 158 #endif59 60 56 /** 61 57 * Points to the binary image used as the program loader. All non-initial … … 90 86 91 87 /* 92 * Create the dataaddress space area.88 * Create the stack address space area. 93 89 */ 94 90 as_area_t *area = as_area_create(as, 95 91 AS_AREA_READ | AS_AREA_WRITE | AS_AREA_CACHEABLE, 96 LOADED_PROG_STACK_PAGES_NO * PAGE_SIZE, USTACK_ADDRESS,97 AS_AREA_ATTR_NONE,&anon_backend, NULL);92 STACK_SIZE, USTACK_ADDRESS, AS_AREA_ATTR_NONE, 93 &anon_backend, NULL); 98 94 if (!area) 99 95 return ENOMEM; -
kernel/generic/src/proc/scheduler.c
r8d308b9 r9d47440 376 376 context_save(&CPU->saved_context); 377 377 context_set(&CPU->saved_context, FADDR(scheduler_separated_stack), 378 (uintptr_t) CPU->stack, CPU_STACK_SIZE);378 (uintptr_t) CPU->stack, STACK_SIZE); 379 379 context_restore(&CPU->saved_context); 380 380 -
kernel/generic/src/proc/task.c
r8d308b9 r9d47440 190 190 str_cpy(task->name, TASK_NAME_BUFLEN, name); 191 191 192 task->cont ext = CONTEXT;192 task->container = CONTAINER; 193 193 task->capabilities = 0; 194 194 task->ucycles = 0; … … 211 211 212 212 if ((ipc_phone_0) && 213 (cont ext_check(ipc_phone_0->task->context, task->context)))213 (container_check(ipc_phone_0->task->container, task->container))) 214 214 ipc_phone_connect(&task->phones[0], ipc_phone_0); 215 215 … … 534 534 */ 535 535 if (notify) { 536 if (event_is_subscribed(EVENT_FAULT)) { 537 /* Notify the subscriber that a fault occurred. */ 538 event_notify_3(EVENT_FAULT, LOWER32(TASK->taskid), 539 UPPER32(TASK->taskid), (sysarg_t) THREAD); 540 536 /* Notify the subscriber that a fault occurred. */ 537 if (event_notify_3(EVENT_FAULT, false, LOWER32(TASK->taskid), 538 UPPER32(TASK->taskid), (sysarg_t) THREAD) == EOK) { 541 539 #ifdef CONFIG_UDEBUG 542 540 /* Wait for a debugging session. */ … … 586 584 printf("%-8" PRIu64 " %-14s %-5" PRIu32 " %10p %10p" 587 585 " %9" PRIu64 "%c %9" PRIu64 "%c\n", task->taskid, 588 task->name, task->cont ext, task, task->as,586 task->name, task->container, task, task->as, 589 587 ucycles, usuffix, kcycles, ksuffix); 590 588 #endif … … 597 595 else 598 596 printf("%-8" PRIu64 " %-14s %-5" PRIu32 " %18p %18p\n", 599 task->taskid, task->name, task->cont ext, task, task->as);597 task->taskid, task->name, task->container, task, task->as); 600 598 #endif 601 599 … … 627 625 printf("[id ] [threads] [calls] [callee\n"); 628 626 else 629 printf("[id ] [name ] [ct x] [address ] [as ]"627 printf("[id ] [name ] [ctn] [address ] [as ]" 630 628 " [ucycles ] [kcycles ]\n"); 631 629 #endif … … 636 634 " [callee\n"); 637 635 else 638 printf("[id ] [name ] [ct x] [address ]"636 printf("[id ] [name ] [ctn] [address ]" 639 637 " [as ]\n"); 640 638 #endif -
kernel/generic/src/proc/the.c
r8d308b9 r9d47440 58 58 the->task = NULL; 59 59 the->as = NULL; 60 the->magic = MAGIC; 60 61 } 61 62 … … 70 71 NO_TRACE void the_copy(the_t *src, the_t *dst) 71 72 { 73 ASSERT(src->magic == MAGIC); 72 74 *dst = *src; 73 75 } -
kernel/generic/src/proc/thread.c
r8d308b9 r9d47440 68 68 #include <errno.h> 69 69 70 71 #ifndef LOADED_PROG_STACK_PAGES_NO72 #define LOADED_PROG_STACK_PAGES_NO 173 #endif74 75 76 70 /** Thread states */ 77 71 const char *thread_states[] = { … … 300 294 301 295 /* Not needed, but good for debugging */ 302 memsetb(thread->kstack, THREAD_STACK_SIZE * 1 << STACK_FRAMES, 0);296 memsetb(thread->kstack, STACK_SIZE, 0); 303 297 304 298 irq_spinlock_lock(&tidlock, true); … … 308 302 context_save(&thread->saved_context); 309 303 context_set(&thread->saved_context, FADDR(cushion), 310 (uintptr_t) thread->kstack, THREAD_STACK_SIZE);304 (uintptr_t) thread->kstack, STACK_SIZE); 311 305 312 306 the_initialize((the_t *) thread->kstack); … … 605 599 printf("%-8" PRIu64 " %-14s %10p %-8s %10p %-5" PRIu32 "\n", 606 600 thread->tid, name, thread, thread_states[thread->state], 607 thread->task, thread->task->cont ext);601 thread->task, thread->task->container); 608 602 #endif 609 603 … … 617 611 printf("%-8" PRIu64 " %-14s %18p %-8s %18p %-5" PRIu32 "\n", 618 612 thread->tid, name, thread, thread_states[thread->state], 619 thread->task, thread->task->cont ext);613 thread->task, thread->task->container); 620 614 #endif 621 615 … … 658 652 else 659 653 printf("[id ] [name ] [address ] [state ] [task ]" 660 " [ct x]\n");654 " [ctn]\n"); 661 655 #endif 662 656 … … 667 661 } else 668 662 printf("[id ] [name ] [address ] [state ]" 669 " [task ] [ct x]\n");663 " [task ] [ctn]\n"); 670 664 #endif 671 665 -
kernel/generic/src/security/cap.c
r8d308b9 r9d47440 92 92 task_t *task = task_find_by_id(taskid); 93 93 94 if ((!task) || (!cont ext_check(CONTEXT, task->context))) {94 if ((!task) || (!container_check(CONTAINER, task->container))) { 95 95 irq_spinlock_unlock(&tasks_lock, true); 96 96 return (sysarg_t) ENOENT; … … 121 121 122 122 task_t *task = task_find_by_id(taskid); 123 if ((!task) || (!cont ext_check(CONTEXT, task->context))) {123 if ((!task) || (!container_check(CONTAINER, task->container))) { 124 124 irq_spinlock_unlock(&tasks_lock, true); 125 125 return (sysarg_t) ENOENT; -
kernel/generic/src/synch/spinlock.c
r8d308b9 r9d47440 96 96 * run in a simulator) that caused problems with both 97 97 * printf_lock and the framebuffer lock. 98 *99 98 */ 100 99 if (lock->name[0] == '*') -
kernel/generic/src/syscall/syscall.c
r8d308b9 r9d47440 161 161 /* Event notification syscalls. */ 162 162 (syshandler_t) sys_event_subscribe, 163 (syshandler_t) sys_event_unmask, 163 164 164 165 /* Capabilities related syscalls. */
Note:
See TracChangeset
for help on using the changeset viewer.
