Changes in uspace/drv/char/ski-con/ski-con.c [09ab0a9a:cf3a905c] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/drv/char/ski-con/ski-con.c
r09ab0a9a rcf3a905c 1 1 /* 2 2 * Copyright (c) 2005 Jakub Jermar 3 * Copyright (c) 201 7Jiri Svoboda3 * Copyright (c) 2018 Jiri Svoboda 4 4 * All rights reserved. 5 5 * … … 31 31 */ 32 32 33 #include <as.h> 33 34 #include <async.h> 34 35 #include <ddf/driver.h> 35 36 #include <ddf/log.h> 37 #include <ddi.h> 36 38 #include <errno.h> 37 39 #include <fibril.h> … … 40 42 #include <stdlib.h> 41 43 #include <stdbool.h> 44 #include <sysinfo.h> 42 45 43 46 #include "ski-con.h" … … 68 71 ddf_fun_t *fun = NULL; 69 72 bool bound = false; 73 uintptr_t faddr; 74 void *addr = AS_AREA_ANY; 70 75 errno_t rc; 71 76 … … 87 92 con->cds.sarg = con; 88 93 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 89 108 rc = ddf_fun_bind(fun); 90 109 if (rc != EOK) { … … 107 126 return EOK; 108 127 error: 128 if (addr != AS_AREA_ANY) 129 as_area_destroy(addr); 109 130 if (bound) 110 131 ddf_fun_unbind(fun); … … 127 148 } 128 149 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 */ 157 static 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 129 172 /** Poll Ski for keypresses. */ 130 173 static errno_t ski_con_fibril(void *arg) … … 135 178 136 179 while (true) { 137 while ( true) {180 while (!ski_con_disabled()) { 138 181 c = ski_con_getchar(); 139 182 if (c == 0) … … 246 289 uint8_t *dp = (uint8_t *) data; 247 290 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 } 250 296 251 297 *nwr = size;
Note:
See TracChangeset
for help on using the changeset viewer.