Changes in kernel/generic/src/console/console.c [11527051:7ddc2c7] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/generic/src/console/console.c
r11527051 r7ddc2c7 52 52 #include <errno.h> 53 53 #include <str.h> 54 #include <abi/k log.h>55 56 #define K LOG_PAGES 857 #define K LOG_LENGTH (KLOG_PAGES * PAGE_SIZE / sizeof(wchar_t))54 #include <abi/kio.h> 55 56 #define KIO_PAGES 8 57 #define KIO_LENGTH (KIO_PAGES * PAGE_SIZE / sizeof(wchar_t)) 58 58 59 59 /** Kernel log cyclic buffer */ 60 wchar_t k log[KLOG_LENGTH] __attribute__((aligned(PAGE_SIZE)));60 wchar_t kio[KIO_LENGTH] __attribute__((aligned(PAGE_SIZE))); 61 61 62 62 /** Kernel log initialized */ 63 static atomic_t k log_inited = {false};63 static atomic_t kio_inited = {false}; 64 64 65 65 /** First kernel log characters */ 66 static size_t k log_start = 0;66 static size_t kio_start = 0; 67 67 68 68 /** Number of valid kernel log characters */ 69 static size_t k log_len = 0;69 static size_t kio_len = 0; 70 70 71 71 /** Number of stored (not printed) kernel log characters */ 72 static size_t k log_stored = 0;72 static size_t kio_stored = 0; 73 73 74 74 /** Number of stored kernel log characters for uspace */ 75 static size_t k log_uspace = 0;75 static size_t kio_uspace = 0; 76 76 77 77 /** Kernel log spinlock */ 78 SPINLOCK_ STATIC_INITIALIZE_NAME(klog_lock, "klog_lock");79 80 /** Physical memory area used for k logbuffer */81 static parea_t k log_parea;78 SPINLOCK_INITIALIZE_NAME(kio_lock, "kio_lock"); 79 80 /** Physical memory area used for kio buffer */ 81 static parea_t kio_parea; 82 82 83 83 static indev_t stdin_sink; 84 84 static outdev_t stdout_source; 85 85 86 static void stdin_signal(indev_t *, indev_signal_t); 87 86 88 static indev_operations_t stdin_ops = { 87 .poll = NULL 89 .poll = NULL, 90 .signal = stdin_signal 88 91 }; 89 92 90 93 static void stdout_write(outdev_t *, wchar_t); 91 94 static void stdout_redraw(outdev_t *); 95 static void stdout_scroll_up(outdev_t *); 96 static void stdout_scroll_down(outdev_t *); 92 97 93 98 static outdev_operations_t stdout_ops = { 94 99 .write = stdout_write, 95 .redraw = stdout_redraw 100 .redraw = stdout_redraw, 101 .scroll_up = stdout_scroll_up, 102 .scroll_down = stdout_scroll_down 96 103 }; 97 104 … … 113 120 } 114 121 122 static void stdin_signal(indev_t *indev, indev_signal_t signal) 123 { 124 switch (signal) { 125 case INDEV_SIGNAL_SCROLL_UP: 126 if (stdout != NULL) 127 stdout_scroll_up(stdout); 128 break; 129 case INDEV_SIGNAL_SCROLL_DOWN: 130 if (stdout != NULL) 131 stdout_scroll_down(stdout); 132 break; 133 } 134 } 135 115 136 void stdout_wire(outdev_t *outdev) 116 137 { … … 125 146 static void stdout_write(outdev_t *dev, wchar_t ch) 126 147 { 127 list_foreach(dev->list, cur) { 128 outdev_t *sink = list_get_instance(cur, outdev_t, link); 148 list_foreach(dev->list, link, outdev_t, sink) { 129 149 if ((sink) && (sink->op->write)) 130 150 sink->op->write(sink, ch); … … 134 154 static void stdout_redraw(outdev_t *dev) 135 155 { 136 list_foreach(dev->list, cur) { 137 outdev_t *sink = list_get_instance(cur, outdev_t, link); 156 list_foreach(dev->list, link, outdev_t, sink) { 138 157 if ((sink) && (sink->op->redraw)) 139 158 sink->op->redraw(sink); 159 } 160 } 161 162 static void stdout_scroll_up(outdev_t *dev) 163 { 164 list_foreach(dev->list, link, outdev_t, sink) { 165 if ((sink) && (sink->op->scroll_up)) 166 sink->op->scroll_up(sink); 167 } 168 } 169 170 static void stdout_scroll_down(outdev_t *dev) 171 { 172 list_foreach(dev->list, link, outdev_t, sink) { 173 if ((sink) && (sink->op->scroll_down)) 174 sink->op->scroll_down(sink); 140 175 } 141 176 } … … 148 183 * 149 184 */ 150 void k log_init(void)151 { 152 void *faddr = (void *) KA2PA(k log);185 void kio_init(void) 186 { 187 void *faddr = (void *) KA2PA(kio); 153 188 154 189 ASSERT((uintptr_t) faddr % FRAME_SIZE == 0); 155 190 156 k log_parea.pbase = (uintptr_t) faddr;157 k log_parea.frames = SIZE2FRAMES(sizeof(klog));158 k log_parea.unpriv = false;159 k log_parea.mapped = false;160 ddi_parea_register(&k log_parea);161 162 sysinfo_set_item_val("k log.faddr", NULL, (sysarg_t) faddr);163 sysinfo_set_item_val("k log.pages", NULL, KLOG_PAGES);164 165 event_set_unmask_callback(EVENT_K LOG, klog_update);166 atomic_set(&k log_inited, true);191 kio_parea.pbase = (uintptr_t) faddr; 192 kio_parea.frames = SIZE2FRAMES(sizeof(kio)); 193 kio_parea.unpriv = false; 194 kio_parea.mapped = false; 195 ddi_parea_register(&kio_parea); 196 197 sysinfo_set_item_val("kio.faddr", NULL, (sysarg_t) faddr); 198 sysinfo_set_item_val("kio.pages", NULL, KIO_PAGES); 199 200 event_set_unmask_callback(EVENT_KIO, kio_update); 201 atomic_set(&kio_inited, true); 167 202 } 168 203 … … 231 266 } 232 267 } 268 233 269 if (chr_encode(ch, buf, &offset, buflen - 1) == EOK) { 234 270 putchar(ch); … … 249 285 } 250 286 251 void k log_update(void *event)252 { 253 if (!atomic_get(&k log_inited))287 void kio_update(void *event) 288 { 289 if (!atomic_get(&kio_inited)) 254 290 return; 255 291 256 spinlock_lock(&klog_lock); 257 258 if (klog_uspace > 0) { 259 if (event_notify_3(EVENT_KLOG, true, klog_start, klog_len, 260 klog_uspace) == EOK) 261 klog_uspace = 0; 262 } 263 264 spinlock_unlock(&klog_lock); 292 spinlock_lock(&kio_lock); 293 294 if (kio_uspace > 0) { 295 if (event_notify_3(EVENT_KIO, true, kio_start, kio_len, 296 kio_uspace) == EOK) 297 kio_uspace = 0; 298 } 299 300 spinlock_unlock(&kio_lock); 301 } 302 303 /** Flush characters that are stored in the output buffer 304 * 305 */ 306 void kio_flush(void) 307 { 308 bool ordy = ((stdout) && (stdout->op->write)); 309 310 if (!ordy) 311 return; 312 313 spinlock_lock(&kio_lock); 314 315 /* Print characters that weren't printed earlier */ 316 while (kio_stored > 0) { 317 wchar_t tmp = kio[(kio_start + kio_len - kio_stored) % KIO_LENGTH]; 318 kio_stored--; 319 320 /* 321 * We need to give up the spinlock for 322 * the physical operation of writing out 323 * the character. 324 */ 325 spinlock_unlock(&kio_lock); 326 stdout->op->write(stdout, tmp); 327 spinlock_lock(&kio_lock); 328 } 329 330 spinlock_unlock(&kio_lock); 331 } 332 333 /** Put a character into the output buffer. 334 * 335 * The caller is required to hold kio_lock 336 */ 337 void kio_push_char(const wchar_t ch) 338 { 339 kio[(kio_start + kio_len) % KIO_LENGTH] = ch; 340 if (kio_len < KIO_LENGTH) 341 kio_len++; 342 else 343 kio_start = (kio_start + 1) % KIO_LENGTH; 344 345 if (kio_stored < kio_len) 346 kio_stored++; 347 348 /* The character is stored for uspace */ 349 if (kio_uspace < kio_len) 350 kio_uspace++; 265 351 } 266 352 … … 269 355 bool ordy = ((stdout) && (stdout->op->write)); 270 356 271 spinlock_lock(&klog_lock); 272 273 /* Print charaters stored in kernel log */ 274 if (ordy) { 275 while (klog_stored > 0) { 276 wchar_t tmp = klog[(klog_start + klog_len - klog_stored) % KLOG_LENGTH]; 277 klog_stored--; 278 279 /* 280 * We need to give up the spinlock for 281 * the physical operation of writting out 282 * the character. 283 */ 284 spinlock_unlock(&klog_lock); 285 stdout->op->write(stdout, tmp); 286 spinlock_lock(&klog_lock); 287 } 288 } 289 290 /* Store character in the cyclic kernel log */ 291 klog[(klog_start + klog_len) % KLOG_LENGTH] = ch; 292 if (klog_len < KLOG_LENGTH) 293 klog_len++; 294 else 295 klog_start = (klog_start + 1) % KLOG_LENGTH; 357 spinlock_lock(&kio_lock); 358 kio_push_char(ch); 359 spinlock_unlock(&kio_lock); 360 361 /* Output stored characters */ 362 kio_flush(); 296 363 297 364 if (!ordy) { 298 if (klog_stored < klog_len)299 klog_stored++;300 }301 302 /* The character is stored for uspace */303 if (klog_uspace < klog_len)304 klog_uspace++;305 306 spinlock_unlock(&klog_lock);307 308 if (ordy) {309 /*310 * Output the character. In this case311 * it should be no longer buffered.312 */313 stdout->op->write(stdout, ch);314 } else {315 365 /* 316 366 * No standard output routine defined yet. … … 328 378 /* Force notification on newline */ 329 379 if (ch == '\n') 330 k log_update(NULL);380 kio_update(NULL); 331 381 } 332 382 … … 336 386 * 337 387 */ 338 sysarg_t sys_k log(int cmd, const void *buf, size_t size)388 sysarg_t sys_kio(int cmd, const void *buf, size_t size) 339 389 { 340 390 char *data; … … 342 392 343 393 switch (cmd) { 344 case K LOG_UPDATE:345 k log_update(NULL);394 case KIO_UPDATE: 395 kio_update(NULL); 346 396 return EOK; 347 case K LOG_WRITE:348 case K LOG_COMMAND:397 case KIO_WRITE: 398 case KIO_COMMAND: 349 399 break; 350 400 default: … … 368 418 369 419 switch (cmd) { 370 case K LOG_WRITE:420 case KIO_WRITE: 371 421 printf("%s", data); 372 422 break; 373 case K LOG_COMMAND:423 case KIO_COMMAND: 374 424 if (!stdin) 375 425 break;
Note:
See TracChangeset
for help on using the changeset viewer.