Changeset 712c4ba in mainline
- Timestamp:
- 2011-05-20T16:09:24Z (13 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- b6f3e7e
- Parents:
- 326bf65
- Location:
- kernel
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/genarch/src/drivers/ega/ega.c
r326bf65 r712c4ba 40 40 #include <mm/as.h> 41 41 #include <mm/slab.h> 42 #include <synch/mutex.h> 42 43 #include <arch/mm/page.h> 43 #include <synch/spinlock.h>44 44 #include <typedefs.h> 45 45 #include <arch/asm.h> … … 63 63 64 64 typedef struct { 65 IRQ_SPINLOCK_DECLARE(lock);65 mutex_t mtx; 66 66 67 67 uint32_t cursor; … … 540 540 ega_instance_t *instance = (ega_instance_t *) dev->data; 541 541 542 irq_spinlock_lock(&instance->lock, true);542 mutex_lock(&instance->mtx); 543 543 544 544 switch (ch) { … … 563 563 ega_move_cursor(instance, silent); 564 564 565 irq_spinlock_unlock(&instance->lock, true);565 mutex_unlock(&instance->mtx); 566 566 } 567 567 … … 570 570 ega_instance_t *instance = (ega_instance_t *) dev->data; 571 571 572 irq_spinlock_lock(&instance->lock, true);572 mutex_lock(&instance->mtx); 573 573 574 574 memcpy(instance->addr, instance->backbuf, EGA_VRAM_SIZE); … … 576 576 ega_show_cursor(instance, silent); 577 577 578 irq_spinlock_unlock(&instance->lock, true);578 mutex_unlock(&instance->mtx); 579 579 } 580 580 … … 594 594 egadev->data = instance; 595 595 596 irq_spinlock_initialize(&instance->lock, "*ega.instance.lock");596 mutex_initialize(&instance->mtx, MUTEX_PASSIVE); 597 597 598 598 instance->base = base; -
kernel/genarch/src/fb/fb.c
r326bf65 r712c4ba 80 80 81 81 typedef struct { 82 SPINLOCK_DECLARE(lock);82 mutex_t mtx; 83 83 84 84 uint8_t *addr; … … 365 365 { 366 366 fb_instance_t *instance = (fb_instance_t *) dev->data; 367 spinlock_lock(&instance->lock);367 mutex_lock(&instance->mtx); 368 368 369 369 switch (ch) { … … 406 406 cursor_put(instance, silent); 407 407 408 spinlock_unlock(&instance->lock);408 mutex_unlock(&instance->mtx); 409 409 } 410 410 … … 473 473 fb_instance_t *instance = (fb_instance_t *) dev->data; 474 474 475 spinlock_lock(&instance->lock);475 mutex_lock(&instance->mtx); 476 476 fb_redraw_internal(instance); 477 spinlock_unlock(&instance->lock);477 mutex_unlock(&instance->mtx); 478 478 } 479 479 … … 554 554 fbdev->data = instance; 555 555 556 spinlock_initialize(&instance->lock, "*fb.instance.lock");556 mutex_initialize(&instance->mtx, MUTEX_PASSIVE); 557 557 instance->rgb_conv = rgb_conv; 558 558 instance->pixelbytes = pixelbytes; -
kernel/generic/src/console/console.c
r326bf65 r712c4ba 60 60 61 61 /** Kernel log initialized */ 62 static bool klog_inited = false;62 static atomic_t klog_inited = {false}; 63 63 64 64 /** First kernel log characters */ … … 75 75 76 76 /** Kernel log spinlock */ 77 SPINLOCK_STATIC_INITIALIZE_NAME(klog_lock, " *klog_lock");77 SPINLOCK_STATIC_INITIALIZE_NAME(klog_lock, "klog_lock"); 78 78 79 79 /** Physical memory area used for klog buffer */ … … 166 166 167 167 event_set_unmask_callback(EVENT_KLOG, klog_update); 168 169 spinlock_lock(&klog_lock); 170 klog_inited = true; 171 spinlock_unlock(&klog_lock); 168 atomic_set(&klog_inited, true); 172 169 } 173 170 … … 264 261 void klog_update(void) 265 262 { 263 if (!atomic_get(&klog_inited)) 264 return; 265 266 266 spinlock_lock(&klog_lock); 267 267 268 if ( (klog_inited) && (klog_uspace > 0)) {268 if (klog_uspace > 0) { 269 269 if (event_notify_3(EVENT_KLOG, true, klog_start, klog_len, 270 270 klog_uspace) == EOK) … … 277 277 void putchar(const wchar_t ch) 278 278 { 279 bool ordy = ((stdout) && (stdout->op->write)); 280 279 281 spinlock_lock(&klog_lock); 280 282 281 if ((klog_stored > 0) && (stdout) && (stdout->op->write)) { 282 /* Print charaters stored in kernel log */ 283 size_t i; 284 for (i = klog_len - klog_stored; i < klog_len; i++) 285 stdout->op->write(stdout, klog[(klog_start + i) % KLOG_LENGTH], silent); 286 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 } 287 298 } 288 299 … … 294 305 klog_start = (klog_start + 1) % KLOG_LENGTH; 295 306 296 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 */ 297 323 stdout->op->write(stdout, ch, silent); 298 else {324 } else { 299 325 /* 300 326 * No standard output routine defined yet. … … 306 332 * Note that the early_putc() function might be 307 333 * a no-op on certain hardware configurations. 308 *309 334 */ 310 335 early_putchar(ch); 311 312 if (klog_stored < klog_len) 313 klog_stored++; 314 } 315 316 /* The character is stored for uspace */ 317 if (klog_uspace < klog_len) 318 klog_uspace++; 319 320 spinlock_unlock(&klog_lock); 336 } 321 337 322 338 /* Force notification on newline */ -
kernel/generic/src/printf/vprintf.c
r326bf65 r712c4ba 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/synch/spinlock.c
r326bf65 r712c4ba 84 84 * This conserns especially printf_lock and the 85 85 * framebuffer lock. 86 *87 * Any lock whose name is prefixed by "*" will be88 * ignored by this deadlock detection routine89 * as this might cause an infinite recursion.90 * We trust our code that there is no possible deadlock91 * caused by these locks (except when an exception92 * is triggered for instance by printf()).93 *94 * We encountered false positives caused by very95 * slow framebuffer interaction (especially when96 * run in a simulator) that caused problems with both97 * printf_lock and the framebuffer lock.98 *99 86 */ 100 if (lock->name[0] == '*')101 continue;102 103 87 if (i++ > DEADLOCK_THRESHOLD) { 104 88 printf("cpu%u: looping on spinlock %p:%s, "
Note:
See TracChangeset
for help on using the changeset viewer.