Changes in uspace/srv/ns/ns.c [6119f24:d9fae235] in mainline


Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/srv/ns/ns.c

    r6119f24 rd9fae235  
    3737
    3838#include <ipc/ipc.h>
     39#include <ipc/services.h>
    3940#include <ipc/ns.h>
     41#include <unistd.h>
    4042#include <stdio.h>
    4143#include <errno.h>
     44#include <as.h>
     45#include <ddi.h>
     46#include <event.h>
    4247#include <macros.h>
     48#include <sysinfo.h>
    4349#include "ns.h"
    4450#include "service.h"
     
    4652#include "task.h"
    4753
     54static void *clockaddr = NULL;
     55static void *klogaddr = NULL;
     56
     57static void get_as_area(ipc_callid_t callid, ipc_call_t *call, void *faddr,
     58    size_t pages, void **addr)
     59{
     60        if ((faddr == NULL) || (pages == 0)) {
     61                ipc_answer_0(callid, ENOENT);
     62                return;
     63        }
     64       
     65        if (*addr == NULL) {
     66                *addr = as_get_mappable_page(pages * PAGE_SIZE);
     67               
     68                if (*addr == NULL) {
     69                        ipc_answer_0(callid, ENOENT);
     70                        return;
     71                }
     72               
     73                if (physmem_map(faddr, *addr, pages,
     74                    AS_AREA_READ | AS_AREA_CACHEABLE) != 0) {
     75                        ipc_answer_0(callid, ENOENT);
     76                        return;
     77                }
     78        }
     79       
     80        ipc_answer_2(callid, EOK, (ipcarg_t) *addr, AS_AREA_READ);
     81}
     82
     83static void setup_clock_area(ipc_callid_t callid, ipc_call_t *call, void **addr)
     84{
     85        uintptr_t faddr;
     86        int err = sysinfo_get_value("clock.faddr", &faddr);
     87       
     88        if (err != EOK)
     89                ipc_answer_0(callid, err);
     90       
     91        get_as_area(callid, call, (void *) faddr, 1, addr);
     92}
     93
     94static void setup_klog_area(ipc_callid_t callid, ipc_call_t *call, void **addr)
     95{
     96        uintptr_t faddr;
     97        int err = sysinfo_get_value("klog.faddr", &faddr);
     98       
     99        if (err != EOK)
     100                ipc_answer_0(callid, err);
     101       
     102        size_t pages;
     103        err = sysinfo_get_value("klog.pages", &pages);
     104       
     105        if (err != EOK)
     106                ipc_answer_0(callid, err);
     107       
     108        get_as_area(callid, call, (void *) faddr, pages, addr);
     109}
     110
    48111int main(int argc, char **argv)
    49112{
     
    72135               
    73136                task_id_t id;
    74                 sysarg_t retval;
    75                
    76                 switch (IPC_GET_IMETHOD(call)) {
     137                ipcarg_t retval;
     138               
     139                switch (IPC_GET_METHOD(call)) {
     140                case IPC_M_SHARE_IN:
     141                        switch (IPC_GET_ARG3(call)) {
     142                        case SERVICE_MEM_REALTIME:
     143                                setup_clock_area(callid, &call, &clockaddr);
     144                                break;
     145                        case SERVICE_MEM_KLOG:
     146                                setup_klog_area(callid, &call, &klogaddr);
     147                                break;
     148                        default:
     149                                ipc_answer_0(callid, ENOENT);
     150                        }
     151                        continue;
    77152                case IPC_M_PHONE_HUNGUP:
    78153                        retval = ns_task_disconnect(&call);
Note: See TracChangeset for help on using the changeset viewer.