Changeset 68a552f in mainline for uspace/lib/c/generic/io/con_srv.c
- Timestamp:
- 2021-02-22T19:52:08Z (4 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 26853ebc
- Parents:
- 2ab8ab3
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/c/generic/io/con_srv.c
r2ab8ab3 r68a552f 1 1 /* 2 * Copyright (c) 20 12Jiri Svoboda2 * Copyright (c) 2021 Jiri Svoboda 3 3 * All rights reserved. 4 4 * … … 34 34 * @brief Console protocol server stub 35 35 */ 36 #include <as.h> 36 37 #include <errno.h> 37 38 #include <io/cons_event.h> … … 307 308 } 308 309 310 /** Create shared buffer for efficient rendering */ 311 static void con_map_srv(con_srv_t *srv, ipc_call_t *icall) 312 { 313 errno_t rc; 314 charfield_t *buf; 315 sysarg_t cols, rows; 316 ipc_call_t call; 317 size_t size; 318 319 if (srv->srvs->ops->map == NULL || srv->srvs->ops->unmap == NULL) { 320 async_answer_0(icall, ENOTSUP); 321 return; 322 } 323 324 cols = ipc_get_arg1(icall); 325 rows = ipc_get_arg2(icall); 326 327 if (!async_share_in_receive(&call, &size)) { 328 async_answer_0(icall, EINVAL); 329 return; 330 } 331 332 /* Check size */ 333 if (size != PAGES2SIZE(SIZE2PAGES(cols * rows * sizeof(charfield_t)))) { 334 async_answer_0(&call, EINVAL); 335 async_answer_0(icall, EINVAL); 336 return; 337 } 338 339 rc = srv->srvs->ops->map(srv, cols, rows, &buf); 340 if (rc != EOK) { 341 async_answer_0(&call, rc); 342 async_answer_0(icall, rc); 343 return; 344 } 345 346 rc = async_share_in_finalize(&call, buf, AS_AREA_READ | 347 AS_AREA_WRITE | AS_AREA_CACHEABLE); 348 if (rc != EOK) { 349 srv->srvs->ops->unmap(srv); 350 async_answer_0(icall, EIO); 351 return; 352 } 353 354 async_answer_0(icall, EOK); 355 } 356 357 /** Delete shared buffer */ 358 static void con_unmap_srv(con_srv_t *srv, ipc_call_t *icall) 359 { 360 if (srv->srvs->ops->unmap == NULL) { 361 async_answer_0(icall, ENOTSUP); 362 return; 363 } 364 365 srv->srvs->ops->unmap(srv); 366 async_answer_0(icall, EOK); 367 } 368 369 /** Update console area from shared buffer */ 370 static void con_update_srv(con_srv_t *srv, ipc_call_t *icall) 371 { 372 sysarg_t c0, r0, c1, r1; 373 374 c0 = ipc_get_arg1(icall); 375 r0 = ipc_get_arg2(icall); 376 c1 = ipc_get_arg3(icall); 377 r1 = ipc_get_arg4(icall); 378 379 if (srv->srvs->ops->update == NULL) { 380 async_answer_0(icall, ENOTSUP); 381 return; 382 } 383 384 srv->srvs->ops->update(srv, c0, r0, c1, r1); 385 async_answer_0(icall, EOK); 386 } 387 309 388 static con_srv_t *con_srv_create(con_srvs_t *srvs) 310 389 { … … 412 491 con_get_event_srv(srv, &call); 413 492 break; 493 case CONSOLE_MAP: 494 con_map_srv(srv, &call); 495 break; 496 case CONSOLE_UNMAP: 497 con_unmap_srv(srv, &call); 498 break; 499 case CONSOLE_UPDATE: 500 con_update_srv(srv, &call); 501 break; 414 502 default: 415 503 async_answer_0(&call, ENOTSUP);
Note:
See TracChangeset
for help on using the changeset viewer.