Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/app/klog/klog.c

    rd9fae235 r6119f24  
    3636
    3737#include <stdio.h>
    38 #include <ipc/ipc.h>
    3938#include <async.h>
    40 #include <ipc/services.h>
    4139#include <as.h>
    42 #include <sysinfo.h>
     40#include <ddi.h>
    4341#include <event.h>
    4442#include <errno.h>
     43#include <str_error.h>
    4544#include <io/klog.h>
     45#include <sysinfo.h>
    4646
    47 #define NAME  "klog"
     47#define NAME       "klog"
     48#define LOG_FNAME  "/log/klog"
    4849
    4950/* Pointer to klog area */
    5051static wchar_t *klog;
    5152static size_t klog_length;
     53
     54static FILE *log;
    5255
    5356static void interrupt_received(ipc_callid_t callid, ipc_call_t *call)
     
    5861        size_t i;
    5962       
    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        }
    6276}
    6377
    6478int main(int argc, char *argv[])
    6579{
    66         size_t klog_pages;
    67         if (sysinfo_get_value("klog.pages", &klog_pages) != EOK) {
    68                 printf("%s: Error getting klog address\n", NAME);
    69                 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;
    7086        }
    7187       
    72         size_t klog_size = klog_pages * PAGE_SIZE;
    73         klog_length = klog_size / sizeof(wchar_t);
    74        
    75         klog = (wchar_t *) as_get_mappable_page(klog_size);
    76         if (klog == NULL) {
    77                 printf("%s: Error allocating memory area\n", NAME);
    78                 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;
    7994        }
    8095       
    81         int res = async_share_in_start_1_0(PHONE_NS, (void *) klog,
    82             klog_size, SERVICE_MEM_KLOG);
    83         if (res != EOK) {
    84                 printf("%s: Error initializing memory area\n", NAME);
    85                 return -1;
     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;
    86104        }
    87105       
    88         if (event_subscribe(EVENT_KLOG, 0) != EOK) {
    89                 printf("%s: Error registering klog notifications\n", NAME);
    90                 return -1;
     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;
    91111        }
     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));
    92128       
    93129        async_set_interrupt_received(interrupt_received);
Note: See TracChangeset for help on using the changeset viewer.