Changeset 04803bf in mainline for uspace/app/klog/klog.c
- Timestamp:
- 2011-03-21T22:00:17Z (14 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 143932e
- Parents:
- b50b5af2 (diff), 7308e84 (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
-
uspace/app/klog/klog.c
rb50b5af2 r04803bf 36 36 37 37 #include <stdio.h> 38 #include <ipc/ipc.h>39 38 #include <async.h> 40 #include <ipc/services.h>41 39 #include <as.h> 42 #include < sysinfo.h>40 #include <ddi.h> 43 41 #include <event.h> 44 42 #include <errno.h> 43 #include <str_error.h> 45 44 #include <io/klog.h> 45 #include <sysinfo.h> 46 46 47 #define NAME "klog" 47 #define NAME "klog" 48 #define LOG_FNAME "/log/klog" 48 49 49 50 /* Pointer to klog area */ 50 51 static wchar_t *klog; 51 52 static size_t klog_length; 53 54 static FILE *log; 52 55 53 56 static void interrupt_received(ipc_callid_t callid, ipc_call_t *call) … … 58 61 size_t i; 59 62 60 for (i = klog_len - klog_stored; i < klog_len; i++) 61 putchar(klog[(klog_start + i) % klog_length]); 63 for (i = klog_len - klog_stored; i < klog_len; i++) { 64 wchar_t ch = klog[(klog_start + i) % klog_length]; 65 66 putchar(ch); 67 68 if (log != NULL) 69 fputc(ch, log); 70 } 71 72 if (log != NULL) { 73 fflush(log); 74 fsync(fileno(log)); 75 } 62 76 } 63 77 64 78 int main(int argc, char *argv[]) 65 79 { 66 size_t klog_pages = sysinfo_value("klog.pages"); 67 size_t klog_size = klog_pages * PAGE_SIZE; 68 klog_length = klog_size / sizeof(wchar_t); 69 70 klog = (wchar_t *) as_get_mappable_page(klog_size); 71 if (klog == NULL) { 72 printf(NAME ": Error allocating memory area\n"); 73 return -1; 74 } 75 76 printf("got area at 0x%08lx, length %lx byes\n", klog, klog_size); 77 78 int res = ipc_share_in_start_1_0(PHONE_NS, (void *) klog, 79 klog_size, SERVICE_MEM_KLOG); 80 if (res != EOK) { 81 printf(NAME ": Error initializing memory area\n"); 82 return -1; 80 size_t pages; 81 int rc = sysinfo_get_value("klog.pages", &pages); 82 if (rc != EOK) { 83 fprintf(stderr, "%s: Unable to get number of klog pages\n", 84 NAME); 85 return rc; 83 86 } 84 87 85 if (event_subscribe(EVENT_KLOG, 0) != EOK) { 86 printf(NAME ": Error registering klog notifications\n"); 87 return -1; 88 uintptr_t faddr; 89 rc = sysinfo_get_value("klog.faddr", &faddr); 90 if (rc != EOK) { 91 fprintf(stderr, "%s: Unable to get klog physical address\n", 92 NAME); 93 return rc; 88 94 } 95 96 size_t size = pages * PAGE_SIZE; 97 klog_length = size / sizeof(wchar_t); 98 99 klog = (wchar_t *) as_get_mappable_page(size); 100 if (klog == NULL) { 101 fprintf(stderr, "%s: Unable to allocate virtual memory area\n", 102 NAME); 103 return ENOMEM; 104 } 105 106 rc = physmem_map((void *) faddr, (void *) klog, pages, 107 AS_AREA_READ | AS_AREA_CACHEABLE); 108 if (rc != EOK) { 109 fprintf(stderr, "%s: Unable to map klog\n", NAME); 110 return rc; 111 } 112 113 rc = event_subscribe(EVENT_KLOG, 0); 114 if (rc != EOK) { 115 fprintf(stderr, "%s: Unable to register klog notifications\n", 116 NAME); 117 return rc; 118 } 119 120 /* 121 * Mode "a" would be definitively much better here, but it is 122 * not well supported by the FAT driver. 123 */ 124 log = fopen(LOG_FNAME, "w"); 125 if (log == NULL) 126 printf("%s: Unable to create log file %s (%s)\n", NAME, LOG_FNAME, 127 str_error(errno)); 89 128 90 129 async_set_interrupt_received(interrupt_received);
Note:
See TracChangeset
for help on using the changeset viewer.