Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/drv/char/ski-con/ski-con.c

    r09ab0a9a rcf3a905c  
    11/*
    22 * Copyright (c) 2005 Jakub Jermar
    3  * Copyright (c) 2017 Jiri Svoboda
     3 * Copyright (c) 2018 Jiri Svoboda
    44 * All rights reserved.
    55 *
     
    3131 */
    3232
     33#include <as.h>
    3334#include <async.h>
    3435#include <ddf/driver.h>
    3536#include <ddf/log.h>
     37#include <ddi.h>
    3638#include <errno.h>
    3739#include <fibril.h>
     
    4042#include <stdlib.h>
    4143#include <stdbool.h>
     44#include <sysinfo.h>
    4245
    4346#include "ski-con.h"
     
    6871        ddf_fun_t *fun = NULL;
    6972        bool bound = false;
     73        uintptr_t faddr;
     74        void *addr = AS_AREA_ANY;
    7075        errno_t rc;
    7176
     
    8792        con->cds.sarg = con;
    8893
     94        rc = sysinfo_get_value("ski.paddr", &faddr);
     95        if (rc != EOK)
     96                faddr = 0; /* No kernel driver to arbitrate with */
     97
     98        if (faddr != 0) {
     99                addr = AS_AREA_ANY;
     100                rc = physmem_map(faddr, 1, AS_AREA_READ | AS_AREA_CACHEABLE,
     101                    &addr);
     102                if (rc != EOK) {
     103                        ddf_msg(LVL_ERROR, "Cannot map kernel driver arbitration area.");
     104                        goto error;
     105                }
     106        }
     107
    89108        rc = ddf_fun_bind(fun);
    90109        if (rc != EOK) {
     
    107126        return EOK;
    108127error:
     128        if (addr != AS_AREA_ANY)
     129                as_area_destroy(addr);
    109130        if (bound)
    110131                ddf_fun_unbind(fun);
     
    127148}
    128149
     150/** Detect if SKI console is in use by the kernel.
     151 *
     152 * This is needed since the kernel has no way of fencing off the user-space
     153 * driver.
     154 *
     155 * @return @c true if in use by the kernel.
     156 */
     157static bool ski_con_disabled(void)
     158{
     159        sysarg_t kconsole;
     160
     161        /*
     162         * XXX Ideally we should get information from our kernel counterpart
     163         * driver. But there needs to be a mechanism for the kernel console
     164         * to inform the kernel driver.
     165         */
     166        if (sysinfo_get_value("kconsole", &kconsole) != EOK)
     167                return false;
     168
     169        return kconsole != false;
     170}
     171
    129172/** Poll Ski for keypresses. */
    130173static errno_t ski_con_fibril(void *arg)
     
    135178
    136179        while (true) {
    137                 while (true) {
     180                while (!ski_con_disabled()) {
    138181                        c = ski_con_getchar();
    139182                        if (c == 0)
     
    246289        uint8_t *dp = (uint8_t *) data;
    247290
    248         for (i = 0; i < size; i++)
    249                 ski_con_putchar(con, dp[i]);
     291        if (!ski_con_disabled()) {
     292                for (i = 0; i < size; i++) {
     293                        ski_con_putchar(con, dp[i]);
     294                }
     295        }
    250296
    251297        *nwr = size;
Note: See TracChangeset for help on using the changeset viewer.